LCD Display über I2C

OP #7792748
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

#7792758
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?

OP #7792762
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

#7792773
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

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

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

Antwort schreiben

Bitte melde dich an, um einen Beitrag zu schreiben.

oder

Mit Google-Account einloggen

Die Registrierung ist kostenlos und dauert nur eine Minute.

Jetzt registrieren