Forum: Mikrocontroller und Digitale Elektronik 4 Zeiliges LCD teilt falsch auf, kurze Verständnissfrage


von Florian G. (suffix)


Lesenswert?

Hallo,

ich experimentiere gerade mit folgendem Display herum:

http://www.noritake-itron.com/Specs/CU-U/CU20049SCPB-W2J-01.pdf

Das Display funktioniert auch, jedoch klappt die Zeilenaufteilung nicht 
so ganz. Ich habe das Display schon einmal am Parallelport mit 
LCDSmartie als HD44780 betrieben, was auch wunderbar funktioniert hat. 
Am AVR beschreibt das Display (4x20) die Reihen nicht wie normal 
(1-2-3-4) sondern 1-3-2-4.


Was kann ich dagegen machen? Ich schreibe mal alles, was an das LCD an 
Kommandos geschickt wird:

Zuerst wird lt. dem Wiki Eintrag 3mal hintereinander 0b00110000 
geschickt.

Hier meine Verständnisfrage: Laut Datenblatt des HD44780 sendet das den 
Befehl, um den 8Bit-Modus einzustellen. Warum muss man das 3mal 
hintereinander senden? Was hat das für einen Sinn?

Dann kommt 0b00111000 für ein Display mit 2/4 Zeilen und den 
8-Bit-Modus, 5mal7 Font.

Dann 0b00001111 für Display und Coursor blinkend an.

Und dann noch 0b00000100 für Cursorpos. dekrementiern und Displayinhalt 
fest.

Dann wird das Display noch mit 0b00000001 gecleared und fertig.

Wieso bockt mein Display da so rum?

von Dirk H. (arm-dran)


Lesenswert?

schick mal dein prog, ich hatte die Dinger schon im Einsatz

von Joe (Gast)


Lesenswert?

Das bockt nicht, es ist normal. Also füge deinem Programm die 
entsprechenden Cursorpositionen hinzu.

von Manuel W. (manuel_wagesreither)


Lesenswert?

Hi!

Ich hatte lang nichts mehr mit dem HD44780 zu tun, kann daher viele 
deiner Schritte nicht ganz nachvollziehen.

Trotzdem vermute ich, dass dieser Link dir vielleicht weiter helfen 
könnte:
http://sprut.de/electronic/lcd/

von Sonic (Gast)


Lesenswert?

Hi,
das liegt daran, dass 2 40-Zeichen-Controller verwendet werden. Das 
heißt, das Ende der 1. Zeile wird am Anfang der 3. Zeile fortgesetzt. 
Der 2. Controller fängt in Zeile 2 an und wird in Zeile 4 fortgesetzt.
Hatte das gleiche Problem, ist verwirrend, geht aber ganz gut.

von Florian G. (suffix)


Angehängte Dateien:

Lesenswert?

Sowas ähnliches habe ich mir scho gedacht und befürchtet. Also 
Cursorposition spätestens nach jedem 20ten Zeichen neu setzen? Ist 
wenigstens die von 0-80 linear durchnumeriert? Also oben links eben 0 
und unten rechts 80? Und wie kann ich die dann setzten?

Mein Programm habe ich angefügt. Alle, die meine Schritte nicht 
nachvollziehen können, sollen mir bitte sagen wo genau, ich erkläre das 
dann. Und wenn einer weiß, warum man diese 8Bit Anweisung 3mal am Anfang 
senden muss, soll er sich bitte melden.

WICHTIGE ANMERKUNG: Die Funktionen sind alles abgeänderte Versionen des 
LCD-Tutorials hier im Wiki. Ich verstehe eben diese Anweisung von dort 
auch nicht ganz, das könntet ihr euch ja auch nochmal durchlesen.

von Michael U. (Gast)


Lesenswert?

Hallo,

die Zuordnung der internen Ram-Adressen hat a) der Controllerhersteller 
und b) teilweise der Displayhersteller getroffen.

"Und wenn einer weiß, warum man diese 8Bit Anweisung 3mal am Anfang
senden muss, soll er sich bitte melden."

Weil es der Hersteller so beschlossen hat (und sicher auch weiß, warum).

Ansonsten: Datenblatt des Display-Controllers nehmen, da steht alles 
wichtige drin.

Gruß aus Berlin
Michael

von Sonic (Gast)


Lesenswert?

Also bei meinem Display ist die Startadresse von Zeile 1 0x80. Dann kann 
ich bis zum Ende der Zeile 3 durchschreiben. Anfang Zeile 2 ist 0xC0 und 
kann bis Ende Zeile 4 duchgeschrieben werden.
Wie mein Vorredner sagte: steht alles im Datenblatt.

von Florian G. (suffix)


Lesenswert?

Also gut, dann werde ich mir jetzt das Datenblatt besorgen, dachte immer 
die Infos im Wiki wären ausreichend. Danke für eure Hilfe.

von Michael U. (Gast)


Lesenswert?

Hallo,

ja, die x*20-Zeichen-Dosplay sind üblicherweise so.
Bei x*16 fehlen dann hinten die 4 Zeichen, die Anfänge bleiben 
identisch.

Mir sind aber auch schon Exoten begegnet, ich habe ein 2x16, das ist als 
4x8 organisiert...

Durchgehenden Text über mehr als eine Zeile mußte ich noch nie ausgeben, 
so richtig stört es mich also nicht. ;)

Gruß aus Berlin
Michael

von Sonic (Gast)


Lesenswert?

>dachte immer die Infos im Wiki wären ausreichend.
Da wäre ich vorsichtig. Wiki ist auch nur ein Forum, da jeder dran 
ändern kann, also keine 100%ige Informationsquelle.

von Florian G. (suffix)


Lesenswert?

Naja ich hab die Adressen jetzt herausgefunden, war nicht ganz einfach 
ist auch nicht ganz logisch, aber funktioniert.

von Hannes L. (hannes)


Lesenswert?

Florian Glaser wrote:
> Naja ich hab die Adressen jetzt herausgefunden, war nicht ganz einfach
> ist auch nicht ganz logisch, aber funktioniert.

Muss ich das jetzt verstehen?

Bei den Text-LCDs, die mir bisher in die Finger kamen, war die Zuordnung 
der Adressen zu den Ausgabepositionen immer im Datenblatt angegeben.

Nur einmal stimmte es nicht, das war ein 8x24-LCD mit Controller 
MS50530, da war die korrekte Zuordnung aber schnell gefunden.

...

von Sonic (Gast)


Lesenswert?

Oft liegt's auch daran, wenn der Busy-Pin nicht ausgewertet wird, dass 
die Pausenzeiten zwischen den Befehlen zu kurz sind. Dann werden Zeichen 
'verschluckt' und die Positionierung stimmt nicht mehr. Die LCDs sind 
auch sehr Temperaturempfindlich, wenn's kalt wird werden die sehr Träge.

von Hannes L. (hannes)


Lesenswert?

Sonic wrote:
> Oft liegt's auch daran, wenn der Busy-Pin nicht ausgewertet wird, dass
> die Pausenzeiten zwischen den Befehlen zu kurz sind. Dann werden Zeichen
> 'verschluckt' und die Positionierung stimmt nicht mehr.

Das ist wahr.
Ich betreibe Text-LCDs inzwischen nur noch ohne Busy-Abfrage (einen 
"Busy-Pin" haben die von mir verwendeten LCDs nicht). Die Ausgabe des 
nächsten Zeichens erfolgt in der Mainloop nur dann, wenn ein sowiso 
laufender Timer das entsprechende Flag gesetzt hat. Da ich nicht so 
schnell lesen kann, passiert das alle zwei Millisekunden. Das normale 
Benutzerprogramm merkt davon nichts, denn es schreibt (mit LCD_DATA) 
nicht auf das LCD, sondern in einen "Bildschirmspeicher" im SRAM. Das 
geht sehr schnell und erfordert keine Wartezeiten. Das zyklisch 
aufgerufene LCD_UPDATE liest die Zeichen aus dem Bildschirmspeicher und 
gibt sie an das LCD aus. Dabei überprüft es die Zeilengrenzen im 
Bildschirmspeicher und positioniert bei Zeilenwechsel das LCD auf die 
neue Ausgabeposition (SET DD-RAM-ADRESS). Der Bildschirmspeicher ist 
somit ein Abbild der tatsächlichen Anordnung der Zeichen und ist anders 
organisiert als das LCD. Das geht hervorragend und ist recht effizient, 
geht also recht sparsam mit Rechenzeit um.

> Die LCDs sind
> auch sehr Temperaturempfindlich, wenn's kalt wird werden die sehr Träge.

Auch das stimmt.
Wenn man (bei Verzicht auf Busy-Abfrage) in der Zwischenzeit zwischen 
den Zeichenausgaben nicht in einer Warteschleife hängt (WAIT_MS xyz), 
sondern die anderen anstehenden Aufgaben erledigt, dann kostet es 
nichts, die Zeichenausgabe zu verlangsamen.

...

von Suffix (Gast)


Lesenswert?

das ist ganz einfach: es war deshalb nicht ganz einfach, da der 
hersteller meines displays, noritake itron, nur eine art beipackzettel 
herausrückt ein vollständiges datenblatt muss man beantragen und ich 
bekam bis jetzt nie eine antwort. nur dort stehen auch die adressen 
drin.

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.