Forum: Mikrocontroller und Digitale Elektronik Probleme mit LCD


von Carsten (Gast)


Angehängte Dateien:

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 ?

von ...HanneS... (Gast)


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.

...

von Carsten (Gast)


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

von ...HanneS... (Gast)


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.

...

von Carsten (Gast)


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.

von ...HanneS... (Gast)


Lesenswert?

Sorry, ich bezog mich auf den Controller HD44780.
Dein Display hat aber den Controller KS0073.
(stellte ich nach Lesen deines PDFs fest)

Damit habe ich noch keinerlei Erfahrung.

...

von Carsten (Gast)


Lesenswert?

Warte mal...
die hatten doch geschrieben, dass der kompatibel ist :-(
Na toll. Wo bekomme ich denn jetzt etwas mehr Infos her ?
Oder sollte das reichen, was im Datenblatt steht ?

von Carsten (Gast)


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....

von Carsten (Gast)


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 ?

von Thomas Forster (Gast)


Angehängte Dateien:

Lesenswert?

Von Befehlen ohne Enable hab ich noch nie gehört.
Ich hab mal ein besseres Datenblatt für dich.

von Carsten (Gast)


Lesenswert?

das habe ich auch mittlerweile gefunden...
Aber auch da ist immer von Befehlen mit RE-Bit =0 und RE-Bit=1 die
Rede.
Das ist aber doch das Enable-bit. Oder ?

von Thomas Forster (Gast)


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.

von Carsten (Gast)


Lesenswert?

Da gibts aber keinen Pin für.

von Thomas Forster (Gast)


Lesenswert?

Kein Pin, ein Bit!

Bit 2 bei Function Set (Table 10 Seite 39)=1
Danach schreibt man Extended F.Set (S. 38) auf 4-Line-Mode.
Danach Bit 2 F.Set wieder =0.

von Carsten (Gast)


Lesenswert?

Aaahhh...
Jetzt dämmerts.
Ist die Reihenfolge der Befehle eigentlich grundsätzlich egal ?

von Carsten (Gast)


Lesenswert?

So, jetzt hab ich es einigermaßen im Griff.
Das einzige, wo ich noch nicht hinter gekommen bin:
wie kann ich einen Zeilenumbruch programmieren ?
Wie kann das Display gescrollt werden ?

von Thomas Forster (Gast)


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.

von Carsten (Gast)


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 ?

von Hauke Radtki (Gast)


Lesenswert?

entweder "mitzählen" oder auslesen! Die genauen befehle weiss ich
jetzt leider nicht

von ...HanneS... (Gast)


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...

...

von Thomas Forster (Gast)


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.

von Carsten (Gast)


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.

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.