Forum: Mikrocontroller und Digitale Elektronik LCD initialisierung atmega 8 in asm


von Gast (Gast)


Lesenswert?

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

von Gast (Gast)


Angehängte Dateien:

Lesenswert?

habe ich den anhang vergessen?!

ups

von Karl B. (gustav)


Lesenswert?


von Der M. (steinadler)


Lesenswert?

In deinem Prog fehlen doch die Interruptroutinen (also wenigstens ein 
RETI). Ich hab nichtmal ein .ORG gefunden.

von Karl B. (gustav)


Lesenswert?

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

von Oliver D. (Gast)


Lesenswert?

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 :)

von Peter D. (peda)


Lesenswert?

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
Noch kein Account? Hier anmelden.