ich befasse mich seit einiger Zeit damit, ein 4 Zeilen Display zum
"Laufen"
zu bekommen bringen.
Ich verwende das o.g. Display über einen TWI-Portexpander PCF 8574.
Die Initialisierung funktioniert m.E. nach, denn ich kann Zeichen und
Strings am LCD-Display ausgeben.
Nur die Einstellung des 4-Zeilen Modus gelingt mir nicht ?????.
Ich habe bisher noch nichts gefunden (Datenblatt des LCD' s / Foren
etc.)
wo das Ein und Ausschalten des RE Bits im Beispiel dargestellt wird.
Zeichen und Strings kann ich zwar anzeigen, aber nur, wenn ich für die
Zeilenanfangspositionen $06/$C0/$94/$D4 (je für Zeile 1-4) als Zeilen-
Code sende. Mit $0/$20/$40/$60 springt der Cursor an undefinierte
Stellen bzw. es werden wirre Zeichen angezeigt oder die
Zeichenhintergründe werden hell.
Das Tutorial und die Foren Beiträge habe ich auch schon gefunden und
studiert, nur bisher nicht den entscheidenden Hinweis auf dieses ominöse
RE-Bit. Finde ich irgendwo ein Codebeispiel in ASS. Die TWI-Ansteuerung
ist nicht das Problem.
Programmiert habe ich das Ganze in Assembler mit AVR Studio-4.
Danke im Voraus für Eure Hilfe
egerd
Daran habe ich mich ja auch orientiert, es hat aber nichts gebracht.
Dieses Re-Bit kann ich doch erst aktivieren, wenn ich im 4-Bit Modus
bin, oder sehe ich das falsch?
egerd schrieb:> Dieses Re-Bit kann ich doch erst aktivieren, wenn ich im 4-Bit Modus> bin, oder sehe ich das falsch?
Das hat erstmal nichts mit dem 4-Bit-Modus zu tun. Du kannst es
aktivieren - dann steht Dir der erweiterte Modus zur Verfügung - und
natürlich auch wieder deaktivieren.
Aber nur wenn Du im erweiterten Modus bist /RE-Bit ist gesetzt) kannst
Du den 4 Zeilen-Modus (ungleich 4-Bit-Modus) aktivieren.
Das RE-Bit wird mit "Function Set" ein- und ausgeschaltet. Du solltest
es auch nur dann einschalten, wenn Du es benötigst und danach gleich
wieder ausschalten.
Gerd W. schrieb:> Zeichen und Strings kann ich zwar anzeigen, aber nur, wenn ich für die> Zeilenanfangspositionen $06/$C0/$94/$D4 (je für Zeile 1-4) als Zeilen-> Code sende. Mit $0/$20/$40/$60 springt der Cursor an undefinierte> Stellen bzw. es werden wirre Zeichen angezeigt oder die> Zeichenhintergründe werden hell.
Hi,
ist für mich jedenfalls völlig normal, dass man (mit wenigen Ausnahmen)
"Locate"-Anweisungen der eigentlichen Daten/Text-Ausgabe voranstellt.
Der Adressbereich der HD44780-kompatiblen Controller ist nicht für jedes
Display so, dass der 80 Byte grosse Pufferbereich auch dargestellt wird.
"...Da das Display oft kleiner als der Textpuffer ist, wird oft nur ein
Ausschnitt des Puffers angezeigt..."
http://www.sprut.de/electronic/lcd/index.htm#adressen
ciao
gustav
Hallo Gustav,
anhand deines beigefügten Bildes erkenne ich die gleichen
Zeilen-Adressen
welche ich auch durch Probieren auch herausbekommen habe, aber nicht
0h,20h,40h,60 was für den 'echten' 4_Zeilen Modus eingestellt werden
sollte. wobei bei sprut.de wieder ganz andere Adressen angezeigt werden.
Irgendwie werde ich daraus nicht schlau.
Den 4_Zeilen Modus kann ich doch nur im 4-Bit Modus am LCD einstellen,
wenn ich dort das RE Bit einschalte und danach wieder ausschalte,
denn der Befehl für das Einschalten ist doch 0b0010_0100, also 0x24
dann 0x09 für den 4-Zeilen Modus und dann wieder 0x20 zum Ausschalten
des
RE-Bits. Dort brauche ich ja sowohl das High und das Low Nibble, um
dieses
Bit zu aktivieren.
oder sehe ich das falsch?
Bitte weiterhin um Hilfe, das muss doch funktionieren
Gerd W. schrieb:> oder sehe ich das falsch?
Liest Du eigentlich, was ich Dir schreibe?
RE-Bit einschalten (unabhängig vom 4- oder 8-Bit-Modus)
"Function Set" RS 0, RW 0, 0b001xx1xx (x = egal, je nach Wunsch)
Umschalten auf 4-zeilig
"extended Function Set" RS 0, RW 0, 0b00001xx1 (x = egal ...)
RE-Bit ausschalten (unabhängig vom 4- oder 8-Bit-Modus)
"Function Set" RS 0, RW 0, 0b001xx0xx (x = egal, je nach Wunsch)
Im von mir verlinkten Beitrag wird genau das gemacht (halt im
4-Bit-Modus, weil der Poster den 4-Bit-Modus gewählt hat):
Gerd W. schrieb:> Programmiert habe ich das Ganze in Assembler mit AVR Studio-4.
Hi,
der komplette Initit-Code als Anhang gäbe Aufschluss.
Vielleicht ist da noch eine Kleinigkeit übersehen worden.
(Bei I2C kann die häufigste Fehlerquelle:
Falsche Portbitzuordnung (Ena, Rs, RW)
wohl ausgeschlossen werden.)
Dieter F. schrieb:> rcall lcd_command
wie sieht das aus im Code?
Gerd W. schrieb:> RE-Bits. Dort brauche ich ja sowohl das High und das Low Nibble, um> dieses> Bit zu aktivieren.
Es werden stets beide Nibble benötigt, sie werden lediglich gemäß den
Anforderungen des Controller-Standards nacheinander gesendet. HD44780
und kompatible verlangen erst das high nibble, dann das low nibble. Von
der MCU aus gesehen. Auch beim PIC TWI Portadapter ist das so. Nur die
Steuerbits sind verpackt, verundet bzw. verodert und verlangen evtl-
nach einer Extra-Ausgabe.
Beitrag "Re: Anfänger Will ATtiny2313 mit Display uber I2C verbinden"
ciao
gustav
Hallo Jim,
ich habe das schon gelesen, aber ich kann dem nicht ganz folgen (bin ja
wohl auch nicht der Einzige, der mit dem Erweiterungsbit Probleme hat)
Im 8-Bit Modus kann ich das RE-Bit nicht einschalten, da ja das
Low-Nibble
(D0-D3 vom LCD) immer auf Gnd liegt, hab' s trotzdem probehalber
natürlich ohne Erfolg probiert.
Aber auch im 4-Bit Modus wird Zeile 1 und 3 weiß, d.h. ich komme m.E.
nicht in den 4_Zeilen Modus.
Vielleicht sollte ich mal meinen Code posten, ist aber bedingt durch die
Ansteuerung über das Portexpander-TWI-Modul PCF 8574 ist das etwas
unübersichtlicher als direkt über einen Port zu programmieren.
Ich kann wie schon mehrfach gesagt, Zeichen und Strings darstellen und
auch platzieren nur halt nicht an den Startpositionen 0h,20h,40h,60h und
die weiteren Möglichkeiten nutzen, die man nach erfolgreicher
Zuschaltung des RE-Bits noch hat.
Habt trotzdem vielen Dank für Eure Unterstützung und vielleicht noch ein
paar Hinweise.
Danke im Voraus egerd
Hi,
>Im 8-Bit Modus kann ich das RE-Bit nicht einschalten, da ja das>Low-Nibble (D0-D3 vom LCD) immer auf Gnd liegt
Kopfschüttel, wie kommst du darauf das im 8 Bit Modus D0-D3 auf GND
sind?
Die must du schon ansteuern.
Nee nee, Ideen haben die Leute.
Gerd W. schrieb:> ist aber bedingt durch die> Ansteuerung über das Portexpander-TWI-Modul PCF 8574 ist das etwas> unübersichtlicher als direkt über einen Port zu programmieren.
Hi,
die Steuerzeichensequenzen für die Initialisierung sind aber dieselben.
Schau 'mal:
Beitrag "Re: Anfänger Will ATtiny2313 mit Display uber I2C verbinden"Uwe schrieb:> Kopfschüttel, wie kommst du darauf das im 8 Bit Modus D0-D3 auf GND> sind?
Von wo aus gesehen?
Von der MCU aus oder vom LCD aus.
Der MCU-Port kann "verdreht" werden, wird PortD beim ATtiny4313
genommen,
muss man das sogar, denn der hat ein Bit weniger - nur 7-Bit Breite.
Diese Portbitzuordnung wird durch die Software (das ASM-Programm)
vorgenommen. So ist das Swappen mal im ersten Durchgang, anderweitig im
zweiten Durchgang.
Oder die Initroutine $03 oder $30.
ciao
gustav
Gerd W. schrieb:> Im 8-Bit Modus kann ich das RE-Bit nicht einschalten, da ja das> Low-Nibble> (D0-D3 vom LCD) immer auf Gnd liegt, hab' s trotzdem probehalber> natürlich ohne Erfolg probiert.
Wie wäre es, wenn Du mal Deinen Anschluss postest - also welcher Pin des
PCF8574 ist mit welchem Pin des DIP204-4 verbunden.
Langsam beschleicht mich das Gefühl, dass Du tatsächlich im 4-Bit-Modus
arbeitest. In diesem Fall ist es ja auch O.K., dass D0 bis D3 auf GND
liegen. Dann musst Du halt "nibble-weise" übertragen.
Und ja - Dein Code wäre schon hilfreich ... dann könnte man sehen, ob Du
alles korrekt machst ...
hallo,
ich habe meine LCD_TWI.asm und den Anschlussplan des LCD' s an den PCF
8574 mal angefügt, hoffe, das es funktioniert. Bin neu im Forum.
Die LCD Pins D0-D3 sind nicht wie ich dachte auf GND gelegt, sondern
nicht am PCF 8574 angeschlossen auch nicht mit Widerstand nach 5V, was
aber auf das gleiche hinausläuft. (siehe Anschlussplan).
hoffe, man kann damit was anfangen
passt für mich nicht mit der KS0073-Spezifikation zusammen.
Enable wird erst gesetzt, wenn die Daten am LCD-Port anliegen (und muss
mindestens 800 ns gehalten werden). Das Halten wird wohl ausreichend
durch die TWI_Send-Routine erfolgen - aber Du legtst nicht erst die
Daten an und gibst dann das Enable-Signal - Du sendest beides
gleichzeitig.
Mir fehlen auch die mindestens 20ms Wartezeit nach dem Einschalten.
Wenn Du das korrigiert hast kannst Du aus meiner Sicht in der
Initialisierung den 4-Zeilen-Modus unmittelbar nach dem 4-Bit-Modus
setzen.
Die P_39us habe ich dazu erfunden - die solltest Du einrichten. Gelten
für fast alle Befehle, ausser "Clear Display" und "Return Home" - die
brauchen 1,52 ms Wartezeit.
Hallo Dieter,
vielen Dank für deine Hinweise, ich werde die Pausen mal einbauen und
die Routinen nach deinen Vorschlägen versuchen anzupassen.
Das muss doch mal funktionieren. Durch die TWI-Ansteuerung ist halt
alles etwas komplizierter und ich bin auch nicht mehr der jüngste.
Ist schon gut, wenn ein Zweiter sich die Sache mal ansieht, irgendwo
kommt man sonst an einem Punkt nicht weiter.
Also erst mal danke, ich werde es weiter austesten.
Gerd
Hi,
Glaube nicht, dass man mit Zeitschleifen das Problem löst. Die LCDs sind
da doch nicht so langsam wie vermutet.
Die Verzögerungen müssen nur dann eingefügt werden, wenn man die
Verarbeitungszeit abwartet (- interne Taktfrequenz des LCD liegt bei ca.
250 kHz!). Zum sicheren Anlegen der Daten am Port ist das Timing völlig
unkritisch. Hauptsache der Enable-Impuls kommt nach Anlegen der Daten an
den Port, und bis zur fallenden Flanke, die das LCD triggert, sind es ja
noch ein paar NOPs mehr.
Und die TWI/USI-Routinen sorgen allein schon für ausreichend lange
Pausen.
Bei mir sieht das dann bei ca. 4 MHz Taktfrequenz so aus.
Zur Not reichen auch ein paar NOPs.
Nehme an, die Befehlsfolgen als solche stimmen nicht mit denen überein,
auf die das aktuelle LCD reagiert. Die Dokus sind auch oft nicht auf dem
neuesten Stand.
Die 8-Bit-Initialisierung ist eine absolute "quick and dirty Lösung",
wenn
man nicht weiter weiß. Und mit höheren MCD-Taktfrequenzen Probleme
vermutet.
ciao
gustav
Gerd W. schrieb:> Das muss doch mal funktionieren. Durch die TWI-Ansteuerung ist halt> alles etwas komplizierter
Hi,
der einzige Unterschied ist, dass man beim TWI (USI) die Steuerbits R/W,
RS, Enable nicht durch "einfaches" sbi/cbi Portbitsetzen/löschen
verändern kann.
(Weil man ja nicht auf diese Portbits physisch zugreifen kann.)
Man verpackt diese Bits in ein Achtbit-Format und macht eine
Extra-Ausgabe dafür. Das heißt, die Bits werden ausmaskiert (ori für
log. Eins und andi für log. Null).
Damit das nicht mit den eigentlichen Daten kollidiert,
muss man zwingend im Vierbit-Modus arbeiten.
Von vorne herein sind die Portbits D0 bis D3 am PIC Portadapter nicht
beschaltet.
Beim Enable-Impuls wird also zweimal gesendet. Einmal mit
ausmaskierter "Eins" und nach den NOPs (1000 ns) mit der ausmaskierten
"Null".
ciao
gustav
Dieter F. schrieb:> passt für mich nicht mit der KS0073-Spezifikation zusammen.>> Enable wird erst gesetzt, wenn die Daten am LCD-Port anliegen (und muss> mindestens 800 ns gehalten werden). Das Halten wird wohl ausreichend> durch die TWI_Send-Routine erfolgen - aber Du legtst nicht erst die> Daten an und gibst dann das Enable-Signal - Du sendest beides> gleichzeitig.
Enable darf sogar auf high gesetzt werden bevor die Daten anliegen,
und das beliebig lange.
Laut Datenblatt vom KS0073 müssen nur RS und R/W gesetzt sein bevor E
auf high gesetzt wird.
Die Daten werden mit der fallenden Flanke von E übernommen. Es reicht
wenn die gültigen Daten min. 300ns vor der fallenden Flanke von E
anliegen.
Deine Initialisierung sieht so aus wie meine:
- Drei (pseudo) 8-bit Befehle um sicher in den 8-bit-Modus zu schalten:
1
0x3
2
0x3
3
0x3
- ein (pseudo) 8-bit Befehl um in den 4-bit-Modus zu schalten:
1
0x2
- restliche Initialisierung (Ausgabe: High-Nibble dann Low-Nibble):
1
0x24 ; 4 bit Datenlänge, extension Bit RE=1
2
0x09 ; 4 Zeilen Modus
3
0x20 ; 4 bit Datenlänge, extension Bit RE=0
4
0x0C ; Display ein, Cursor aus, blinken aus
5
0x06 ; Cursor Auto-Increment
Gerd W. schrieb:> Zeichen und Strings kann ich zwar anzeigen, aber nur, wenn ich für die> Zeilenanfangspositionen $06/$C0/$94/$D4 (je für Zeile 1-4) als Zeilen-> Code sende. Mit $0/$20/$40/$60 springt der Cursor an undefinierte> Stellen bzw. es werden wirre Zeichen angezeigt oder die> Zeichenhintergründe werden hell.
Bist du sicher, dass es sich bei deinem LCD-Modul, wie im Betreff
angegeben, um ein EA DIP204-4 handelt?
Das EA DIP204-4 lässt sich direkt über SPI ansteuern. Hast du an deinem
Controller kein SPI mehr frei, oder warum nimmst du den Umweg über einen
I2C-Portexpander?
PS.:
Sind eigentlich
John schrieb:> Enable darf sogar auf high gesetzt werden bevor die Daten anliegen,> und das beliebig lange.
Da muss ich Dir Recht geben - die fallende Flange ist entscheident.
Ich suche mir eine Ecke, in welcher ich mich schämen kann ...
Gerd W. (egerd) bin ich (auch die anderen), hatte mich zuerst in einem
anderen Thread als Gast angemeldet.
Zu SPI, den Portexpander hatte ich schon am LCD angelötet, nachdem ich
das Teil gekauft hatte und möchte es ungern wieder alles entlöten.
Jetzt mache ich erst mal Sommerpause (Garten). Danach werde ich mich
weiter damit befassen.
Also nochmals Dank für Eure Tipps. Ich melde mich wieder.
egerd