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?
Der Fehler liegt in Zeile 42. Sollen wir dein Problem erraten? Poste Programm und Schaltplan. Und du nennst noch nicht mal das Display.
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).
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.
Ja ich weiß. Das wird demnächst auch richtig gemacht. Aber das sollte nichts an meinem Problem ändern, oder?
Es ändert vielleicht nichts am Problem aber macht die Sache nicht übersichtlicher. Und Übersicht sollte man haben wenn man den Code auf Fehler kontrolliert.
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.
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...
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.
bekommt deine Schaltung vom Programmer auch Betriebsspannung? Wie sieht deine Spannungsversorgung in der Schaltung selbst aus? Abblockkondensatoren eingebaut? Sascha
Ich nutze ein ausgebautes PC Netzteil, liefert 5,16V. Der µC hat 100nF zwischen den Beinen.
Frage 1 noch nicht beantwortet. evl. noch 100n am LCD! Wie sieht dein Aufbau aus - LP oder fliegend? Sascha
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.
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
Mit Google-Account einloggen
Noch kein Account? Hier anmelden.