Kommentar: Einfügen von HTML im Kommentar: Link einfügen: <a href="LINKURL" target="_blank">LINKTITEL</a> Bild einfügen: <img src="BILDURL"> Text formatieren: <b>fetter Text</b> <i>kursiver Text</i> <u>unterstrichener Text</u> Kombinationen sind auch möglich z.B.: <b><i>fetter & kursiver Text</i></b> C Quellcode formatieren: <code>Quellcode</code> BASIC Quellcode formatieren: <basic>Quellcode</basic> (Innerhalb eines Quellcodeabschnitts ist kein html möglich.) Wichtig: Bitte mache Zeilenumbrüche, bevor Du am rechten Rand des Eingabefeldes ankommst ! -> I > 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<MaxZutaten;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<MaxZutaten;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 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<MaxZutaten;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] = ((aiZutaten[key_int])-1)*(-1); > > AbsDelay(Verzoegerung); > } > } while ((key_int<1)||(key_int>8)); > } > }while(true); > }