Forum: Compiler & IDEs Display "stürzt" nach einiger Zeit ab


von Asp (Gast)


Lesenswert?

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
int main(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
95
96
97
  if(Interruptzeit==0)
98
  
99
  {
100
    Interruptzeit=900;
101
    Tastenabfrage();
102
  }
103
104
}

Danke euch :)

von Uwe (de0508)


Lesenswert?

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.

von MaWin (Gast)


Lesenswert?

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.

von Asp (Gast)


Lesenswert?

@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.

von MaWin (Gast)


Lesenswert?

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).

Bitte melde dich an um einen Beitrag zu schreiben. Anmeldung ist kostenlos und dauert nur eine Minute.
Bestehender Account
Schon ein Account bei Google/GoogleMail? Keine Anmeldung erforderlich!
Mit Google-Account einloggen
Noch kein Account? Hier anmelden.