www.mikrocontroller.net

Forum: GCC Display "stürzt" nach einiger Zeit ab


Important announcement: there is an English version of this forum on EmbDev.net. Posts you create there will be displayed on Mikrocontroller.net and EmbDev.net.
Autor: Asp (Gast)
Datum:

Diesen Beitrag bewerten:
lesenswert
nicht 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?
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 :)

Autor: Uwe S. (de0508)
Datum:

Diesen Beitrag bewerten:
lesenswert
nicht 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 ?
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.

Autor: MaWin (Gast)
Datum:

Diesen Beitrag bewerten:
lesenswert
nicht 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.

Autor: Asp (Gast)
Datum:

Diesen Beitrag bewerten:
lesenswert
nicht 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.

Autor: MaWin (Gast)
Datum:

Diesen Beitrag bewerten:
lesenswert
nicht 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).

Antwort schreiben

Die Angabe einer E-Mail-Adresse ist freiwillig. Wenn Sie automatisch per E-Mail über Antworten auf Ihren Beitrag informiert werden möchten, melden Sie sich bitte an.

Wichtige Regeln - erst lesen, dann posten!

  • Groß- und Kleinschreibung verwenden
  • Längeren Sourcecode nicht im Text einfügen, sondern als Dateianhang

Formatierung (mehr Informationen...)

  • [c]C-Code[/c]
  • [avrasm]AVR-Assembler-Code[/avrasm]
  • [code]Code in anderen Sprachen, ASCII-Zeichnungen[/code]
  • [math]Formel in LaTeX-Syntax[/math]
  • [[Titel]] - Link zu Artikel




Bitte das JPG-Format nur für Fotos und Scans verwenden!
Zeichnungen und Screenshots im PNG- oder GIF-Format hochladen.
Siehe Bildformate
Hinweis: der ursprüngliche Beitrag ist mehr als 6 Monate alt.
Bitte hier nur auf die ursprüngliche Frage antworten,
für neue Fragen einen neuen Beitrag erstellen.

Mit dem Abschicken erkennst du die Nutzungsbedingungen an.

webmaster@mikrocontroller.netImpressumNutzungsbedingungenWerbung auf Mikrocontroller.net