Forum: Mikrocontroller und Digitale Elektronik altes 40x4 LCD - Zeile 2 und 4 ohne Ausgabe


von Andy W. (gastandy)


Angehängte Dateien:

Lesenswert?

Hallo zusammen,

ich teste gerade -nur mit Teilerfolg- ein altes LCD 40x4. Das Display 
hat zwei HD44780 drauf und verfügt über zwei separate Enable-Pins, d.h. 
ein HD bedient Zeile 1+2 mit 40x2 Zeichen, der andere Zeile 3+4.

Leider bekomme ich bei beiden nur die erste Zeile angesteuert, also 
Zeile 1 und 3 des Displays, Zeile 2 und 4 bleiben immer leer.
Seltsamerweise bekomme ich generell auch nur eine Displayausgabe, wenn 
mit 0x30 (einzeilig) initialisiert wird. Initialisiere ich mit 0x38 
(zweizeilig), so wie ich es eigentlich erwarten würde, bleiben auch 
Zeile 1 und 3 leer.

Meine Adressen zum Setzen des Cursors vorm Schreiben sind 0x80 für Zeile 
1(3) und 0xC0 für Zeile 2(4). Ich habe aber auch schon mit anderen 
Werten getestet - alles ohne Erfolg.

Ich bin jetzt echt ratlos. Habt Ihr noch eine Idee?

MFG
Andy

von Jörg R. (solar77)


Lesenswert?

Andy W. schrieb:
> ich teste gerade -nur mit Teilerfolg- ein altes LCD 40x4. Das Display
> hat zwei HD44780 drauf und verfügt über zwei separate Enable-Pins, d.h.
> ein HD bedient Zeile 1+2 mit 40x2 Zeichen, der andere Zeile 3+4.
>
> Leider bekomme ich bei beiden nur die erste Zeile angesteuert, also
> Zeile 1 und 3 des Displays, Zeile 2 und 4 bleiben immer leer.

> Ich bin jetzt echt ratlos. Habt Ihr noch eine Idee?

Als erstes würde ich mal die 2 Enable-Anschlüsse für die Ansteuerung 
vertauschen und schauen ob es eine Veränderung gibt.

Ansonsten würde ich einen Logic Analyzer verwenden und die 
Initialisierung prüfen.

Oder hast du ggf. ein 2tes baugleiches Display um die Initialisierung zu 
testen?

: Bearbeitet durch User
von Michael B. (laberkopp)


Lesenswert?

Andy W. schrieb:
> Meine Adressen zum Setzen des Cursors vorm Schreiben sind 0x80 für Zeile
> 1(3) und 0xC0 für Zeile 2(4). Ich

Die Cursoradresse sollte 0 und 0x40 sein, die 0x80 und 0xC0 ergeben sich 
nur durch das Kommando Set_CURSOR 0x80 verodert mit der Adresse.

Im FUNCTION_SET Kommando muss halt N auf 1 sein damit es 2-zeilig wird.

: Bearbeitet durch User
von Andy W. (gastandy)


Angehängte Dateien:

Lesenswert?

Jörg R. schrieb:
> Als erstes würde ich mal die 2 Enable-Anschlüsse für die Ansteuerung
> vertauschen und schauen ob es eine Veränderung gibt.

Ich habe beim Test immer nur einen Enable-Pin angeschlossen. Nach dem 
Umlöten habe ich bei den anderen beiden Zeilen dann das gleiche 
Verhalten.

Michael B. schrieb:
> Im FUNCTION_SET Kommando muss halt N auf 1 sein damit es 2-zeilig wird.

Genau, dieses Bit entscheidet ob einzeilig (Init mit 0x30) oder 
zweizeilig (Init mit 0x38).

ABER: Bei 0x38 bleibt das Display komlett leer, das ist mein Problem!

von Carsten S. (dg3ycs)


Lesenswert?

Hi,

Andy W. schrieb:
> ich teste gerade -nur mit Teilerfolg- ein altes LCD 40x4. Das Display
> hat zwei HD44780 drauf und verfügt über zwei separate Enable-Pins, d.h.
> ein HD bedient Zeile 1+2 mit 40x2 Zeichen, der andere Zeile 3+4.

Andy W. schrieb:
> Ich habe beim Test immer nur einen Enable-Pin angeschlossen. Nach dem
> Umlöten habe ich bei den anderen beiden Zeilen dann das gleiche
> Verhalten.

Also du hast die Enable Pins Vertauscht und nun sind die Zeilen aktiv 
die vorher Leer waren und umgekehrt?

Wenn ja, dann würde ich einfach mal davon ausgehen das deine Vermutung 
das 1 HD für die Zeilen 1+2 und der andere 3+4 macht falsch ist.
Dann wird es eher so sein das der erste HD die Zeilen 1+3 bedient und 
und der zweite dann die Zeilen 2+4.

So eine Zuordnung ist im übrigen gar nicht mal so unüblich wenn zwei 
Treiber/Steuerungen/was auch immer auf vier Einheiten verteilt wirken.
Auch Abseits von LCD.

Das heisst du musst das LCD wie zwei getrennte zweizeilige LCD 
Behandeln. Die Auswahl auf welches "Zweizeilige" LCD du schreibst machst 
du mit der Enable Leitung

Gruß
Carsten

von Peter L. (pelikan)


Lesenswert?

gans einfach!
Du kannst 20x4 initialisieren?
Also z.B. mit

  RS  = 0;

  Set( 0x38 );

  Set( 0x38 );

  Set( 0x38 );

  Set( 0x08 ); // Display off

  Set( 0x01 ); // löschen

  Set( 0x06 ); // Entry Mode Set cursor right DDRAM+1

  Set( 0x0C ); // Display on

  RS  = 1;

Das wird auf LCD_EN ausgegeben.

Bei 40x4 wird das auf LCD_EN1 UND LCD_EN2 gleichzeitig ( in der Function 
Set ) ausgegeben.

Bei der Zeichenausgabe werden die ersten 80 Zeichen an LCD_EN1 und die
zweiten 80 Zeichen an LCD_EN2 ausgegeben.

von Carsten S. (dg3ycs)


Lesenswert?

Ähh...

Ignoriere meinen vorherigen Beitrag, ich glaube ich habe den 
Eröffnugnsbeitrag falsch verstanden!
Kann nur nicht mehr Löschen...

Gruß
Carsten

von Andy W. (gastandy)


Lesenswert?

Nur um Missverständnisse auszuschließen, versuche ich nochmal 
zusammenzufassen, was ich bisher gemacht habe:

1) Die verwendete Routine zur Initialisierung ist eine bereits 
funktionierende von einem  doppelzeiligen Display  (wie von Peter L im 
Prinzip beschrieben).

2) Mir ist bewusst, daß ich das 4x40 LCD durch die zwei Enable-Pins wie 
zwei getrennte 2x40 handeln muss.

3) Mit Enable 1 angeschlossen und der funktionierenden Routine von 1) 
kann ich mit 0x30 beim Init Zeile 1 ansteuern, Zeile 2+3+4 bleiben leer. 
Initialisiere ich mit 0x38 bleibt das ganze LCD leer.

4) Mit Enable 2 angeschlossen und der funktionierenden Routine von 1) 
kann ich mit 0x30 beim Init Zeile 3 ansteuern, Zeile 1+2+4 bleiben leer. 
Initialisiere ich mit 0x38 bleibt das ganze LCD leer.

Ich ändere also nur den Wert beim Init, alles andere bleibt gleich.
Das Setzen der Cursorposition bei 3) und 4) immer 0x80 für erste Zeile 
und 0xC0 für zweite, wobei ich da, wie bereits erwähnt, schon 
verschiedene Werte getestet habe.

von Daniel S. (supernova01)


Lesenswert?

Was passiert wenn du es einzeilig initialisierst und mehr als 40 Zeichen 
schickst?

Vielleicht sind es ja zwei einzeilige Displays mit 1x80 Zeichen...

von Andy W. (gastandy)


Lesenswert?

Daniel S. schrieb:
> Was passiert wenn du es einzeilig initialisierst und mehr als 40 Zeichen
> schickst?
>
> Vielleicht sind es ja zwei einzeilige Displays mit 1x80 Zeichen...

Das habe ich auch schon probiert, in der Hoffnung irgendwann auch in die 
andere Zeile zu schreiben - leider auch erfolglos, d.h. ab Zeichen 41 
wird nichts angezeigt.

von Dieter W. (dds5)


Lesenswert?

Zwischen einzeilig und zweizeilig muss man bei manchen Displays den 
Kontrast merklich ändern.

von Peter L. (pelikan)


Lesenswert?

welcher Controller  und 4 oder 8Bit Ansteuerung?
Da ich aber ein -2 bekommen habe, bin ich raus.

von Andy W. (gastandy)


Lesenswert?

Dieter W. schrieb:
> Zwischen einzeilig und zweizeilig muss man bei manchen Displays den
> Kontrast merklich ändern.

Interessanter Punkt: Bei diesem Display muss ich das Kontrastpoti fast 
auf Anschlag stellen, damit die Schrift der einen Zeile sichtbar wird. 
Die Einstellung "alles schwarz" bekomme ich überhaupt nicht hin. Die 
Ansteuerung des Displays läuft mit 5V, Kontrast am Schleifer, Poti 
zwischen 5V und GND.

Muss an den Kontrastpin evtl. eine andere Spannung angelegt werden, d.h. 
>5V oder <0V ?

von Jörg R. (solar77)


Lesenswert?

Peter L. schrieb:
> welcher Controller  und 4 oder 8Bit Ansteuerung?

Standardcontroller HD44780, 2 Stück. Ist auf dem, nicht so guten Foto, 
zu erkennen.

von H. H. (hhinz)


Lesenswert?

Andy W. schrieb:
> Muss an den Kontrastpin evtl. eine andere Spannung angelegt werden, d.h.
>>5V oder <0V ?

Durchaus -8V gegen Vcc, also bei 5V Versorgung -3V gegen GND.

von Andy W. (gastandy)


Lesenswert?

H. H. schrieb:
> Durchaus -8V gegen Vcc, also bei 5V Versorgung -3V gegen GND.

Das ist vielleicht die Lösung. Ich teste das morgen. Heute isses etwas 
zu spät dafür. Melde mich dann wieder nach dem Test!

MFG
Andy

von Lothar M. (Firma: Titel) (lkmiller) (Moderator) Benutzerseite


Lesenswert?

Andy W. schrieb:
> Muss an den Kontrastpin evtl. eine andere Spannung angelegt werden,
> d.h. >5V oder <0V ?
Die Kontrastspannung ist auf Vcc spezifiziert und kann bei alten 
Displays locker mal -7V und bei Weittemperaturdisplays bis zu -9V 
betragen.

Dazu 5V Versorgungsspannung dazuaddiert ergibt -2V..-4V gegen GND.

: Bearbeitet durch Moderator
von H. H. (hhinz)


Lesenswert?

Lothar M. schrieb:
> Andy W. schrieb:
>> Muss an den Kontrastpin evtl. eine andere Spannung angelegt werden,
>> d.h. >5V oder <0V ?
> Die Kontrastspannung ist auf Vcc spezifiziert und kann bei alten
> Displays locker mal -7V und bei Weittemperaturdisplays bis zu -9V
> betragen.
>
> Dazu 5V Versorgungsspannung dazuaddiert ergibt -2V..-4V gegen GND.

Der HD44780 verträgt sogar -13V gegen Vcc.

von Michael B. (laberkopp)


Lesenswert?

Andy W. schrieb:
> ABER: Bei 0x38 bleibt das Display komlett leer, das ist mein Problem!

Aha, also nimmt er das Kommando nicht an, 4-bit mode ?

von Jobst M. (jobstens-de)


Lesenswert?

Die 4x40 Displays, die ich bisher in der Hand hatte, wollten die 80 
Zeichen direkt hintereinander für die beiden Zeilen haben.

Meine init:

0x30
0x30 ; 3x natürlich - ich hoffe, dass machst Du auch!
0x30
0x20 ; -> 4Bit (entfällt bei 8 Bit)

0x28 ; 2 Zeilen, 5x7 Pixel (0x38 im 8 Bit Mode)
0x0C ; Display an
0x04 ; Nicht schieben
0x01 ; Tafeldienst


Michael B. schrieb:
> 4-bit mode ?

Ich hatte kurz auch die Idee, dass Leitungen vertauscht sind.

Aber beides kann nicht sein, wenn er es schafft Text darzustellen.


Andy W. schrieb:
> Ich bin jetzt echt ratlos. Habt Ihr noch eine Idee?

Ja! Zeig Deinen Code!
(Wieso hat noch niemand danach gefragt?)

Gruß
Jobst

von Daniel S. (supernova01)


Lesenswert?

Jobst M. schrieb:
> wollten die 80
> Zeichen direkt hintereinander für die beiden Zeilen haben.

Deswegen:

Daniel S. schrieb:
> Was passiert wenn du es einzeilig initialisierst und mehr als 40 Zeichen
> schickst?

Andy W. schrieb:
> Das habe ich auch schon probiert, in der Hoffnung irgendwann auch in die
> andere Zeile zu schreiben - leider auch erfolglos, d.h. ab Zeichen 41
> wird nichts angezeigt.

Jobst M. schrieb:
> Ja! Zeig Deinen Code!
> (Wieso hat noch niemand danach gefragt?)

Wahrscheinlich weil:

Jobst M. schrieb:
> er es schafft Text darzustellen.

von Rainer W. (rawi)


Lesenswert?

Andy W. schrieb:
> Das habe ich auch schon probiert, in der Hoffnung irgendwann auch in die
> andere Zeile zu schreiben - leider auch erfolglos, d.h. ab Zeichen 41
> wird nichts angezeigt.

Wie viele Zeichen hast du denn probiert? Ohne Code ist das alles etwas 
schwammig.
Was passiert, wenn du mehr als 64 Zeichen schickst?

von Armin K. (-donald-) Benutzerseite


Lesenswert?

Das Problem hatte ich auch schonmal, es waren im Endeffekt nur die 
Adressen der Zeilen.

von Gerald B. (gerald_b)


Lesenswert?

Guck doch mal, wie es Arduino macht. Die LiquidCrystalFast Lib kann mit 
40 x 4 umgehen. Runterladen und unter die "Haube" gucken ;-)
Hab ich selber schon mal genutzt.

von Daniel S. (supernova01)


Lesenswert?

Andy W. schrieb:
> Ich habe beim Test immer nur einen Enable-Pin angeschlossen.

Was hast du eigentlich mit dem anderen Enable Pin gemacht? offen 
gelassen? Wenn ja, Pins beim LCD nie offen lassen...sprich, wenn 
ungenutzt dann auf GND oder Vcc legen.

Gilt bei 4-Bit betrieb für die anderen vier Bits und natürlich auch für 
unbenutzte Enable Pins.

Ist nach vor der Kontrastthematik Fehlerklassiker Nummer eins bei diesem 
Thema...

: Bearbeitet durch User
von Ob S. (Firma: 1984now) (observer)


Lesenswert?

Rainer W. schrieb:

> Wie viele Zeichen hast du denn probiert? Ohne Code ist das alles etwas
> schwammig.
> Was passiert, wenn du mehr als 64 Zeichen schickst?

Ganz genau. Es gibt etliche Displays mit vier Zeilen und zwei 
Controllern, die aber jeweils im Einzeilen-Modus betrieben werden 
wollen. Die RAM-Adressen der (physischen) zweiten Zeile beginnen dann 
oft bei 0x40, also 64 dezimal.

Er hat allerdings nach eigener Aussage schon erfolglos versucht, den 
Cursor dorthin zu setzen.

Dann mus man halt etwas kreativ sein. Cursor auf 0 setzen und dann 
Zeichen rausballern bis zum Wrap-Around, bis also das erste Zeichen im 
Display überschrieben wird. Dann sollte auch in der zweite Zeile was 
erschienen sein. Wenn man das Schema der auszugebenden Zeichen sinnvoll 
wählt, kann man aus der Ausgabe direkt die Adresse der zweiten Zeile 
ablesen.

Spannend wird es, wenn der Wrap-Around zwar erfolgt, die zweite Zeile 
aber trotzdem leer bleibt. Dann liegt wahrscheinlich der Fall vor, dass 
die Controller zweizeilig zu initialisieren wären. Das sollte man dann 
tuen, und erneut die Ausgabe wie oben laufen lassen. Dann halt von 
beiden Zeilen die Startadressen ablesen, denn die erste beginnt ja dann 
offensichtlich nicht bei 0.

Auch solche Displays gibt's tatsächlich. Allerdings eher nur bei 
kürzeren Zeilen mit 16 Zeichen oder noch weniger.

von Andy W. (gastandy)


Lesenswert?

Hallo zusammen,

das Problem ist gelöst: Das Display braucht am Kontrastpin eine negative 
Spannung von ca. -1,5V. Es reicht also nicht das Poti zwischen 5V und 
GND zu hängen, wie bei neueren LCDs. Macht man das trotzdem, bleibt das 
Display bei korrektem 2-Zeilen-Init leer und man denkt natürlich gleich, 
daß es irgendwo einen Fehler in der Ansteuerung gibt...

DANKE an alle Poster und natürlich speziell an den/die Hinweisgeber 
bezüglich der Kontrastspannung!

MFG
Andy

von Daniel S. (supernova01)


Lesenswert?

Daumen hoch, auch für die Rückmeldung!

von H. H. (hhinz)


Lesenswert?

Jobst M. schrieb:
> Zeig Deinen Code!
> (Wieso hat noch niemand danach gefragt?)

Weils ziemlich offensichtlich an der Kontrastspannung lag.

von Dieter W. (dds5)


Lesenswert?

Die Programmfehler-Fraktion war ihrer Sache so sicher, dass meine erste 
vorsichtige Erwähnung der Kontrastspannung gleich ein Minus kassiert hat 
- typisch für dieses Forum.

von Ob S. (Firma: 1984now) (observer)


Lesenswert?

H. H. schrieb:
> Jobst M. schrieb:
>> Zeig Deinen Code!
>> (Wieso hat noch niemand danach gefragt?)
>
> Weils ziemlich offensichtlich an der Kontrastspannung lag.

Also so offensichtlich fand ich das jetzt nicht. Offensichtlich wäre es 
gewesen, wenn der TO mal ein Foto mit nicht initialisierten Controllern 
gepostet hätte. Dann wäre die Sache sofort klar gewesen.

von Daniel S. (supernova01)


Lesenswert?

Ob S. schrieb:
> wenn der TO mal ein Foto mit nicht initialisierten Controllern
> gepostet hätte.

Den sieht man das auf einem Foto aber nicht an, bleibt eine schwarze 
Box. Zudem hat er sie ja initialisiert bekommen...

Dieter W. schrieb:
> gleich ein Minus kassiert hat

Warum lässt man sich dadurch so beeinflussen dass es dafür reicht es 
hier noch mal extra zu thematisieren - ich habe schon Antworten mit 10 x 
Plus gesehen die sich als völlig falsch herausgestellt haben... Das mit 
den Bewertungen ist doch völlig überflüssig und ebenfalls hirnrissig und 
die Beachtung überhaupt nicht wert.

von Georg S. (randy)


Lesenswert?

Dieter W. schrieb:
> Die Programmfehler-Fraktion war ihrer Sache so sicher, dass meine erste
> vorsichtige Erwähnung der Kontrastspannung gleich ein Minus kassiert hat
> - typisch für dieses Forum.

Du nimmst dir das zu sehr zu Herzen. Ich hab den Eindruck dass es hier 
einen Bot gibt der allen neuen Posts eine -1 gibt, und wenn es keine 
Reaktion von echten Menschen gibt bleibt es dabei.

von Daniel S. (supernova01)


Lesenswert?

Georg S. schrieb:
> Ich hab den Eindruck dass es hier
> einen Bot gibt der allen neuen Posts eine -1 gibt, und wenn es keine
> Reaktion von echten Menschen gibt bleibt es dabei.

Den Eindruck habe ich allerdings auch! Aber es ist eh Schall und 
Rauch...

von H. H. (hhinz)


Lesenswert?

Daniel S. schrieb:
> ich habe schon Antworten mit 10 x
> Plus gesehen die sich als völlig falsch herausgestellt haben.

Da steht ja auch "lesenswert?", nicht "richtig?"

von Rainer W. (rawi)


Lesenswert?

Daniel S. schrieb:
> Gilt bei 4-Bit betrieb für die anderen vier Bits ...

Tut es nicht.
Im Datenblatt (Hitachi HD44780) ist angegeben, dass an den DB0..DB7 
interne Pull-Ups sitzt. Oder von was für einem Controller sprichst du?

> Ist nach vor der Kontrastthematik Fehlerklassiker Nummer eins bei diesem
> Thema...

Da ist wohl viel Halbwissen unterwegs - RTFM ;-)

: Bearbeitet durch User
von Ob S. (Firma: 1984now) (observer)


Lesenswert?

Daniel S. schrieb:

> Ob S. schrieb:
>> wenn der TO mal ein Foto mit nicht initialisierten Controllern
>> gepostet hätte.
>
> Den sieht man das auf einem Foto aber nicht an, bleibt eine schwarze
> Box. Zudem hat er sie ja initialisiert bekommen...

Nö. Man hätte dann entweder zwei oder vier Zeilen mit schwarzen Boxen. 
(Im konkreten Fall natürlich zwei Zeilen)
Softwarefehler wären von vornherein ausgeschlossen, da keine Software 
involviert.

Sprich: das "Rätsel" wäre sofort gelöst gewesen.

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.