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?
1
intmain(void)
2
{
3
4
lcd_init();
5
6
Timer2();
7
8
sei();
9
10
lcd_clear();
11
12
while(Begruessung==0)
13
{
14
lcd_setcursor(0,0);
15
lcd_string("Temp.bestimmung ");
16
lcd_setcursor(0,1);
17
lcd_string("von Heizplatten ");
18
19
_delay_ms(5000);
20
Begruessung=1;
21
}
22
23
lcd_clear();
24
25
while(Auswahl_OK==0)
26
{
27
Auswahl_Spannung();
28
}
29
30
Auswahl_OK=0;
31
32
lcd_clear();
33
34
while(1)
35
{
36
lcd_setcursor(0,0);
37
lcd_string("Temp.bestimmung ");
38
lcd_setcursor(0,1);
39
lcd_string("Messen Option");
40
41
42
if(Taste_x1==1)
43
{
44
lcd_clear();
45
46
Taste_x1=0;
47
48
while(Taste_x1==0)
49
{
50
lcd_setcursor(0,0);
51
lcd_string(" V I °C");
52
53
if(U_230V==1)
54
{
55
lcd_setcursor(0,1);
56
lcd_string("Zurueck! 230V");
57
}
58
59
if(U_400V==1)
60
{
61
lcd_setcursor(0,1);
62
lcd_string("Zurueck! 400V");
63
}
64
}
65
66
lcd_clear();
67
68
Taste_x1=0;
69
}
70
71
if(Taste_x3==1)
72
{
73
Taste_x3=0;
74
75
lcd_clear();
76
77
while(Auswahl_OK==0)
78
{
79
Auswahl_Spannung();
80
}
81
82
Auswahl_OK=0;
83
84
lcd_clear();
85
}
86
}
87
}
88
89
90
ISR(TIMER2_OVF_vect)
91
92
{
93
94
--Interruptzeit;// Interruptzeit 900*0,1111ms=0,1s bis Tastenabfrage kommt
Hallo Asp,
wenn das jemand compilieren will geht das nicht, vieles fehlt !
Was ist z.B. das U_230V ?
welchen Sinn hat diese Struktur ?
1
while(Begruessung==0)
2
{
3
lcd_setcursor(0,0);
4
lcd_string("Temp.bestimmung ");
5
lcd_setcursor(0,1);
6
lcd_string("von Heizplatten ");
7
8
_delay_ms(5000);
9
Begruessung=1;
10
}
Der C Code ist mir schon klar, aber das while() { } darum.
Du gibst auch laufend diese Zeilen aus:
1
lcd_setcursor(0,0);
2
lcd_string("Temp.bestimmung ");
3
lcd_setcursor(0,1);
4
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.
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.
@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.
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).