Probleme mit LCD

Gast #164886
Lesenswert?

Hallo Forum,
ich habe versucht mit dem LCD-Tutorial ein 4x20 Zeichen Display
anzusteuern.
Irgendwie will das Teil nicht so wie ich.
Im Anhang ist das Datenblatt.
Nach dem 12. Zeichen schreibt das Display gleichzeitig in die erste und
zweite Zeile.
Statt dem Scrollen fängt das Display irgendwan, nachdem einige Zeichen
verloren gehen wieder oben an.
Hier meine Initialisierungsroutine:
lcd_init:
           ldi  temp3,50
powerupwait:
           rcall  delay5ms
           dec  temp3
           brne  powerupwait
           ldi temp1, 0b00000011        ;muss 3mal hintereinander
gesendet
           out PORTB, temp1             ;werden zur Initialisierung
           rcall lcd_enable             ;1
           rcall delay5ms
           rcall lcd_enable             ;2
           rcall delay5ms
           rcall lcd_enable             ;und 3!
           rcall delay5ms
           ldi temp1, 0b00000010        ;4bit-Modus einstellen
           out PORTB, temp1
           rcall lcd_enable
           rcall delay5ms
           ldi temp1, 0b00101010        ;noch was einstellen...
           rcall lcd_command
           ldi temp1, 0b00001101        ;...nochwas...
           rcall lcd_command
           ldi temp1, 0b00000100        ;endlich fertig
           rcall lcd_command
           ret
...wie gesagt, das meiste aus dem Tutorial.
Was ist hier falsch ?
Angehängte Dateien:
Gast #164887
Lesenswert?

Hi...

Bei 4x20 musst du erstmal ermitteln, welche Ausgabeposition welchem
Speicherbereich entspricht. Scrollen dürfte nicht so sinnvoll sein, der
Controller kann (glaube) nur 80 Zeichen adressieren.

Da ich kein 4x20 habe, habe ich auch kein Datenblatt griffbereit, weiß
daher auch nicht, welche Zeile welchem Speicherbereich zugeordnet ist.

...
Gast #164888
Lesenswert?

Hallo HanneS...
alles was ich an Datenblatt zu dem Display gefunden habe, ist im Anhang
meines ersten Postings.
Aus dem Bereich Adressregister in der Befehlstabelle werde ich nicht
schlau.
Meine Timer-Routine habe ich übrigens umgebaut. Um die Subroutinen
ausserhalb des Interrupts komme ich aber nicht herum, da ich das UART
benutze und hier öfters warten muss.
Aber nun zurück zu meinem Display.
muss ich dann etwa jeden Buchstaben explizit platzieren?
Das muss doch einfacher möglich sein :-(
Gast #164889
Lesenswert?

Sorry, PDFs mag mein Browser (aus gutem Grund) nicht. Und Downloaden und
separat öffnen mach ich eigentlich nur, wenn ich es selbst brauche, was
für die meisten Forum-Anhänge nicht zutrifft.

Das Display hat Auto-Increment. Du legst die Position des ersten
Zeichens fest und gibst dann den Rest der Zeile aus. Bei Zeilenwechsel
legst du wieder zuerst die Ausgabeposition fest (Kommando Set
DD-RAM-address) und schreibst dann munter drauflos.

...
Gast #164890
Lesenswert?

Hmm...
Im Grunde gebe ich dem Display am Start vor, dass der Cursor an den
Anfang, resp. oben links steht.
Dann schreibe ich drauf los, habe aber dann ab dem 13.Zeichen Dieses
bereits in der Zweiten Zeile (zusätzlich zur Ersten).
D.h. nach dem Initialisieren schicke ich dem Display eine 1 und lösche
es damit. Ausserdem wird der Cursor laut Datenblatt auf die
home-position gesetzt.
Gast #164893
Lesenswert?

So, das passt jetzt.
Ich musste erst das NW-Bit setzen, damit das Display weiß, dass es
4-Zeilig ist.
Das einzige, was jetzt noch nicht klappern will ist das scrollen,
obwohl es dafür diverse Einstellungen gibt :-(
Hat vielleicht schon mal jemand so einen KS0073 programmiert ?
Woher weiß ich, wann das Display voll ist um es eventuell zu löschen ?
Wie kann man einem solchen Display sagen, dass es in der nächsten Zeile
weiter geht ?
Fragen über Fragen....
Gast #164894
Lesenswert?

...denkste passt jetzt...
Einmal aus und an, nix mehr.
Ich glaube das Problem liegt beim Enable-Bit.
Wenn ich das Datenblatt richtig verstehe, gibt es Befehle mit und ohne
Enable.
Wie kann denn dann das Display wissen, wann es ohne Enable Daten
empfangen muss ?
Irgendwie habe ich das Gefühl, dass das Teil den anliegenden Port
fehlinterpretiert, sobald das E-Bit abfällt.
Kann mir das mal jemand erklären ?
Gast #164897
Lesenswert?

Nö, wie ich das mal kurz überflogen habe, ist RE ein Bit in einem
Register, welches gesetzt werden muss, um in den extended function mode
zu kommen.
Nachdem die extended functions gesetzt sind, löscht man das Bit
wieder.
Aber wie gesagt, ich habs nur überflogen.
Gast #164902
Lesenswert?

Es gibt keinen Zeilenumbruch wie CR+LF.
Man setzt den Cursor an die entsprechende RAM-Adresse.
Steht in deinem Datenblatt auf Seite 3 rechts oben.

Der Scrollbefehl ist in der Befehlstabelle beschrieben.
Gast #164903
Lesenswert?

Was macht denn dann der Scrollbefehl ?
Egal was ich mache, da ist nix auf'm Display anders als vorher.
Ich würde gerne alles nach oben scrollen, sobald die vierte Zeile voll
ist.
Mit dem Zeilenumbruch ist ja ganz nett aber woher weiß ich, in welcher
Zeile der Cursor grade steht ?
Gast #164905
Lesenswert?

Hi...

Vertikales Scrollen gibt es nicht. Nur Horizontales. Inwieweit dein
Display das kann, weiß ich nicht. Das Scrollen beruht (zumindest beim
Controller HD44780) darauf, dass für jede Zeile mehr Speicher zur
Verfügung steht, als Anzeigepositionen vorhanden sind. Man kann die
Anzeigepositionen als "Fenster" über den Display-RAM verstehen.
Dummerweise verschieben sich aber bei mehrzeiligen LCDs immer alle
Zeilen gleichzeitig.

Dir wird nix weiter übrig bleiben, als das LCD nach der Methode
"Locate / Print" anzusteuern, also zuerst die Ausgabeposition zu
setzen (DD-RAM-Address) und danach die Zeichen einer Zeile auszugeben.

Vor jeder neuen Ausgabe einer Zeile (oder einer Zahl an einer fixen
Position) ist dann der Schreibcursor (DD-RAM-Address) erneut zu
positionieren.

Das LCD lässt sich also nicht hintereinander weg mit Text beschreiben,
ähnlich des PRINT-Befehls in BASIC oder der Ausgabe auf einem (Zeilen-)
Drucker. Ist vielleicht schade, ist aber so...

...
Gast #164906
Lesenswert?

Display Shift/Scrollen:

Schau mal im ausführlichen Datenblatt auf Seite 14 und 18. Dort ist der
Mechanismus aufgezeigt.

Auf Seite 32 & 33 ist das Shiften aller oder einzelner Zeilen
beschrieben.

Ein hochscrollen der Zeilen gibt es nicht. Dazu müssen die Zeilen neu
geschrieben werden.
Gast #164907
Lesenswert?

stimmt, ist schade...
Zum Mitzählen muss ich sagen, dass meine Register langsam knapp
werden.
Wie macht man das erst bei wirklich großen Programmen ?
Gibt's da mehr als r0-r31 in größeren MC's?

Na ja, im Moment macht mir mein UART auch noch viel mehr sorgen.
Da mir meine Pins langsam knapp werden, versuche ich mal das Display
über SPI anzusteuern.
Danke Euch auf jeden Fall erstmal.
By the way, HanneS.
Hab mal versucht den Großteil meines Programmes in die Timer0 ISR zu
schieben aber irgendwie wird das zu viel, zumal ich beim UART relativ
hohe Wartezeiten hab.
Ich hab dafür aber schon versucht in einem anderen Threat Hilfe zu
bekommen.
Mal sehn, was draus wird.

Antwort schreiben

Bitte melde dich an, um einen Beitrag zu schreiben.

oder

Mit Google-Account einloggen

Die Registrierung ist kostenlos und dauert nur eine Minute.

Jetzt registrieren