Hallo
Takte der Befehle:
dec 1
brne 1/2
rcall 3
ret 4
In der Schleife 19*3 +2 (19 mal springen und einmal nicht springen) +3 +4 ergibt 66. Bei 16MHz-Takt bedeutet das 1Sekunde/16000000*66 oder 0,000004125s oder 4,125µs Verzögerung. Das scheint mir viel zu kurz, vor allem wenn "zähe" Funktionen wie clear oder cursorhome Ausführungszeiten im ms-Bereich haben. Auch den Hinweis rechts auf Seite drei des Datenblatts sollte man beachten. Ich habe mir die Wikiseite noch nicht angeschaut, aber ich vermute, du prüfst das busy nicht. Im Zweifel immer mit deutlich zu großer Verzögerung starten.
Link zum LCD: http://www.reichelt.de/Hintergrund-b...=0&OFFSET=500&
Link zum Datenblatt: http://www.reichelt.de/index.html?;A...BL%2523EAS.pdf
Gruß
mic
[Edit]
Das LCD hat zwei Register. Ins Datenregister schreibt man die Werte, ins Steuerregister die Kommandos. Mit der R/S-Leitung wird zwischen Kommando und Daten unterschieden, ein Low bedeutet, die angelegten Signale an den Datenleitungen werden als Kommando interpretiert, ein High bedeutet, jetzt kommen Daten. Bei einer 4bit-Ansteuerung werden die Datenbytes in zwei Schritten übertragen, wenn ich mich recht erinnere zuerst das High- und dann das Lownipple.
Die Übernahme der angelegten Datenpegel steuert man mit dem E-Signal, bei einer Flanke nach Low werden die Pegel an den Dateneingängen eingelesen. Die Datenflußrichtung steuert man mit dem R/W-Signal, low bedeutet, ins LCD reinschreiben. Weil die einfachste Ansteuerung eines LCD ohne Auswertung des busy auskommt (und man sich so einen Pin am µC spart) kann man diese Leitung direkt mit GND verbinden.
Da das LCD natürlich nach dem Einschalten nicht weiß, ob es mit 4 oder 8 Bits angesteuert wird, startet es im 8bit-Modus. Deshalb muss man zu Beginn der Initialisierung zuerst auf 4 Bits umschalten. Das Kommando dazu lautet, formatiert für den 8bit-Modus, so:
0b0010 0000 (nach dem Beispiel im Datenblatt Seite 4)
Das bedeutet, diesen ersten Wert für das LCD muss man mit einer 8 Bit Ausgabefunktion senden. Beim Senden muss R/W auf Low für "Schreiben" und RS auf Low für "Kommando" gesetzt werden. Das eigentliche Senden läuft dann so ab:
E auf 0
RS auf 0
setzen und kurz warten, bis sich die Pegel eingestellt haben (tAS)
E auf 1
D4-D7 auf das Daten Highnipple
Wieder warten, bis sich die Pegel eingestellt haben (PWEH)
E auf 0
Jetzt hat das LCD die Daten übernommen und führt den Befehl aus. Günstig ist es, wenn man nun noch auf den Datenmodus zurückschaltet:
RS auf 1
Nach einer weiteren Wartezeit, bis TCYCE erreicht ist, ist das Senden fertig.
Ab jetzt erwartet das LCD alle weiteren Daten im 4 Bit-Format, ein Byte wird dann durch das einzelne Senden des High- und des Lownipples übertragen. Da der oben beschriebe Ablauf beim Senden auch ein Lownipple übertragen kann, packen wir es in eine Funktion der wir das auszugebende Nipple als Parameter übergeben:
send_nipple(nipple)
und ändern oben nach
D4-D7 auf das nipple
und senden die Initialisierung:
send_nipple(0b0010) 4-Bit Datenlänge einschalten (noch im 8-Bit Modus)
send_nipple(0b0010) 4-Bit Datenlänge, 1-zeiliges Display, 5x7 Font
send_nipple(0b0000)
send_nipple(0b0010) nochmal senden, weil manchmal nötig
send_nipple(0b0000)
send_nipple(0b0000) Display ein, Cursor ein, Cursor blinken
send_nipple(0b1111)
send_nipple(0b0000) Display löschen, Cursor auf 1. Spalte von 1. Zeile
send_nipple(0b0001)
send_nipple(0b0000) Cursor Auto-Increment
send_nipple(0b0110)
Jede Leerzeile zwischen den Sende-Aufrufen steht für eine Wartezeit die der Ausführungszeit des jeweils vorangegangenen Befehls entspricht. Für den groben Test würde ich mit 2ms pro Leerzeile anfangen...
Da send_nipple() nur Kommandos senden kann (RS ist beim Senden immer low) benennen wir es in send_kommando() um und erzeugen eine Kopie in der wir RS auf 0 in RS auf 1 ändern und an deren Ende wir eine kurze Verzögerung für die Darstellung des Zeichens anfügen und die wir anschliesend send_daten() nennen:
send_daten(114)
send_daten(103)
send_daten(104)
send_daten(55)
send_daten(124)
send_daten(145)
send_daten(163)
send_daten(164)
Ich hoffe,das funzt so.
Lesezeichen