Moin,
ich habe ein LCD mit ST7066U-Controller. Entweder nach dem Programmieren
oder aber nach dem Einschalten der Versorgungsspannung wird das Display
initialisiert und "Hello World!" erscheint. Alles gut und auch
reproduzierbar.
Das Timing entspricht den Angaben im Dateblatt wobei ich immer etwas
größere Wartezeiten verwende. Also anstelle von 37 us sind es 50 us und
anstelle von 1.52 ms sind es 2 ms.
Durch Zufall habe ich folgenden Effekt entdeckt. Drücke ich Reset, dann
erscheinen nur noch irgendwelche Symbole anstelle meines Textes.
Drücke ich noch einmal Reset, dann erscheint wieder "Hello World!". Das
Spiel kann man so weitertreiben.
Hat eventuell jemand eine andere bulletproof-Initialisierungssequenz?
Holger
Au jahaaa fein, ein Ratespielchen!
Ich rate mal: Display wird im 4-Bit-Modus angesprochen? Wenn ja, sende
ganz zu Anfang dreimal das Kommando zum Initialisieren im 8-Bit-Modus,
danach einmal zum Initialisieren im 4-Bit-Modus.
Holger schrieb:> Hat eventuell jemand eine andere bulletproof-Initialisierungssequenz?
Oft twird geflissentlich übersehen dass ein LCD eine beachtliche
Zeit beim Power-Up braucht bis es ansprechbar ist (diese Zeit steht
im Datenblatt...). Wird nun während dieser Zeit die Initialisierungs-
Sequenz geschickt (während dessen keine Statusabfrage, also kein
Handshake mit Read/Write möglich ist) läuft diese ins Leere.
Ein Poer-Up Reset ist nun mal aus der Sicht des LCDs anders als
ein User-Reset ....
Bei mir steht am Anfang jeder Init:
1
_delay_ms(100);/* 40 ms needed for Vcc = 2.7 V */
Your mileage may vary (alter Spruch eines weisen Franzosen).
Moin,
nach der entsprechenden Initialisierung drr Portpins wartet das Programm
500 ms, bevor es in doe LCD-Init-Routine geht. Es ist richtig, dass der
4-Bit-Modus verwendet wird. Ein mehrmaliges senden von 3h bringt nichts.
Das steht ja auch nicht im Datenblatt so drin. Dann funktiniert das
Display auch nicht mehr beim anlegen der Betriebsspannung.
@Frickelfritze
Du hast schon gesehen, dass es ein Üroblem beim Prozessor-Reset gibt und
nicht beim anlegen der Betriebsspannung?
Es sieht wohl so aus, dass ein bereits initialisiertes Display bei einer
erneuten Initialisierung Probleme macht.
Holger
Hallo,
das Problem hatte ich auch schon mit einigen Displays. Ursache ist, daß
das Problem ja im 4Bit-Mode ist und auch bleibt. Es gibt da keinen
offiziellen Rückweg.
Damit läuft die normale Initialisierung gegen die Wand, weil die
Kommandos ja bereits als 4Bit-Kommandos interpretiert werden.
Einige Hersteller auch des HD44780 hatten mal eine Soft-Rest Angabe in
ihren Datenblättern, die ging manchmal auch mit anderen Kontrollern, ich
finde das aber gerade nicht mehr und in meinem Datenblatt des ST7066U
steht dazu auch nichts.
Gruß aus Berlin
Michael
Holger schrieb:> Ein mehrmaliges senden von 3h bringt nichts.> Das steht ja auch nicht im Datenblatt so drin.
Du hast Recht.
Von mehrmaigen Senden einer 0x3 steht nichts drin.
Vom dreimaligen Senden einer 0x3 aber schon.
Siehe auch Flussdiagramm aus dem Datenblatt des HD44780.
Hallo,
@Frickelfritze: genau dieser Ablauf gilt aber nur nach PowerOn, wenn das
Display im 8Bit-Mode ist.
Sein Display ist aber bei einem Rest des AVR bereits im 4Bit-Mode und
interpretiert das damit einfach falsch.
Aus den ersten beiden 0x3 werden vermutlich 4Bit 0x33 und dann bleibt
ein unvollständiger 4Bit-Zugriff mit 0x3 übrig. Vermutlich deshalb
sortiert es sich nach dem 2. Reset dann auch wieder.
Vielleicht könnte man den ST0066 vor der 0x3 Initialisierung einfach
einmal
gleich FunctionSet auf 8Bit senden, wenn er noch nicht initialisiert
wurde dürfte er das ignorieren und wenn doch dann schaltet er zurück auf
8Bit und die normale Sequenz dürfte greifen.
Gruß aus Berlin
Michael
Moin,
dann könnte ich ja einfach mal zum Programmstart die Spannungsversorgung
des LCD unterbrechen. Dann müsste ja alles wieder einwandfrei
funktionieren.
Ich habe übrigens mal die HD44870-Standardroutinen probiert. Damit läuft
das Display überhaupt nicht!
Holger
Michael U. schrieb:> @Frickelfritze: genau dieser Ablauf gilt aber nur nach PowerOn, wenn das> Display im 8Bit-Mode ist.
Nein, er funktioniert immer.
Wenn ich mein Display einmal gestartet habe kann ich die
Initialisierungs-Sequenz unverändert immer wieder (z.B. nach einem
Prozesor-Reset) ausführen ohne dass das Display zickt.
Ist auch daran erkennbar dass das Kommando-Byte 0011xxxx sonst
nicht im Befehlssatz vorkommt. Man beachte C/D.
Es wäre auch Schwachsinn wenn die Initialsierung einer Hardware
daran hängt ob ich gerade eingeschaltet habe oder später
was mache.
Holger schrieb:> Ich habe übrigens mal die HD44870-Standardroutinen probiert. Damit läuft> das Display überhaupt nicht!
Dann musst du wohl deine Hard- und Software noch mal etwas
genauer anschauen. Das Display selbst wohl eher weniger.
Michael U. schrieb:> Einige Hersteller auch des HD44780 hatten mal eine Soft-Rest Angabe in> ihren Datenblättern, die ging manchmal auch mit anderen Kontrollern, ich> finde das aber gerade nicht mehr und in meinem Datenblatt des ST7066U> steht dazu auch nichts.
Wenn ich mich recht erinnere ging das etwa so:
Das Kommando, um das Display auf 8 Bit zu setzen, ist Hex 3x (ich hoffe
die 3 stimmt). Wichtig ist aber eigentlich, daß nur das obere Nibble
signifikant ist. Man könnte also auch 33 senden, beide Nibble also
gleich machen.
Ich versuche mal das zu skitzieren. Da nur 4 Bit angeschlossen sind ist
hier jeder Transfer auch 4 Bit. Zuerst der Fall, daß das Display ein
unteres Nibble erwartet
Schickt man also 3 mal hintereinander eine 0x3, sollte das Display
danach immer im 8 Bit Mode sein. Danach kann man dann den 4 Bit Mode
einschalten.
MfG Klaus
Klaus schrieb:> Schickt man also 3 mal hintereinander eine 0x3, sollte das Display> danach immer im 8 Bit Mode sein.
Du erfindest das Rad neu bzw trägst Eulen nach Athen.
Das was du schreibst macht genau die im Datenblat vorgeschriebene
Initialisierung.
Frickelfritze schrieb:> Du erfindest das Rad neu bzw trägst Eulen nach Athen.
Und ich war so stolz, daß ich verstanden habe, warum das so gemacht
wird :(
MfG Klaus
Moin,
hier ist die Lösung:
1. Nach einem Reset ist ja ein AVR-Portpin als Eingangspin geschaltet.
Ich verwende PD2 und schalte den dann als Ausgang. Dort sind die +Ub des
LCD angeschlossen. Den schalte ich dann auf High und dann wartet mein
Programm 50 ms. Dann LCD-Init.
Den Hinweis habe ich in einem anderen Forum gefunden: Im Datenblatt
steht, dass als erstes DB5 und DB4 high sein müssen. Im Forum stand,
dass dies ein Fehler sei und nur DB5 auf High stehen soll. Ich habe
meine Init-Routine angepasst und nun läuft es wie es soll!
Das Display soll HD44870-Kompatibel sein. Die Init-Routine ist aber
völlig anders.
Holger
Holger schrieb:> Durch Zufall habe ich folgenden Effekt entdeckt. Drücke ich Reset, dann> erscheinen nur noch irgendwelche Symbole anstelle meines Textes.>> Drücke ich noch einmal Reset, dann erscheint wieder "Hello World!". Das> Spiel kann man so weitertreiben.
Initialisierung macht kein 'Clear Screen'!
Du siehst (teilweise) dass wass da war bevor der Reset.
Und bevor der zweite reset könnte ein 'Clear Screen' gewesen sein.
Bedenke bei 'Reset' dass zwei selbststaändige Geräte im Spiel sind:
Mikro und LCD.
Geert H. schrieb:> Bedenke bei 'Reset' dass zwei selbststaändige Geräte im Spiel sind:> Mikro und LCD.
Moin, dass hat sich ja nun durch meinen vorherigen Beitrag egalisiert.
Holger
Michael U. schrieb:> Hallo,>> das Problem hatte ich auch schon mit einigen Displays. Ursache ist, daß> das Problem ja im 4Bit-Mode ist und auch bleibt. Es gibt da keinen> offiziellen Rückweg.> Damit läuft die normale Initialisierung gegen die Wand, weil die> Kommandos ja bereits als 4Bit-Kommandos interpretiert werden.>> Einige Hersteller auch des HD44780 hatten mal eine Soft-Rest Angabe in> ihren Datenblättern, die ging manchmal auch mit anderen Kontrollern, ich> finde das aber gerade nicht mehr und in meinem Datenblatt des ST7066U> steht dazu auch nichts.>> Gruß aus Berlin> Michael
Stimmt. Ein zweites Software-Init funkzioniert nicht / nicht immer, und
kann schwere Fehler machen.
http://mcselec.com/index2.php?option=com_forum&Itemid=59&page=viewtopic&t=13185&highlight=initlcd&sid=3ba841e1ce6a5c83aeff8bdc992cecf3