Re: Probleme mit der LCD Ausgabe Kategorie: Programmierung C (von Peter S - 27.06.2005 11:32) | ||
Als Antwort auf Probleme mit der LCD Ausgabe von Frederik - 27.06.2005 2:52 | ||
| ||
Hallo Frederik, ich habe die Tastatureingabe ein bischen "getuned". Bitte die Funktion Irq_SetVect() nicht dauernd aufrufen, die Funktion setzt einen Interruptvektor auf eine Funktionsadresse, und braucht in diesem Programm nur EINMAL aufgerufen zu werden. Bei mir gibt es keine Abstürze mehr. Gruss Peter ----- korrigiertes Programm --- // 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 { 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 { 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 0: szZeile2 = "Drink10 "; break; 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; } Write(); for (i=0;i { 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] = ((aiZutaten[key_int])-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:24) Re: Probleme mit der LCD Ausgabe (von Frederik - 27.06.2005 18:26) Re: Probleme mit der LCD Ausgabe (von Frederik - 27.06.2005 18:01) |
Zur Übersicht - INFO - Neueste 50 Beiträge - Neuer Beitrag - Suchen - Zum C-Control-I-Forum - Zum C-Control-II-Forum