Forum: Mikrocontroller und Digitale Elektronik GLCD hängt sich nach einer Weile auf


von Stephan M. (multimeter90)


Lesenswert?

Hallo Leute,

ich weiß leider nicht mehr weiter. Ich habe ein grafisches Display, 
160x160 Pixel. Mein Problem ist, dass das Display nach einer Weile 
nichts mehr tut.

Im Moment habe ich nur eine Endlosschleife, in der ich

   - 250ms Warten
   - Rote LED togglen
   - Display Löschen
   - Ein Byte setze

Alles funktioniert super, das Display wird gelöscht, neu beschrieben, 
toll. Nach vielleicht 10 Sekunden wird aber nichts mehr auf das Display 
geschrieben, nach dem es gelöscht wurde... es bleibt dann einfach leer.

Der Mikrocontroller läuft aber normal weiter: In einer ISR wird aller 
500ms eine gelbe LED getoggled, in der Hauptschleife die Rote, beide 
blinken fröhlich für sich weiter. Das bedeutet ja, dass der 
Mikrocontroller nirgends hängen bleibt.

Woran kann das nur liegen?

von 1234 (Gast)


Lesenswert?

Der Fehler liegt in Zeile 42.
Sollen wir dein Problem erraten?


Poste Programm und Schaltplan. Und du nennst noch nicht mal das Display.

von Stephan M. (multimeter90)


Angehängte Dateien:

Lesenswert?

Hier sind die wichtigen Programmdateien. Zum Abfragen der Taster habe 
ich die Variante von Timer-Verfahren (nach Peter Dannegger) aus dem Wiki 
hier genommen im Artikel Entprellung.

Das LCD hat einen LC7981 Treiber IC, Datenblatt ist auch im Anhang.

Was mir auch aufgefallen ist: Das Problem lässt sich nur reproduzieren, 
wenn der Programmer nicht angeschlossen ist. Controller ist ein PIC 
18F4685 und als Programmer nutze ich den ICD2 (falls das was hilft).

von Stephan M. (multimeter90)


Lesenswert?

Auch ein minimales löschen und setzten

1
while(TRUE){
2
  Delay1ms(100);
3
  LED_RT ^= 1;
4
  LCD_Clear();
5
  Delay1ms(10);
6
  LCD_SetCursor(0,0);
7
  LCD_SendData(LCD_CMD_WRITE_DATA, 0b10000000);
8
}

funktioniert so ein paar Sekunden, danach bleibt das Display wieder 
leer.

von troll (Gast)


Lesenswert?

In Headerdateien gehört kein Code!

von Stephan M. (multimeter90)


Lesenswert?

Ja ich weiß. Das wird demnächst auch richtig gemacht. Aber das sollte 
nichts an meinem Problem ändern, oder?

von troll (Gast)


Lesenswert?

Es ändert vielleicht nichts am Problem aber macht die Sache nicht 
übersichtlicher. Und Übersicht sollte man haben wenn man den Code auf 
Fehler kontrolliert.

von Stephan M. (multimeter90)


Lesenswert?

Ja stimmt schon. Ich habs am Anfang immer so gemacht. Alles in 
Header-Files und die in mein C-File rein. Ich habe es mir eigentlich 
vorgenommen es dieses mal richtig zu machen, aber dann hat es irgendwie 
nicht funktionieren wollen mit c und h dateien und da bin ich wieder auf 
die unschöne und unübersichtliche Variante ausgewichen.

Wenn ich das Problem mit dem Display geklärt habe, dann schreib ich 
alles um, versprochen. Ich nehms mir ja wie gesagt auch immer vor...


Könnte das bei dem Display ein Timing Problem sein? Mir ist es nur 
völlig rätselhaft, warum ich den Fehler nicht bekomme, wenn das 
Programmiergerät dran hängt.

von troll (Gast)


Lesenswert?

Stephan Meter schrieb:
> Könnte das bei dem Display ein Timing Problem sein?
Ich hatte
1
 /* Wait until LCD is idle */
2
void LCDWait4Idle(void){
3
  Delay10TCYx(10);
4
}
im Verdacht, das ist ja nur ein simples Delay und damit u.U. mal zu 
kurz. Hat das LCD kein Busyflag was man abfragen könnte?

Aber das hier
> Mir ist es nur
> völlig rätselhaft, warum ich den Fehler nicht bekomme, wenn das
> Programmiergerät dran hängt.
kann ich auch nicht erklären...

von Stephan M. (multimeter90)


Lesenswert?

Ja das Display hat ein Busy Flag, was man abfragen könnte. Aber ich habe 
schon oft gesehen, dass da 3us gewartet wurde... Ich habe das Delay auch 
schon länger gemacht, hat aber auch nichts gebracht. Leider.

von Sascha W. (sascha-w)


Lesenswert?

bekommt deine Schaltung vom Programmer auch Betriebsspannung?
Wie sieht deine Spannungsversorgung in der Schaltung selbst aus? 
Abblockkondensatoren eingebaut?

Sascha

von Stephan M. (multimeter90)


Lesenswert?

Ich nutze ein ausgebautes PC Netzteil, liefert 5,16V. Der µC hat 100nF 
zwischen den Beinen.

von Sascha W. (sascha-w)


Lesenswert?

Frage 1 noch nicht beantwortet.
evl. noch 100n am LCD! Wie sieht dein Aufbau aus - LP oder fliegend?

Sascha

von Stephan (Gast)


Lesenswert?

Aufbau ist im Moment fliegend. Ich habe noch einen 100µF Elko dazu 
geklemmnt, nur um sicher zu gehen.
Wenn ich wieder an meinem Schreibtisch bin, werde ich mal schauen, ob es 
mit der Reset leitung zusammen hängt. Die Reset Leitung des LCDs habe 
ich die Reset Leitung des µC gehängt. Die wird vom Programmiergerät 
sauber auf 0 gezogen, oder auf 5V gesetzt. Ohne Programmer macht das ein 
pull up von 15k in Reihe zu einer 1N4148. Eventuell liegt es daran? 
Werde mal die Resetleitung an einen IO Pin hängen.

Ich kann sonst noch sagen, dass, wenn ich das LCD ne Weile laufen lasse, 
und es dann stehen bleibt ich es erneut initialisieren kann und es dann 
wieder für ein paar Sekunden läuft.

von Stephan M. (multimeter90)


Lesenswert?

So, ich habe mir übers WE endlich mal Mühe gegeben und das Programm 
modularisirt. Im Anhang sind nun nochmal die wichtigsten Dateien.

Außerdem habe ich gerade eben die Reset Leitung des gLCD an einen Pin 
des µC gehangen und in der Software auf High gelegt. Bis jetzt konnte 
ich kein Aufhängen mehr feststellen. Wahrscheinlich lag es wirklich an 
der Flussspannung der 1N4148. Das Programmiergerät hat die Resetleitung 
immer sauber auf 0V oder 5V gezogen, ohne Programmer lag es so aber 
immer nur auf 4,6V. Für den µC reicht das wahrscheinlich aus, das LCD 
mag es wohl nicht.

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.