also beim Init ist es extrem wichtig, die Sequenz genau einzuhalten.
normal läuft das so:
1. warte reichlich Millisekunden
2. setze 8Bit-Modus
3. warte reichlich Millisekunden
4. setze 8Bit-Modus
5. warte reichlich Millisekunden
6. setze 4Bit-Modus
Erst ab jetzt darf man das Busy-Flag des LCD zur Synchronisation nutzen, drum muß man vorher auch immer warten bis das Disp sicher fertig ist.
Das mit LCDctrl() funzt da nicht!!!! (und wenn dann isses Zufall)
Begründung:
kriegt der MC nen Reset und das LCD ist im 4Bit-Modus, gibts da 2 Möglichkeiten:
1- das LCD ist nicht angesprochen oder ein 2-Nibbel-Zyklus ist fertig
2. das LCD war grad im Zugriff, die ersten 4bit sind schon drüben
wegen (2) ist der doppelte 8Bit-Setzbefehl (jeweils nur 1xE-Klappern!) am Anfang der Initsequenz nötig. Der 1. Befehl macht die grade laufende 4Bit-Sequenz fertig, der 2te schaltet auf 8 Bit. Der nächste Zugriff (der ist auch noch 8bittig d.h. nur 1xE-Klappern) setzt den 4Bit-Modus und ab hier muß man dann jeden 4-Bit-Zugriff als 2-Nibbel-Sequenz (Hi/E-Klappern/Lo/E-Klappern) machen, sonst kommt das LCD aus dem Takt. Erst hier kann man dann auch die unteren 4Bit des LCD-Controllers steuern, vorher ist das alles "dont care" und damit auch egal wie es verdrahtet ist.
Bei den 3,3V-Dingern muß man dann noch auf die Dauer des E-Pulses und die Preset- und Hold-Zeiten für RS und R/W bzw. Daten achten, die Angaben dazu stehen im Datenblatt des LCDs oder des Controllers.
(Hab da auf nem alten ST6-Controller auch lange rumprogrammiert bis es bei jedem PowerOn- und Watchdogreset sauber funzte ... damals gabs noch kein e-lab und alles ging in asm
)