Zur Übersicht - INFO - Neueste 50 Beiträge - Neuer Beitrag - Suchen - Zum C-Control-I-Forum - Zum C-Control-II-Forum

Re: Probleme mit der LCD Ausgabe Kategorie: Programmierung C (von Frederik - 27.06.2005 18:24)
Als Antwort auf Re: Probleme mit der LCD Ausgabe von Peter S - 27.06.2005 11:32
Ich nutze:
C-Control Pro Mega32, CC-Pro 32 Application Board
Ok... hier nochmal die aktualisierte Version meines Programms... hab eure Ratschläge befolgt, und es ist
wirklich besser geworden... aber 2 Fehler treten immer noch auf:

1. Bei Eingabe 7 bei den Cocktails, dauert es eine ganze Weile bis etwas passiert
2. Bei Eingabe 9 wird Speicherschrott auf dem Bildschirm ausgegeben

Wäre nett wenn ihr nochmal drüber gucken könntet! Bis hier hin nochmal vielen Dank!

// Steuerprogramm des Cocktailmixers
// TUTOR-Gruppe Goldt (TUM 2004/2005)
// Erstellt von Frederik Born am 26.06.2005
// ----------------------------------------------------------------------------------
//

// Defines
// ----------------------------------------------------------------------------------
//

#define MaxZutaten 8                        // Anzahl anschlieÃ?barer Zutaten
#define MaxCocktails 10                     // Anzahl mixbarer Cocktails
#define PortC 2
#define Verzoegerung 500                    // Standartverzögerung in ms

// Globale Variablen
// ----------------------------------------------------------------------------------
//

int aiZutaten[MaxZutaten];                  // Speichert Vorhandensein von Zutaten
int aiCocktails[MaxCocktails][MaxZutaten];  // Speichert die Rezepte
int key_int;

word key_in;                                // Eingabe von Tastatur

char key_char;                              // Eingabe von Tastatur in ASCI
char szZeile1[12];                          // Speicher für LCD-Ausgabe Zeile1
char szZeile2[12];                          // Speicher für LCD-Ausgabe Zeile2

// Funktionsdeklaration
// ----------------------------------------------------------------------------------
//

void Write(void) {
// Schreibt den Inhalt von szZeile1/2 in Zeile1/2 des LCD Displays

    LCD_ClearLCD();                         // Display löschen
    LCD_CursorOff();                        // Display Cursor ausschalten
    LCD_TestBusy();
    LCD_CursorPos(0);                       // LCD Cursor positionieren
    LCD_WriteText(szZeile1);                // String Zeile1 ausgeben
    LCD_CursorPos(0x40);                    // LCD Cursor auf 2.Zeile positionieren
    LCD_WriteText(szZeile2);                // String Zeile2 ausgeben
}

void INT_10ms(void) {
// Tastaturabfrage alle 10ms

    key_in=Key_Scan();                      // Tastatureingabe wird gelesen
    Irq_GetCount(INT_TIM2COMP);     // Interrupt Acknowledge
}

void getKey(void) {
// Speichert eine Eingabe in der globalen Variablen key_ch

    while (!key_in);                   // Bis Eingabe erfolgt
    key_char=Key_TranslateKey(key_in);      // Eingabe wird in ASCII Zeichen umgewandelt

    key_int=key_char-'0';
    if(key_int<0 || key_int>9) key_int= -1;
}


int ClToMs(int iZutatIndex,int iCl) {
// Rechnet die Angaben in Cl der Rezepte in ms für die �ffnung der Relais um

    int iMs;

    switch (iZutatIndex) {
       case 0: iMs = iCl * 10;             // Zutat1
               break;
       case 1: iMs = iCl * 10;             // Zutat2
               break;
       case 2: iMs = iCl * 10;             // Zutat3
               break;
       case 3: iMs = iCl * 10;             // Zutat4
               break;
       case 4: iMs = iCl * 10;             // Zutat5
               break;
       case 5: iMs = iCl * 10;             // Zutat6
               break;
       case 6: iMs = iCl * 10;             // Zutat7
               break;
       case 7: iMs = iCl * 10;             // Zutat8
               break;
    }

    return iMs;
}

void OeffneRelais(int iZutatenIndex,int iCl) {
// �ffnet das Relais für eine Dauer von iDauer ms
   int Delay;

   Delay = ClToMs(iZutatenIndex,iCl);

   Port_WriteBit((16+iZutatenIndex),1);
   AbsDelay(Delay);
   Port_Write(PortC,0);
}

void initZutaten(void) {
// Fragt das Vorhandensein der Zutaten vom Benutzer ab und schreibt 0/1 in aiZutaten

   int i;

   for (i=0;i         switch(i)
        {
            case 0:      szZeile1 = "Zutat1";
                         break;
            case 1:      szZeile1 = "Zutat2";
                         break;
            case 2:      szZeile1 = "Zutat3";
                         break;
            case 3:      szZeile1 = "Zutat4";
                         break;
            case 4:      szZeile1 = "Zutat5";
                         break;
            case 5:      szZeile1 = "Zutat6";
                         break;
            case 6:      szZeile1 = "Zutat7";
                         break;
            case 7:      szZeile1 = "Zutat8";
                         break;
        }
        szZeile2 = "(0/1):  ";
        Write();

        getKey();

        if ((key_int<0)||(key_int>1))
        {
            szZeile1 = "Falsche";
            szZeile2 = "Eingabe";

            Write();

            AbsDelay(Verzoegerung);
            i--;
        }
        else
        {
            szZeile2[7] = key_char;
            Write();

            aiZutaten[i] = key_int;

            AbsDelay(Verzoegerung);
        }
   }
}

void initCocktails(void) {
// Füllt aiCocktails mit den Rezepten

     // Drink1
       aiCocktails[1][0] = 0;               // Zutat1
       aiCocktails[1][1] = 1;               // Zutat2
       aiCocktails[1][2] = 0;               // Zutat3
       aiCocktails[1][3] = 0;               // Zutat4
       aiCocktails[1][4] = 5;               // Zutat5
       aiCocktails[1][5] = 0;               // Zutat6
       aiCocktails[1][6] = 8;               // Zutat7
       aiCocktails[1][7] = 0;               // Zutat8
     // Drink2
       aiCocktails[2][0] = 1;               // Zutat1
       aiCocktails[2][1] = 8;               // Zutat2
       aiCocktails[2][2] = 4;               // Zutat3
       aiCocktails[2][3] = 0;               // Zutat4
       aiCocktails[2][4] = 0;               // Zutat5
       aiCocktails[2][5] = 0;               // Zutat6
       aiCocktails[2][6] = 0;               // Zutat7
       aiCocktails[2][7] = 0;               // Zutat8
     // Drink3
       aiCocktails[3][0] = 6;               // Zutat1
       aiCocktails[3][1] = 6;               // Zutat2
       aiCocktails[3][2] = 6;               // Zutat3
       aiCocktails[3][3] = 6;               // Zutat4
       aiCocktails[3][4] = 0;               // Zutat5
       aiCocktails[3][5] = 0;               // Zutat6
       aiCocktails[3][6] = 0;               // Zutat7
       aiCocktails[3][7] = 0;               // Zutat8
     // Drink4
       aiCocktails[4][0] = 0;               // Zutat1
       aiCocktails[4][1] = 0;               // Zutat2
       aiCocktails[4][2] = 0;               // Zutat3
       aiCocktails[4][3] = 0;               // Zutat4
       aiCocktails[4][4] = 5;               // Zutat5
       aiCocktails[4][5] = 6;               // Zutat6
       aiCocktails[4][6] = 6;               // Zutat7
       aiCocktails[4][7] = 9;               // Zutat8
     // Drink5
       aiCocktails[5][0] = 0;               // Zutat1
       aiCocktails[5][1] = 2;               // Zutat2
       aiCocktails[5][2] = 0;               // Zutat3
       aiCocktails[5][3] = 4;               // Zutat4
       aiCocktails[5][4] = 0;               // Zutat5
       aiCocktails[5][5] = 6;               // Zutat6
       aiCocktails[5][6] = 0;               // Zutat7
       aiCocktails[5][7] = 8;               // Zutat8
     // Drink6
       aiCocktails[6][0] = 0;               // Zutat1
       aiCocktails[6][1] = 0;               // Zutat2
       aiCocktails[6][2] = 4;               // Zutat3
       aiCocktails[6][3] = 0;               // Zutat4
       aiCocktails[6][4] = 0;               // Zutat5
       aiCocktails[6][5] = 4;               // Zutat6
       aiCocktails[6][6] = 0;               // Zutat7
       aiCocktails[6][7] = 0;               // Zutat8
     // Drink7
       aiCocktails[7][0] = 6;               // Zutat1
       aiCocktails[7][1] = 0;               // Zutat2
       aiCocktails[7][2] = 0;               // Zutat3
       aiCocktails[7][3] = 6;               // Zutat4
       aiCocktails[7][4] = 0;               // Zutat5
       aiCocktails[7][5] = 7;               // Zutat6
       aiCocktails[7][6] = 0;               // Zutat7
       aiCocktails[7][7] = 0;               // Zutat8
     // Drink8
       aiCocktails[8][0] = 0;               // Zutat1
       aiCocktails[8][1] = 0;               // Zutat2
       aiCocktails[8][2] = 0;               // Zutat3
       aiCocktails[8][3] = 5;               // Zutat4
       aiCocktails[8][4] = 0;               // Zutat5
       aiCocktails[8][5] = 0;               // Zutat6
       aiCocktails[8][6] = 9;               // Zutat7
       aiCocktails[8][7] = 9;               // Zutat8
    // Drink9
       aiCocktails[9][0] = 0;               // Zutat1
       aiCocktails[9][1] = 3;               // Zutat2
       aiCocktails[9][2] = 0;               // Zutat3
       aiCocktails[9][3] = 0;               // Zutat4
       aiCocktails[9][4] = 3;               // Zutat5
       aiCocktails[9][5] = 0;               // Zutat6
       aiCocktails[9][6] = 6;               // Zutat7
       aiCocktails[9][7] = 9;               // Zutat8
     // Drink10
       aiCocktails[0][0] = 8;               // Zutat1
       aiCocktails[0][1] = 5;               // Zutat2
       aiCocktails[0][2] = 0;               // Zutat3
       aiCocktails[0][3] = 0;               // Zutat4
       aiCocktails[0][4] = 0;               // Zutat5
       aiCocktails[0][5] = 0;               // Zutat6
       aiCocktails[0][6] = 0;               // Zutat7
       aiCocktails[0][7] = 7;               // Zutat8
}

int PruefeCocktail(int iCocktailIndex) {
// Prüft ob alle Zutaten vorhanden sind

    int i;

    for(i=0;i         if ((aiCocktails[iCocktailIndex][i] != 0)&&(aiZutaten[i] == 0))
        {
            return(0);                      // Abbruch
            break;
        }
    }

    return(1);
}

int MixeCocktail(int iCocktailIndex) {
// Prüft Zutaten über PruefeCocktail und öffent dann Relais gemä� Rezept

    int i,iTest;

    iTest = PruefeCocktail(iCocktailIndex);

    if (iTest == 0)                        // Nicht mixbar
    {
        return(-1);
    }
    else                                   // Mixe Cocktail
    {
        szZeile1 = "Mixe";
        switch (iCocktailIndex) {
            case 1: szZeile2 = "Drink1";
                    break;
            case 2: szZeile2 = "Drink2";
                    break;
            case 3: szZeile2 = "Drink3";
                    break;
            case 4: szZeile2 = "Drink4";
                    break;
            case 5: szZeile2 = "Drink5";
                    break;
            case 6: szZeile2 = "Drink6";
                    break;
            case 7: szZeile2 = "Drink7";
                    break;
            case 8: szZeile2 = "Drink8";
                    break;
            case 9: szZeile2 = "Drink9";
                    break;
            case 0: szZeile2 = "Drink10";
                    break;
        }

        Write();

        for (i=0;i             if (aiCocktails[iCocktailIndex][i]>0)
            {
                OeffneRelais(i,aiCocktails[iCocktailIndex][i]);
            }
        }
        return(1);
    }
}
// Hauptprogramm
// ----------------------------------------------------------------------------------
//

void main(void) {
    int iTest;

    LCD_Init();                             // Display initialisieren
    Key_Init();                             // Tastatur initialisieren
    Irq_SetVect(INT_TIM2COMP,INT_10ms);
    Port_DataDir(PortC,0xFF);               // Einrichtung PortC: 0=in, 1=out

    initCocktails();
    initZutaten();

    do
    {
        szZeile1 = "Cocktail";
        szZeile2 = "Nr.:";

        Write();

        getKey();

        if((key_int>=0)&&(key_int<=9)) {
            szZeile2[7] = key_char;
            Write();

            iTest =MixeCocktail(key_int);

            if (iTest == 1) {
                szZeile1 = "Guten";
                szZeile2 = "Durst";
            }
            else
            {
                szZeile1 = "Zutat";
                szZeile2 = "fehlt";
            }

            Write();
            AbsDelay(Verzoegerung);
        }
        if(key_char == '#')                 // Alle Zutaten neu Eingeben
        {
           szZeile1 = "Zutaten";
           szZeile2 = "Reset";

           Write();
           AbsDelay(Verzoegerung);

           initZutaten();
        }
        if(key_char == '*')                 // Den Wert einerZutat tauschen
        {
           do
           {
               szZeile1 = "Zutat";
               szZeile2 = "Nr.:";

               Write();

               AbsDelay(Verzoegerung);

               getKey();

               if ((key_int<1)||(key_int>8))
               {
                   szZeile1 = "Falsche";
                   szZeile2 = "Eingabe";

                   Write();

                   AbsDelay(Verzoegerung);
               }
               else
               {
                   szZeile2[7] = key_char;
                   Write();

                   aiZutaten[key_int-1] = ((aiZutaten[key_int-1])-1)*(-1);

                   AbsDelay(Verzoegerung);
               }
           } while ((key_int<1)||(key_int>8));
        }
    }while(true);
}


    Antwort schreiben


Antworten:

Re: Probleme mit der LCD Ausgabe (von Frederik - 27.06.2005 18:26)