Forum: Mikrocontroller und Digitale Elektronik lcd initialisierung assembler


von Samuel J. (capstrovor)


Angehängte Dateien:

Lesenswert?

Ich weiß, dass es schon ewig viele Beiträge von diesem Problem gibt, 
aber ich komme nicht weiter.

Ich versuche mein LCD (Treiber: 44780) mit einem Atmega16 (16MHz) zu 
programmieren. Ich programmiere in Assembler. Allerdings geht nicht mal 
die initialisierung.
Ich habe es nach dieser Anleitung probiert: 
http://www.sprut.de/electronic/lcd/#ks0073

Wenn die Initialisierung abgeschlossen ist, wird immer noch ein Balken 
in der oberen Zeile angezeigt, und der Cursor blinkt an der zweiten 
stelle.

Im Anhang befindet sich mein Programm.

Kann mir bitte jemand sagen was da nicht stimmt?

mfg

: Bearbeitet durch User
von holger (Gast)


Lesenswert?

Vergleiche deinen Code mit dieser Seite:

http://www.mikrocontroller.net/articles/AVR-Tutorial:_LCD

von g457 (Gast)


Lesenswert?

> Kann mir bitte jemand sagen was da nicht stimmt?

Du bist ein paar Größenordnungen zu schnell.

von Samuel J. (capstrovor)


Lesenswert?

@g457

ich habe doch ein Delay von 255^3 Taktzyklen. Das wären bei 16MHz dann 
doch
über eine Sekunde oder?

von Icke ®. (49636b65)


Lesenswert?

Zunächst, dein Code ist nicht kommentiert und schlecht lesbar. Ohne mich 
jetzt da hinein zu vertiefen, fällt mir als erstes auf:

";DB7-DB4 auf PB3-6"

Das ist suboptimal, weil die Datenleitungen nicht mit einem 
vollständigen Nibble übereinstimmen und somit unnnötige 
Schiebeoperationen erforderlich sind (die ich im Code nicht finde). 
Schließ die Datenpins an PB7-PB4 an.

von Samuel J. (capstrovor)


Lesenswert?

@holger

das Problem ist, dass bei dieser Seite der Code für die Initialisierung 
nicht direkt aufgeführt ist, sondern nur der Ablauf. Ich verstehe nicht 
was man mit  "$3" meint.

Ist es eigentlich auch richtig, dass ich zuerst die Pegel für RS und R/W 
anlegen muss, dann die Enable leitung auf High legen, dann die Pegel für 
die Datenleitungen anlegen muss und dann Enable wieder auf low ziehen?

von Max H. (hartl192)


Lesenswert?

Samuel J. schrieb:
> ich habe doch ein Delay von 255^3 Taktzyklen
Welches du nur 3 Mal aufrufst.

von Samuel J. (capstrovor)


Angehängte Dateien:

Lesenswert?

@lcke(R)

Tut mir leid, ich habe die Kommentare hinzugefügt.

Ich habe die Datenleitungen so angeschlossen, weil in dem Tut, welches 
ich gefunden habe, die Befehle in dieser Reihenfolge angegeben werden.

: Bearbeitet durch User
von Samuel J. (capstrovor)


Lesenswert?

@ Max H.

ich brauche es doch nur 3 Mal, oder?

einmal um die Initialisierung des Treibers abzuwarten
und 2 mal zwischen den ersten 2 Steuerbefehlen, oder lieg ich da falsch?

von Max H. (hartl192)


Lesenswert?

Du musst mach jedem Befehl warten. Wie lange findest du auf S. 24:
https://www.sparkfun.com/datasheets/LCD/HD44780.pdf

: Bearbeitet durch User
von Samuel J. (capstrovor)


Lesenswert?

@ Max

achso, ok. Vielen Dank.

von Samuel J. (capstrovor)


Lesenswert?

@ Max

ich habe jetzt nach jedem Befehl mein Delay eingefügt. Es funktioniert 
aber immer noch nicht. Die Angaben im Datenblatt müssten doch 
Mindesangaben sein, oder?

von Icke ®. (49636b65)


Lesenswert?

ldi R16, 0b00000110    ;Interface auf 8-bit setzen
out PORTB, R16
sbi PORTB, 2      ;Enableleitung auf high


Das geht so nicht. Du schreibst damit einerseits nur Nullen auf die 
Datenleitungen und gleichzeitig ziehst du R/W auf High, wodurch das 
Display in den Lesemodus versetzt wird.

Vergiß das Tutorial und schau dir das hier auf µC-net an.

holger schrieb:
> Vergleiche deinen Code mit dieser Seite:
>
> http://www.mikrocontroller.net/articles/AVR-Tutorial:_LCD

von Samuel J. (capstrovor)


Lesenswert?

@ lcke

1.) Ich verstehe nicht ganz, wieso ich alle Datenleitungen auf low lege. 
Wenn ich die Zahl 0b00000110 auf Port B schreibe, so müssten doch DB5 & 
DB4 auf high sein. Außerdem setze ich R/W nie auf eins, weil auf Pin 2 
ja Enalbe liegt.

2.) Ich verstehe die Initialisierung auf uC.net nicht wirklich. Was 
meint man da, wenn man $3 ins Steuerregister schreiben soll?

mfg

von Icke ®. (49636b65)


Lesenswert?

Samuel J. schrieb:
> Wenn ich die Zahl 0b00000110 auf Port B schreibe, so müssten doch DB5 &
> DB4 auf high sein.

Nein, das höchstwertige Bit (MSB) ist links.

von Samuel J. (capstrovor)


Lesenswert?

Ja schon, aber DB4 ist bei mir auf PB6.

von Max H. (hartl192)


Lesenswert?

Samuel J. schrieb:
> 0b00000110
    │││    └───PB0
    │││        ...
    ││└────────PB5
    │└─────────PB6
    └──────────PB7

: Bearbeitet durch User
von Samuel J. (capstrovor)


Lesenswert?

facepalm
Tut mir leid! Kaum macht man's richtig, funktioniert es ;)

Vielen Danke für eure Hilfe!

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.