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.