Forum: Mikrocontroller und Digitale Elektronik LCD 2x16 mit ST7066U läuft nur nach jedem 2. Reset


von Holger (Gast)


Lesenswert?

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

von Magic S. (magic_smoke)


Lesenswert?

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.

von Frickelfritze (Gast)


Lesenswert?

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

von Holger (Gast)


Lesenswert?

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

von Michael U. (amiga)


Lesenswert?

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

: Bearbeitet durch User
von Frickelfritze (Gast)


Angehängte Dateien:

Lesenswert?

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.

von Michael U. (amiga)


Lesenswert?

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

: Bearbeitet durch User
von Holger (Gast)


Lesenswert?

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

von Frickelfritze (Gast)


Lesenswert?

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.

von Michael U. (amiga)


Lesenswert?

Hallo,

Du hast recht. Bleibt also wohl nur, daß er die Wartezeiten in der 
Resetsequenz nicht einhält.

Gruß aus Berlin
Michael

von Frickelfritze (Gast)


Lesenswert?

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.

von Klaus (Gast)


Lesenswert?

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
1
3   komplettiert den angefangenen vorigen Transfer. Erzeugt vermutlich
2
    Unsinn
3
3   oberes Nibble von "set to 8 Bit"
4
3   unteres Nibble. Das Display ist jetzt im 8 Bit Mode und kann gezielt
5
    auf 4 Bit geschaltet werden
Jetzt der Fall, daß ein oberes Nibble erwartet wird
1
3   oberes Nibble von "set to 8 Bit"
2
3   unteres Nibble. Das Display ist jetzt im 8 Bit Mode
3
3   "set to 8 Bit", das untere Nibble kommt von den unbenutzten unteren
4
    Datenleitungen, ist aber nicht signifikant. Das Display ist immer
5
    noch im 8 Bit Mode und kann gezielt auf 4 Bit geschaltet werden

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

von Frickelfritze (Gast)


Lesenswert?

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.

von Klaus (Gast)


Lesenswert?

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

von Holger (Gast)


Lesenswert?

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

von Geert H. (geerth)


Lesenswert?

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.

: Bearbeitet durch User
von Holger (Gast)


Lesenswert?

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

von Geert H. (geerth)


Lesenswert?

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

: Bearbeitet durch User
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.