Hallo,
ich versuche, ein LCD (HD44780 komp.) mit einem PCF8574 zum Leben zu
erwecken.
Irgendwie funktioniert aber die Initialisierung nicht.
Kontasteinstellung ist wohl ok, ich sehe teilweise die Zeichenmatrix.
Den 8574 kann ich ansprechen, das ist soweit ok.
I2C Lib ist von Peter Fleury.
Anbindung wie bei ASURO (siehe Bild).
Sorry, dass der Code etwas lang geworden ist.
Hier der InitCode:
@ Pete (Gast)
>ich versuche, ein LCD (HD44780 komp.) mit einem PCF8574 zum Leben zu>erwecken.
[[Port-Expander PCF8574]]
>Irgendwie funktioniert aber die Initialisierung nicht.>Kontasteinstellung ist wohl ok, ich sehe teilweise die Zeichenmatrix.>Sorry, dass der Code etwas lang geworden ist.
Das gehört in den Anhang. Netiquette
Ich sehr erstmal keinen direkten Fehler.
MFG
Falk
Hallo Pete,
uberpruefe ob das "E" Strobe signal tatsaechlich funktioniert. Mir kommt
vor Du musst das E signal mit den Rest der Saten ORen. Das LCD nimmt nur
dann die neuen Daten an, wenn die Daten auf dem Datenbus liege und
danach das E Signal getatset wird.
----\_____________________________________ RS
(je nach CMD oder Daten Mode)
__ _______________________________ ________X_______________________________X______ Datenbus DB4-DB7
(Gueltiges Neues Datenwort) (Naechstes...)
__
_________________________/ \_____________ E Strobe
^
|___ Daten werden erst hier vom HD44780
angenommen (gespeichert)
So will das LCD die Ansteuerung sehen. Deshalb wirst Du die PCF8874
Daten drei mal senden muessen:
1) Datenwort = ((DB4-7) | RS=X | E=0)
2) Datenwort = ((DB4-7) | RS=X | E=1)
3) Datenwort = ((DB4-7) | RS=X | E=0)
Versuche es mal auf diese Weise. Du koenntest uebrigens auch das E
signal direkt von einem zusaetzlichen Pin Deines MCU ansteuern. Dann
wuerde ein PCF8574 Wort genuegen.
Gerhard
@Gerhard
Das mit dem Enable dachte ich wird in den letzten 4 Zeilen des
geposteten Codes gemacht.
Daten Anlegen und dann Enable High und High->Low setzen. (Siehe
SetDataLCD)
Versuche es mal so:
void SetDataLCD(unsigned char data)
{
unsigned char dataPins; // Pin Compatibility
dataPins = data >> 4; // Schiebe DB4-7 in P0-P3 Bitbereich
SetIOLCD(1, dataPins & 0x0F ); // P5=0,P4=1,P7=0, Daten=P0-3
SetIOLCD(1, dataPins | 0x80); // Setze P7
SetIOLCD(1, dataPins & 0x7F ); // Clear P7
// Sende den zweiten Daten Nibble
dataPins = data & 0x0F; // Nur DB0-3 werden gebraucht, P4-P7=0
SetIOLCD(1, dataPins & 0x0F ); // P5=0,P4=1,P7=0, Daten=P0-3
SetIOLCD(1, dataPins | 0x80 ); // Setze P7
SetIOLCD(1, dataPins & 0x7F ); // Clear P7
}
Ich wuerde SetIOLCD umaendern, so dass es nur ein 8-bit Datenwort
aussendet und die Manipulierung der Busbits in der Anwender Routine
vorgenommen wird.
Der Wert von P4 muss je nach DATEN Mode oder Command Mode eingestellt
werden. P5 kann immer auf Null liegen solange BUSY nicht gelesen wird.
Jetzt sieht der HD44780 die Daten waehrend des Strobing des E Signals
weil sich ja nur der Inhalt des P7 bits (E) aendert und alle anderen
Daten anliegen.
Man koennte spaeter einen One-Shot an P7 anhaengen, welcher den E Pulse
erzeugt und erspart sich die drei PCF8574 Sendungen bis auf eine.
Gerhard
Hallo Pete,
habe es mir nicht nehmen lassen, das mal selber aufzubauen und hat bei
mir mit einem PIC18F8722, PCF8574A und einem zweizeiligen LCD auf Anhieb
funktioniert. Werde spaeter mein Test Program hier im Anhang beilegen.
Gruss,
Gerhard
Hallo Pete,
im Anhang das versprochene Demo Programm. Also nicht aufgeben;-).
Es geht auf alle Faelle mit dem PCF8574A als LCD Bus Treiber. Die
Zugriffsgeschwindigkeit ist sehr gut.
Wenn man eine kleine Zusatzschaltung verwendet liesse sich pro PCF8574
dann ein Nibble uebertragen.
Werde mir warscheinlich selber eine kleine LCD Huckepack-platine
erstellen. Ist auf jeden Fall sehr bequem ein LCD ueber I2C anzusteuern.
Man kann dann die unbenutzten Bits fuer die LED Einschaltung verwenden.
Mit einen billigen 8-bit I2C DAC koennte man auch noch den Kontrast
einstellen. Vielen Dank mich auf diesen Weg hinzuleiten.
Gruss,
Gerhard
Hallo Gerhard,
danke für die bildlichen LCD Grüße :-)
Jetzt funktioniert es auch bei mir. Das mit dem Enable hat wohl nicht
geklappt.
Auf jeden Fall eine super Sache so ein LCD über I2C :-)
Viele Grüße,
Pete
Hallo Pete!
danke fuer die Erfolgsmeldung. Freut mich sehr;-). Dein Problem hat mir
auch geholfen, da ich jetzt selber einen Treiber dafuer habe. Fuer mich
war das auch das erste Mal einen PCF8574 anzusteuern.
Das tolle mit dem I2C LCD Interface ist jetzt, dass man nun bequem mehr
als ein LCD ansteuern kann.
Ich habe vor eine kleine Platine oder einen Lochrasteraufbau zu
verwirklichen der Huckepack hinter dem LCD sitzt. Mit den zwei
unbenutzten PCF8574 Ausgaengen koennte man dann noch schon die B.L. LEDs
schalten (3 Helligkeitsstufen).
Gruss,
Gerhard