Forum: Mikrocontroller und Digitale Elektronik LCD Display über I2C


von Dennis H. (t1w2i3s4t5e6r)


Lesenswert?

Hallo Zusammen,

Ich habe mir ein 4x20 LCD Display gekauft, mit einem I2C IO-Expander 
dran. Das Display wäre wohl Arduino kompatibel.

Ich nutze gern die Hardware von Arduino, weil man sich da keine Gedanken 
mehr über eine Schaltung machen braucht, man kann sich auf die Software 
konzentrieren.

Bisher habe ich es immer so gemacht, dass ich dann die Bibliotheken von 
Arduino studiert habe und genau so in C die Software nachprogrammiert. 
Da ich aber kaum C++ kann, bin ich bei dem LCD einfach überfordert und 
bekomme es nicht hin.

Ich habe einen Steckbrettaufbau und nutze bei meinem Atmega8 die 
Hardware TWI Schnittstelle. Diese funktioniert, ich habe zwei weitere 
7-Segment Baugruppen daran am laufen.
Wenn ich an die Adresse des Displays einfach 0x00 schicke, geht die 
Hintergrundbeleuchtung aus, schicke ich 0xff, geht sie wieder an. Also 
die prinzipielle Kommunikation funktioniert. Kontrast habe ich auch 
eingestellt. Kann mir irgendwer einen Tipp geben, wie die Daten aussehen 
müssen, damit das Display das macht, was ich will? Ich bekomme es nicht 
raus.

Das Display habe ich:
https://botland.de/alphanumerische-und-grafische-anzeigen/2640-lcd-display-4x20-zeichen-blau-i2c-lcm1602-konverter-5904422331061.html

Hier ist die Doku von Arduino, die ich nicht verstehe:
https://github.com/fmalpartida/New-LiquidCrystal/blob/master/LiquidCrystal_I2C.cpp

Danke für eure Antworten


Denis

von Michael B. (laberkopp)


Lesenswert?

Wahrscheinlich kollidiert deine 7-Segment TWI Ansteuerung mit #include 
"I2CIO.h"

von Dennis H. (t1w2i3s4t5e6r)


Lesenswert?

Nein, ich nutze ja nicht die Arduino Umgebung. Ich klaue mir da immer 
nur die Art der Ansteuerung. Von Arduino habe ich keine wirkliche 
Ahnung..

Denis

von Rainer W. (rawi)


Lesenswert?

Dennis H. schrieb:
> Kann mir irgendwer einen Tipp geben, wie die Daten aussehen
> müssen, damit das Display das macht, was ich will?

Bevor du die Software umdichtest, probiere doch erstmal, ob das 
Beispielprogramm aus der Produktbeschreibung bzw. die mit der Bibliothek 
heruntergeladenen Beispiele, tun was sie sollen?

Welche Sequenz schickst du für die Initialisierung zum Display?

: Bearbeitet durch User
von Dennis H. (t1w2i3s4t5e6r)


Lesenswert?

Rainer W. schrieb:
> Bevor du die Software umdichtest, probiere doch erstmal, ob das
> Beispielprogramm aus der Produktbeschreibung bzw. die mit der Bibliothek
> heruntergeladenen Beispiele, tun was sie sollen?

Ich denke, ohne die ganze Arduino Umgebung wird der Code nicht 
funktionieren, aber ansich hast du Recht, eigentlich sollte ich 
probieren, ob mit dem Code mein Display das tut, was es soll.

Rainer W. schrieb:
> Welche Sequenz schickst du für die Initialisierung zum Display?

Zur Zeit noch gar keine. Ich habe bisher Displays nur ohne I2C genutzt. 
Da ist es ja am Anfang notwendig, 3x Soft-Reset zu machen. Damit geht es 
schon los, ich habe nirgends in dem Arduino-Code etwas gefunden, was 
nach 3x Reset aussieht. Ich vermute, die haben einen kleinen Controller 
auf dem Display, welcher sich darum kümmert. Das Display ist einfach 
nicht dokumentiert, das ist mein Problem. Ich wollte die 
Arduino-Bibliothek als Doku nutzen und scheitere daran.

Denis

von Frank K. (fchk)


Lesenswert?

Dennis H. schrieb:

> Wenn ich an die Adresse des Displays einfach 0x00 schicke, geht die
> Hintergrundbeleuchtung aus, schicke ich 0xff, geht sie wieder an. Also
> die prinzipielle Kommunikation funktioniert. Kontrast habe ich auch
> eingestellt. Kann mir irgendwer einen Tipp geben, wie die Daten aussehen
> müssen, damit das Display das macht, was ich will? Ich bekomme es nicht
> raus.

Wenn Du ein Byte per I2C schreibst, kommt es an den 8 Ausgangspins raus.
Diese Pins sind üblicherweise so verbunden:

Bit 7: LCD BL Hinterschrundbeleuchtung ein/aus
Bit 6: LCD EN Signal
Bit 5: LCD RW Signal
Bit 4: LCD RS Signal
Bit 3: LCD Datenbit 7
Bit 2: LCD Datenbit 6
Bit 1: LCD Datenbit 5
Bit 0: LCD Datenbit 4

Das LCD ist im 4-Bit Modus, d.h. Du musst die beiden Halbbytes 
nacheinander senden - zuerst das obere, dann das untere.
RW ist auf 0, wenn Du schreibst.
EN ist 0, und geht kurz auf 1, dann wieder auf 0, um ein Halbbyte zu 
übernehmen.
RS ist 0 für ein Datenbyte, 1 für ein Befehlsbyte.
DU musst immer alle Bits auf einmal neu schreiben, nur ein Bit setzen 
und alle anderen in Ruhe lassen geht nicht.

Wenn Du also das Datenbyte Hex 41 schreiben willst, musst Du auf dem I2C 
ausgeben:
BL EN RW RS D7 D6 D5 D4
1   0  0  0  0  1  0  0  0x84 ; Oberes Halbbyte senden, EN=0
1   1  0  0  0  1  0  0  0xc4 ; EN=1, sonst alles gleich
1   0  0  0  0  1  0  0  0x84 ; EN=0, sonst alles gleich
1   0  0  0  0  0  0  1  0x81 ; Unteres Halbbyte senden, EN=0
1   1  0  0  0  0  0  1  0xc1 ; EN=1, sonst alles gleich
1   0  0  0  0  0  0  1  0x81 ; EN=0, sonst alles gleich

Der Rest mit den ganzen Details steht dann hier:
https://www.mikrocontroller.net/articles/HD44780

Du darfst auch nicht zu schnell sein, sonst kommt das Display nicht 
hinterher.

fchk

von Dennis H. (t1w2i3s4t5e6r)


Lesenswert?

Jetzt verstehe ich einiges, alles klar. Frank, ich danke dir, genau das 
habe ich gesucht. Ich werde es probieren und mich bei Erfolg melden.

Vielen Dank!


Denis

von Manfred P. (pruckelfred)


Lesenswert?

Dennis H. schrieb:
> Ich habe mir ein 4x20 LCD Display gekauft, mit einem I2C IO-Expander
> dran. Das Display wäre wohl Arduino kompatibel.

Die I2C-Zusatzplatinen können unterschiedlich sein und brauchen 
dementsprechend eine Initialisierung, welcher Port für was zuständig 
ist. Auch deren I2C-Adresse ist nicht immer die, die der Verkäufer 
angibt.

Dennis H. schrieb:
> Ich denke, ohne die ganze Arduino Umgebung wird der Code nicht
> funktionieren, aber ansich hast du Recht, eigentlich sollte ich
> probieren, ob mit dem Code mein Display das tut, was es soll.

Besorge Dir einen UNO, gerne als China-Clone und bringe es erstmal damit 
zum Fliegen.

von Rainer W. (rawi)


Lesenswert?

Dennis H. schrieb:
> Ich denke, ohne die ganze Arduino Umgebung wird der Code nicht
> funktionieren

omg - installiere sie halt

Frank K. schrieb:
> Das LCD ist im 4-Bit Modus

Sicherheitshalber sollte man es bei der Initialisierung erstmal in den 
4-Bit Modus versetzen - deshalb auch vorhin meine Frage.

: Bearbeitet durch User
von Peter D. (peda)


Lesenswert?

Dennis H. schrieb:
> Da ist es ja am Anfang notwendig, 3x Soft-Reset zu machen.

Das ist so nicht richtig.
Es geht darum, das LCD-Interface in einen definierten Zustand zu 
bringen. Ein Reset des LCD erfolgt dabei nicht.
Nach einem Power-On ist es immer im 8-Bit Mode. Nach einem µC-Reset kann 
es aber auch im 4-Bit Mode 1. Nibble oder im 4-Bit Mode 2. Nibble sein.
Daher benutzt man die Sequenz aus dem Datenblatt, um aus diesen 3 
Möglichkeiten immer in einen bekannten Zustand zu kommen. Insbesondere 
die Wartezeiten sind einzuhalten, da bei einem unbekannten Zustand 
natürlich noch kein Busy-Polling möglich ist.

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.