Datum:
Hallo ;) Ich habe ein DEM16216A Display. Habe die LCD-Library aus dem LCD-Tutorial genommen und es funktioniert soweit. Ich habe jetzt eine Menüstruktur aufgebaut, die ich mit Hilfe von 3 Tastern bediene. Solange ich durch die Menüs switche, funkioniert alles WUNDERBAR! Bleibe ich aber längere Zeit (ca. 1min) in dem selben Menüpunkt, "stürzt" mein Display iwie ab. Die untere Zeile wird dabei gelöscht und der Text, der zuvor in der oberen Zeile stand, steht noch dort, allerdings viel Schwächer und mit leicht grauen Blöcken. Ich kann dann auch meine Taster nicht mehr richtig benutzen... Weiß jmd woran das liegen könnte?
int main(void) { lcd_init(); Timer2(); sei(); lcd_clear(); while(Begruessung==0) { lcd_setcursor(0,0); lcd_string("Temp.bestimmung "); lcd_setcursor(0,1); lcd_string("von Heizplatten "); _delay_ms(5000); Begruessung=1; } lcd_clear(); while(Auswahl_OK==0) { Auswahl_Spannung(); } Auswahl_OK=0; lcd_clear(); while(1) { lcd_setcursor(0,0); lcd_string("Temp.bestimmung "); lcd_setcursor(0,1); lcd_string("Messen Option"); if(Taste_x1==1) { lcd_clear(); Taste_x1=0; while(Taste_x1==0) { lcd_setcursor(0,0); lcd_string(" V I °C"); if(U_230V==1) { lcd_setcursor(0,1); lcd_string("Zurueck! 230V"); } if(U_400V==1) { lcd_setcursor(0,1); lcd_string("Zurueck! 400V"); } } lcd_clear(); Taste_x1=0; } if(Taste_x3==1) { Taste_x3=0; lcd_clear(); while(Auswahl_OK==0) { Auswahl_Spannung(); } Auswahl_OK=0; lcd_clear(); } } } ISR (TIMER2_OVF_vect) { --Interruptzeit; // Interruptzeit 900*0,1111ms=0,1s bis Tastenabfrage kommt if(Interruptzeit==0) { Interruptzeit=900; Tastenabfrage(); } } |
Danke euch :)
Datum:
Hallo Asp, wenn das jemand compilieren will geht das nicht, vieles fehlt ! Was ist z.B. das U_230V ? welchen Sinn hat diese Struktur ?
while(Begruessung==0) { lcd_setcursor(0,0); lcd_string("Temp.bestimmung "); lcd_setcursor(0,1); lcd_string("von Heizplatten "); _delay_ms(5000); Begruessung=1; } |
Der C Code ist mir schon klar, aber das while() { } darum.
Du gibst auch laufend diese Zeilen aus:lcd_setcursor(0,0); lcd_string("Temp.bestimmung "); lcd_setcursor(0,1); lcd_string("Messen Option"); |
Das macht doch keinen Sinn 100.000 pro Sekunde ! Ich denke Du musst Dir alle Zustände deiner Anwendung als Diagramm aufzeichnen, dann lässt sich eine Zustandsmachine daraus ableiten.
Datum:
if(Taste_x1==1)
{
lcd_clear();
Taste_x1=0;
while(Taste_x1==0)
Unsinniger Code ?
Wäre Taste_x1 volatile, würde die Zuweisung keinen Sinn machen.
Deine Programmstruktur führt zu solchen Stilblüten.
Beu eine Programmschleife die 100 mal pro Sekunde rumläuft.
while(1)
{
...
delay_ms(10);
}
Füge in diese einen Zustand ein
while(1)
{
switch(zustand)
{
case 1:
...
case 2:
...
}
delay_ms(10);
}
Frage EIN MAL den aktuellen Tastenzustand aller Tasten ab
while(1)
{
tasten=PINB; // oder woher auch immer, vielleicht invertiert
gedrueckt=tasten&~gedrückt;
switch(zustand)
{
case 1:
if(gedrückt&UP_KEY) zustand=2; // oder so
...
case 2:
...
}
delay_ms(10);
gedrueckt=tasten;
}
und bau nur bei relevanten Zustandswecheln Ausgaben ein
while(1)
{
tasten=PINB; // oder woher auch immer, vielleicht invertiert
gedrueckt=tasten&~gedrückt;
switch(zustand)
{
case 1:
if(gedrückt&UP_KEY)
{
lcd_setcursor(0,1);
lcd_string("Zurueck!"); // wasauchimmer
zustand=2; // oder so
}
break;
case 2:
...
}
delay_ms(10);
gedrueckt=tasten; // entprellt automatisch dank delay
}
Wenn du versuchst, Zustand und Zeit, Messen und Menüausgabe,
Interrupts und Normalprogramm zu vermischen, geht das
früher oder später immer in die Hose.
Datum:
@Uwe Das U_230V ist BOOL und einfach nur eine Einstellung, die später, wenn das Programm mal komplett fertig ist, dazu verwendet wird, die korrekte Rechenformel zu benutzen. Da ich, je nach Einstellung, eine Formel für 230V und für 400V verwenden werde. Und du hast recht, es ist bissl sinnlos, 100000mal pro Sekunde das Display zu beschreiben. Ich werde es gleich mal anders versuchen. @Mawin Du meinst "Taste_x1=0" ist sinnlos? Aber bei mir ist nach dem Drücken "Taste_x1=1" und bleibt dies auch, bis es mit Hilfe des Codes zurückgesetzt wird. Meine Tasten werden übrigens alle 100ms durch die ISR abgefragt, das ist doch soweit in Ordnung oder? Das mit der Switch-Case-Struktur werde ich mal machen. Scheint für mein Projekt sowieso recht hilfreich zu sein.
Datum:
Du meinst, Taste_x1 wird durch eine Interrupt-Funktion gesetzt wenn erkannte wurde , daß die tatsächliche Taste runtergrdrückt wurde, und muß vom Programm wenn es sie bearbeitet hat zurückgesetzt werden ? Ok. Aber achte darauf, daß diese Interrupt-Routine nicht den Zustand von Taste_x1 benutzt, um zu erkennen, ob sie zuletzt nicht gedrückt war und erst jetzt gedrückt wird, sondern dafür eine eigenen Variable hat (wenn das jetzt verständlich ausgedrückt war).