Forum: Mikrocontroller und Digitale Elektronik RE Bit Display EA DIP204-4 (KS0073)


von Gerd W. (egerd)


Lesenswert?

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

von Dieter F. (Gast)


Lesenswert?

Da

https://www.lcd-module.de/pdf/doma/dip204-4.pdf

ist die Nutzung des RE-Bits auf Seite 2 dargestellt.

Dort unter "extended function set"  NW=1: 4-line display.


Und dann kannst Du ggf. noch mal hier schauen:

Beitrag "Re: LCD EA DIP204-4 Initialisieren"

von egerd (Gast)


Lesenswert?

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?

von Dieter F. (Gast)


Lesenswert?

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.

von Karl B. (gustav)


Angehängte Dateien:

Lesenswert?

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

: Bearbeitet durch User
von Gerd W. (gerd_w)


Lesenswert?

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

von Dieter F. (Gast)


Lesenswert?

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):
1
 ldi  temp,0b00100100 ;4-bit RE=1
2
  rcall  lcd_command
3
4
  ldi  temp,0b00001001 ; 4 Zeilen-Modus
5
  rcall  lcd_command
6
7
  ldi  temp,0b00100000 ; 4-bit RE=0
8
  rcall  lcd_command

von Karl B. (gustav)


Lesenswert?

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

: Bearbeitet durch User
von Gerd W. (gerd_w)


Lesenswert?

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

von Uwe (Gast)


Lesenswert?

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.

von Karl B. (gustav)


Lesenswert?

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

: Bearbeitet durch User
von Dieter F. (Gast)


Lesenswert?

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

von Gerd W. (gerd_w)



Lesenswert?

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

von Dieter F. (Gast)


Lesenswert?

Hi,

Du kannst mich ruhig Dieter nennen :-)

Ich bin nicht der Assembler-Freak, aber das
1
; eigentliche Senderoutine für Init/Kommandos/Zeichen und Strings
2
3
Senden:                    ;High & Low Nibble senden (X = H oder L)
4
  andi   temp,0b1111_0000  ;XXXX_0000 Maske rechtes Nibble ausblenden
5
  or     temp,OR_Maske     ;XXXX_X1XX OR_Maske (Li/En=1/RW/DB x=1|0) 
6
  rcall  TWI_Send          ;Datenbyte mit E=H senden
7
  andi   temp,0b1111_1011  ;XXXX_X0XX AND_Maske (En=0)
8
  rcall  TWI_Send          ;Datenbyte mit E=0 senden
9
  ret

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.
1
LCD_TWI_INIT:
2
  ldi    or_Maske,0x0C
3
  ldi    count,0x03      ;3x wiederholen  
4
m1:  ldi    temp,0x30      ;8_Bit Modus  Li=0 EN=1 w=0  B=0
5
  rcall  Senden
6
  rcall  P_4ms        ;Pause 4ms 
7
  dec    count          
8
  brne  m1  
9
  rcall  P_4ms
10
11
;*** 4-Bit Modus senden (0x20) **********************
12
;*** und zusätzlich RE-Bit einschalten -> 0x24
13
  ;kein Restart, Bus bleibt belegt
14
  ldi    temp,0x24     ;4_Bit Modus RE=1
15
  rcall  Senden        ;senden
16
  rcall P_39us
17
18
;*** 4-Zeilig einschalten (kein inverser Cusor, 5-dot font width)
19
  ldi    temp,0x09     ;4-Zeilig einschalten
20
  rcall  Senden        ;senden
21
  rcall P_39us
22
23
;*** RE-Bit wieder ausschalten
24
  ldi    temp,0x20     ;4_Bit Modus RE=0
25
  rcall  Senden        ;senden
26
  rcall P_39us
27
28
  rcall  twi_Stop
29
  ret              ;nach LCD_TWI_INIT

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.

von Gerd W. (gerd_w)


Lesenswert?

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

: Bearbeitet durch User
von Karl B. (gustav)


Angehängte Dateien:

Lesenswert?

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

: Bearbeitet durch User
von Karl B. (gustav)


Lesenswert?

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

: Bearbeitet durch User
von Karl B. (gustav)


Angehängte Dateien:

Lesenswert?

Hi,
so sieht das LCD via den I2C/TWI-Portadapter die Signale.

viel Spaß

ciao
gustav

von Gerd W. (egerd)


Lesenswert?

Hallo an alle,

Vielen Dank für Eure Unterstützung, aber jetzt ruft erst mal der Garten.
Melde mich wieder, wenn ich weitergekommen bin.

egerd

von John (Gast)


Angehängte Dateien:

Lesenswert?

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.

von John (Gast)


Angehängte Dateien:

Lesenswert?

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
1
Autor: Gerd Wolf (egerd)
2
Autor: egerd (Gast)
3
Autor: Gerd Wolf (gerd_w)
4
Autor: Gerd W. (egerd)
ein und dieselbe Person?

von Dieter F. (Gast)


Lesenswert?

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

von egerd (Gast)


Lesenswert?

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

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.