Hallo!!! Sorry für den hundertausendsten Post um die Initialisierung eines LCD´s. Vielleicht will mal jemand über das Programm schauen, denn die Initialisierung funktioniert nicht und ich finde den Fehler leider nicht. Das Display bleibt nach dem Laden "weiß" und zeigt weder einen Cursor, noch ein blinken, noch sonstiges. Die Codes habe ich aus der Tabelle des TUT. Die LCD routine (nein, das komplette programm) aus dem TUT funktioniert einwandfrei, also gehe ich davon aus, das die Hardware stimmt. ok, ich hoffe ihr könnt mir weiterhelfen, bin hier fast am verzweifeln, danke schonmal im voraus. Gruß, gast
Schau mal hier: http://www.gutefrage.net/frage/anag-vision-av1621-lcd-display-laesst-sich-nicht-initialisieren
In deinem Prog fehlen doch die Interruptroutinen (also wenigstens ein RETI). Ich hab nichtmal ein .ORG gefunden.
Hallo, so wie ich es sehe, wird RS-Bit erst direkt gesetzt und dann auch
mit swap eventuell durch die Daten am Port wieder gelöscht, oder?:
Ich würde auch erst im "zweiten" Durchgang swappen. Ports werden von 0
aus gezählt?
Meine Überlegung:
Also erst Daten, dann RS high, dann Enable high-low, etwas Pause, dann
RS low. Pause für Busy.
Dein Prog:
sbi PORTD, PIN_RS //RS = high; daten
mov r18, r17
swap r17
andi r17, 0b00001111
out PORTD, r17 //daten auf ausgang
(Wozu setzt Du Port B und C als Eingänge?
Ist mir zunächst nicht klar. Aber - egal...)
Mein Vorschlag zur Güte:
.......
.def temp = r18
.def temp1 = r19
.equ impuls = portd
.equ daten = portb
Datenuebernahme:
mov temp1, temp ;"Kopie" des Wertes aus temp
; fuer ;weitere ;Operation unten
andi temp, 0b11110000 ;unteres Nibble ausblenden
out daten, temp
sbi impuls, 1 ; RS setzen
sbi impuls, 0 ; Enable high
rcall Verzoegerung
cbi impuls, 0 ; Enable low
rcall Verzoegerung
cbi impuls, 1 ; RS löschen
swap temp1 ;Nibble-Vertauschen, Wert
;aus ;temp ;kopiert, s.o.
andi temp1, 0b11110000 ;unteres Nibble ausblenden
out daten, temp1 ;unteres Nibble aus temp1
sbi impuls, 1 ; RS setzen
sbi impuls, 0 ; Enable high
rcall Verzoegerung
cbi impuls, 0 ; Enable low
rcall Verzoegerung
cbi impuls, 1 ; RS löschen
rcall Verzoegerung
ret
Hi, ich weiß das gerade ein LCD für den Anfänger eine kleine Herausforderung ist, da LCDs ein recht genaues timing erfordern. Wenn du einen HD44780 controller benutzt, schlage ich dir vor mehrere Delay schleifen zu erzeugen. Einmal 16ms, einmal 5ms einmal 2ms und ein "short_delay" mit vielleicht 20 nops. Bei mir waren bisher immer timingfehler schuld. Wenn das display erstmal initialisiert ist, ist der rest ein kinderspiel. Also erstmal ordentliches timing machen :)
Oliver D. wrote: > ich weiß das gerade ein LCD für den Anfänger eine kleine Herausforderung > ist, da LCDs ein recht genaues timing erfordern. Quatsch, das Timing ist völlig unkritsich. Du mußt nur die Mindestzeiten einhalten, das ist alles. Wenn da z.B. 46µs steht, sollten es mindestens 46µs sein, also 100µs geht auch. Es hat natürlich keinen Zweck, statt 100µs 10ms zu schreiben, das ist reine Zeitverschwendung (schadet aber nicht, sondern macht Deinen MC nur träge). Kurz und gut, Du mußt Dir als allererstes mal ein Delaymacro schreiben, was mit der Definition der Taktfrequenz die als Argument übergebene Zeit minimal verbraucht. > ein "short_delay" mit vielleicht > 20 nops. Das ist Bullsh**, was sollen denn die 20 NOPs sein? 1µs bei 20MHz, 20µs bei 1MHz oder wie. Der Assembler hat nen Präprozessor und den läßt Du es richtig ausrechnen. Pi * Daumen 20 NÖPchen hi und da, muß einfach schief gehen. Fange bloß nicht an, irgendwelche Schleifenzähler in Stein zu meißeln, d.h. statt der Formel direkt den Wert für XX MHz einzutragen. Dann fängst Du nämlich bei Quarz = YY MHz nochmal ganz von vorne an. Ist zwar schon uralt: Beitrag "AVR: Delay 7 ... 65542 Zyklen" Peter
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
Mit Google-Account einloggen
Noch kein Account? Hier anmelden.