mikrocontroller.net

Forum: Mikrocontroller und Digitale Elektronik Probleme mit LCD


Autor: Carsten (Gast)
Datum:
Angehängte Dateien:

Bewertung
0 lesenswert
nicht 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 ?

Autor: ...HanneS... (Gast)
Datum:

Bewertung
0 lesenswert
nicht 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.

...

Autor: Carsten (Gast)
Datum:

Bewertung
0 lesenswert
nicht 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 :-(

Autor: ...HanneS... (Gast)
Datum:

Bewertung
0 lesenswert
nicht 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.

...

Autor: Carsten (Gast)
Datum:

Bewertung
0 lesenswert
nicht 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.

Autor: ...HanneS... (Gast)
Datum:

Bewertung
0 lesenswert
nicht 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.

...

Autor: Carsten (Gast)
Datum:

Bewertung
0 lesenswert
nicht 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 ?

Autor: Carsten (Gast)
Datum:

Bewertung
0 lesenswert
nicht 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....

Autor: Carsten (Gast)
Datum:

Bewertung
0 lesenswert
nicht 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 ?

Autor: Thomas Forster (Gast)
Datum:
Angehängte Dateien:

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

Autor: Carsten (Gast)
Datum:

Bewertung
0 lesenswert
nicht 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 ?

Autor: Thomas Forster (Gast)
Datum:

Bewertung
0 lesenswert
nicht 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.

Autor: Carsten (Gast)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
Da gibts aber keinen Pin für.

Autor: Thomas Forster (Gast)
Datum:

Bewertung
0 lesenswert
nicht 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.

Autor: Carsten (Gast)
Datum:

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

Autor: Carsten (Gast)
Datum:

Bewertung
0 lesenswert
nicht 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 ?

Autor: Thomas Forster (Gast)
Datum:

Bewertung
0 lesenswert
nicht 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.

Autor: Carsten (Gast)
Datum:

Bewertung
0 lesenswert
nicht 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 ?

Autor: Hauke Radtki (Gast)
Datum:

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

Autor: ...HanneS... (Gast)
Datum:

Bewertung
0 lesenswert
nicht 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...

...

Autor: Thomas Forster (Gast)
Datum:

Bewertung
0 lesenswert
nicht 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.

Autor: Carsten (Gast)
Datum:

Bewertung
0 lesenswert
nicht 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

Die Angabe einer E-Mail-Adresse ist freiwillig. Wenn Sie automatisch per E-Mail über Antworten auf Ihren Beitrag informiert werden möchten, melden Sie sich bitte an.

Wichtige Regeln - erst lesen, dann posten!

  • Groß- und Kleinschreibung verwenden
  • Längeren Sourcecode nicht im Text einfügen, sondern als Dateianhang

Formatierung (mehr Informationen...)

  • [c]C-Code[/c]
  • [avrasm]AVR-Assembler-Code[/avrasm]
  • [code]Code in anderen Sprachen, ASCII-Zeichnungen[/code]
  • [math]Formel in LaTeX-Syntax[/math]
  • [[Titel]] - Link zu Artikel
  • Verweis auf anderen Beitrag einfügen: Rechtsklick auf Beitragstitel,
    "Adresse kopieren", und in den Text einfügen




Bild automatisch verkleinern, falls nötig
Bitte das JPG-Format nur für Fotos und Scans verwenden!
Zeichnungen und Screenshots im PNG- oder
GIF-Format hochladen. Siehe Bildformate.
Hinweis: der ursprüngliche Beitrag ist mehr als 6 Monate alt.
Bitte hier nur auf die ursprüngliche Frage antworten,
für neue Fragen einen neuen Beitrag erstellen.

Mit dem Abschicken bestätigst du, die Nutzungsbedingungen anzuerkennen.