Probieren geht über Studieren
Hallo allerseits,
hier nun noch ein Test-Video vom LCD-Initialisierungsprogramm, das unten nochmals angehängt wird.
Also:
Änderung:
Jetzt verwendete Quarzfrequenz: 10 MHz (Zeitschleifen angepaßt), so daß es durchaus auch bei den angeforderten 12 MHz laufen müßte.
Panne:
Habe selbst mal probiert,was passiert, wenn der Swap-String fehlerhaft ist:
Dann kommen z. T. Buchstaben und Zeichen aus dem "Kano"-Schriftsatz. Dasselbe Phänomen zeigte sich, wurde ein Enableimpuls bei Label "datenuebernahme" schlichtweg vergessen.
Wir brauchen im Vierbitmodus z w e i m a l Enable!
Werden die Argumente der allerersten Strings "verdreht", passiert folgendes:
Das LCD zeigt am Anfang permanent schwache schwarze Balken und überschreibt diese schwach mit den fehlerhaften Zeichen.
Hier wurde also ganz sicher falsch initialisiert, wenn die ominösen Balken weiterhin sichtbar bleiben:
Der String muß einfach rein - ganz am Anfang - , dann verschwinden diese Balken:
PHP:
lcd_achtbitinit: ; Acht-Bit Init:
; ; dreimal Hex 0x30 bzw. 0x03
push temp ; ist immer notwendig,
cbi daten, rs ; wenn einmal 8/4-Bit-Modus
ldi temp, 0x30; bzw.0x03 ; gewechselt wird
out daten, temp ; dazu steht RegisterSelect-Bit
rcall enable ; stets auf "low"
rcall verz3 ; und jedesmal einen Enable-
cbi daten, rs ; Impuls toggeln lassen
ldi temp, 0x30;bzw. 0x03
out daten, temp
rcall enable
rcall verz3 ; dazwischen kurze Verzoegerung
cbi daten, rs
ldi temp, 0x30;0x03
out daten, temp
rcall enable
rcall verz3
pop temp
ret
;
lcd_acht_vier: ; Acht-zu-Vier-Bit-Modus-Wechsel
;
push temp
cbi daten, rs
ldi temp, 0x20;bzw. 0x02 ; zunaechst nur 4-Bit-Modus,
out daten, temp ; untere vier LCD-Port-Bits werden
rcall enable ; ignoriert, aber immer noch
rcall verz3 ; 8-Bit-Befehlsbreite
pop temp
ret
Dann, das kann man auf dem Video kaum erkennen, wird die Hintergrundbeleuchtung auf Portbit B3 per Transistor regelmäßig ausgetastet. (Und zwar immer dann, wenn das Label "kommando" aufgerufen wird, weil jetzt der "ori"-String mit Nullen dringeblieben ist.)
Also, erste Austastung: Bei Wechsel der Zeile am Ende vom Text "Das ist ein ... "
.....Positionierung.
Dann analog dazu immer, wenn wieder "positioniert" , Entry-Mode gewechselt wird aus dem laufenden Programm heraus, dann, wenn "Display clear" kommt. Das geht ja nur im Steuerwort-Mode, also über das Label "kommando", wie gesagt. Mit RS auf "Low".
Habe deswegen dahinter eine Verzögerung gesetzt, weil sonst der "Blip" kaum wahrgenommen werden kann. Diese Verzögerung kann später auch rausgeremt werden.
Noch etwas:
Die großen Verzögerungen sind eigentlich nur in der Initialisierung notwendig.
Hinterher reagiert die Textdarstellung im Display auch sehr schnell, so daß ASCII-Zeichen direkt ohne Pufferung vom UART in 9k6 Baudrate dargestellt werden können, blitzschnell.
Und das Ganze o h n e Busy-Flag-Abfrage. Jedenfalls bei dem Displaytech-LCD hier.
Andere LCDs könnten da etwas "träger" sein.
Aber:
"Probieren geht über Studieren", wobei wir beim Thema wären.
Viel Spaß noch beim Angucken des Videos:
http://www.kbra01.de/LCD_4BIN.MPG
Euer Oskar01
P.S.:
Die Änderung des aktuellen Programms beinhaltet nunmehr eine universellere Gestaltungsmöglichkeit der "Variablen".
Also: Die tatsächlich verwendete Portbitbelegung für Steuersignale RS und Enable kann direkt im Direktiventeil vorgenommen werden, ohne, daß das gesamte Programm abgeklappert werden muß.
Dasselbe gilt dann auch für die evtl. noch abzuändernden Zeitschleifenwerte.
Die sind jetzt zwar allesamt auf den Maximalwert eingestellt, können dann, wenn die Initialisierung endlich geklappt hat, noch verkleinert werden.
Ferner wurden die Programmabschnitte für Setzen/Löschen des RS-Bits und die Ausgabe auf den LCD-Ausgabeport so abgeändert, daß die geforderte
Timingbedingung, die Reihenfolge für RS- Daten-Out etc. mit "Sicherheitspausen" besser eingehalten wird. Die Daten stehen dann stabil am Bus an, die Datenübergabezeit hängt dann im Wesentlichen von der Anzahl der "nops" im Unterprogramm "enable" ab.
Hab's ausprobiert und funktioniert hier einwandfrei.