Forum: Mikrocontroller und Digitale Elektronik LCD 2 x 20 an PCF8574


von René J. (rjanko)


Lesenswert?

Hallo Forum...

Auch wenn Ihr mich jetzt steinigen wollt, aber ich habe zu meinem 
Problem leider nichts gefunden.
Ich möchte ein LCD am PCF8574 betreiben. Die Adresse ist 78. Das ganze 
versuche ich mit CCBAsic zu programmieren. Das Ansprechen der Adresse 
scheint zu funktionieren.

Wenn ich ein LCD direkt an den Ports des μC betreibe, sage ich dem LCD 
ja über RS = 1, dass ein Comando erfolgt. Dann pulse ich E.

Wie gestaltet sich das jetzt am I2C-Bus?
RS hängt am PCF8574 an P0, E an P2 des PCF8574.
Muß man zu dem Wert, den ich schicke 128 (für RS = 1) hinzuaddieren,
weiterhin 32 für E und dann die 32 wieder abziehen? Zwischen den 
einzelnen Schritten, den Wert jeweils an den PCF schicken?

gosub I2C_Start
Daten = Adr_LCD                 '78
gosub I2C_Write
Daten = 40
gosub I2C_LCD_Comand            '128 hinzuaddieren > RS = 1
gosub I2C_Write
gosub I2C_LCD_Write             '32 hinzuaddieren > E = 1
gosub I2C_Write
gosub I2C_LCD_WriteOff          '32 hinzuaddieren > E = 0
gosub I2C_Write

Leider funzt das auf diesem Wege auch nicht. Vielleicht hat jemand eine 
Idee, wo mein Fehler liegt.

Ich danke schonmal für Eure Hilfe.
Grüße, René

von Peter Diener (Gast)


Lesenswert?

Hallo,

schreib dir doch erstmal nen vernünftigen Treiber für deinen PCF, so 
dass man den wie Ports ansprechen kann. Dann die Initialisierung des 
Displays aus dem manual abschreiben und dann Daten senden. Versuch 
garnicht erst, es direkt auf I2C zu coden, da blickt man nicht durch. Du 
brauchst erst eine Funktion, die ein Kommando oder Daten an das LCD 
schickt.

Wenn dir das zu kompliziert ist: Es gibt auch I2C-Displays.

Und wenns dich richtig ärgert, dann werd die C-Control los!

Selbst wenn das dann geht, kannst du mit den Fingern mitzählen, wie die 
Zeichen gemalt werden.

Grüße,

Peter

ps: Bei mir gibts schon lang keine C-Control mehr.

von Klaus (Gast)


Lesenswert?

Hi!

>Wenn ich ein LCD direkt an den Ports des μC betreibe, sage ich dem LCD
j>a über RS = 1, dass ein Comando erfolgt. Dann pulse ich E.

Die Aussage ist falsch.

Bei RS = 1  erwartet das Display Daten also keine Komandos.
Bei RS = 0  erwartet das Display ein Komando. Also einen Befehl.
Daten oder Komandos werden mit fallender flanke vom LCD-Display 
übernommen.

Ich gehe jetzt davon aus das es sich um einen HD44780 Controller 
handelt. Glaskugel ist leider defekt.

Bei der Ansteuerung über I2C-Bus ist die sache schon erheblich 
aufwendiger.

Im Prinzip geht es so:

* I2C-Bus initialisieren
* Adresse zum ersten PCF8574 (Daten/ Komandos) senden. (write)
* dann Daten oder Kommando senden.
* I2C-Stop
* I2C-Bus initialisieren
* Adresse zum zweiten PCF8574 senden.
* Dann Enable = 1   senden.
* I2C-Stop
* Adresse zum zweiten PCF8574 senden.
* Dann Enable = 0   senden.
* I2C-Stop
* Daten werden vom LCD-Display übernommen.

Ich hoffe es hilft dir ein wenig weiter.

von René J. (rjanko)


Lesenswert?

Vielen Dank für Eure Antworten.

@Peter: Die Idee mit den Treibern werde ich versuchen umzusetzen. Die 
C-Control ist eine Station, mit der ich die Technik meines Aquariums 
steuern will. Grundsätzlich ist aer ein Umstieg geplant. Allerdings muß 
ich damit noch etwas warten. Außerdem will ich es es jetzt erstmal 
hinbekommen, dass es funzt.

@ Klaus: Tut mir leid, dass Deine Glsakugel defekt ist. ;-)
Ja, es handelt sich um einen HD44780 kompatiblen Controller. Sorry, 
hatte ich vergessen, zu posten.
Du hast natürlich Recht, dass ich das Kommando mit RS = 0 schreibe.

Ich denke, das wird mir weiterhelfen.

LG, René

von Klaus (Gast)


Lesenswert?

Hi!

Hatte ich ganz ignoriert.
>gosub I2C_Start
>Daten = Adr_LCD                 '78
>gosub I2C_Write
>Daten = 40
>gosub I2C_LCD_Comand            '128 hinzuaddieren > RS = 1
>gosub I2C_Write
>gosub I2C_LCD_Write             '32 hinzuaddieren > E = 1
>gosub I2C_Write
>gosub I2C_LCD_WriteOff          '32 hinzuaddieren > E = 0
>gosub I2C_Write


Wie gesagt ist es nicht so einfach!

eher so vielleicht!

gosub I2C_LCD_INIT     ; Initialsiert erstmal das LCD
gosub I2C_LCD_Comand   ; In diesem Unteprogramm sollten die zu
sendenden Daten/ Komandos sowie die Einstellungen E,RS,R/W erledigt 
werden.

Ich empfehle dir das Datenblatt zum PCF8574 zu studieren sowie das zu 
deinem LCD-Display.

von René J. (rjanko)


Lesenswert?

Ich werde versuchen, das Ganze nochmal komplett neu zu strukturieren und 
mal auszuprobieren. Mir ist schon klar, dass sich kein 
Geschwindigkeitsrekord damit aufstellen lassen wird.

LG & schönen Abend
René

von Peter Diener (Gast)


Lesenswert?

Hallo nochmal,

wenn ich so nachdenke, kann es ja eigentlich nur die Station zweiter
Generation sein, die du benutzt. Hat die nicht genug Ports, um ein LCD
im 4 bit-Modus direkt anzusteuern? Das wäre erheblich einfacher. Das was
vorher auf den Ports war, muss für ein Aquarium bestimmt nicht schnell
sein und kann daher bequem über den PCF erledigt werden.

Oder ist da ein Denkfehler drin?

Peter

von René J. (rjanko)


Lesenswert?

Hallo Peter...

Ja, Du hast Recht. Es ist die Station II.
Eiegtnlich hat die genug Ports. Und die Anwendungen sind auch alles 
andere als zeitkritisch. Aber irgendwie habe ich mir das in den Kopf 
gesetzt, und es nagt auch an mir, dass es bisher nicht klappt.
Wenigstens würde ich es sehen wollen, dass es geht. Du weißt sicherlich, 
was ich meine.

LG, René

von Klaus (Gast)


Lesenswert?

Hast Du einen Schaltplan von deiner LCD-Ansteuerung?

von René J. (rjanko)


Lesenswert?

Hallo Klaus...

Ich besitze den Schaltplan nur auf dem Papier und habe momentan keinen 
Scanner zur Verfügung.
Aber hier ist mal die Zuordnung der PCF8574-Ausgänge zu den Eingängen 
des LCD:

PCF.0   RS
PCF.1   RW
PCF.2   E
PCF.3   LCD-Licht
PCF.4   D4
PCF.5   D5
PCF.6   D6
PCF.7   D7

von Klaus (Gast)


Lesenswert?

So wie es aussieht hast du den 4bit modus gewählt also über einen 
PCF8574.


Da ist zu beachten das du das Highnibble zuerst sendest und dann das 
Lownibble.

Ich hoffe dir ist das klar!

Du musst als das LCD erst auf den 4bit modus Initalisieren bevor du 
irgendwelche Zeichen senden kannst.

von René J. (rjanko)


Lesenswert?

Ja, Du hast Recht. Das LCD ist im 4bit-Modus angeschlossen.
Ich hatte das schon mit einem LCD gemacht, das ich direkt an den 
μC-Ausgängen angeschlossen hatte. Das hat auch prima funktioniert.

Nur hier habe ich das Problem, wie ich das Byte in das High- und das 
Low-Nibble zerlegen soll, um es dann an den PCF8574 zu senden.

Gruß, René

von Klaus (Gast)


Angehängte Dateien:

Lesenswert?

Hi!


hier mal ein kleiner Auszug aus meiner LCD_CMD Routine. Allerdings in 
Assembler für 8051er Derivate.


Ich hoffe es ist verständlich genug und hilft dir etwas weiter.

von René J. (rjanko)


Lesenswert?

Hallo Klaus...

Bisher habe ich von Assembler noch keinen großen Plan. Aber ich will 
mich damit auseinandersetzen und es lernen. Somit kann ich Dein Beispiel 
schon mal als Ansporn betrachten.
Hab vielen Dank!

Gruß René

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.