LCD am I2C

Gast #52539
Lesenswert?

Hallo Allerseits,

ich hab mein 16x2 HD44780 Display über einen PCF8574 von TI am TWI des
atmega8. Das ganze funktioniert soweit eigentlich auch ganz gut.
Einziger Schönheitsfehler ist das ich es nicht schaffe das Bussy-Flag
auszulesen. (im Moment kompensiere ich das mit Delays).

Meine Frage ist nun ob das ein Hardwareproblem ist, oder ob ich da in
der SW was falsch mache.

ich habe RS an P4, R/W an P5 und E an P7 des PCF8574. Meiner Ansicht
nach müsste ich also erst mal 0x20 senden damit R/E H ist, dann 0xA0
senden damit E auch noch nach H gehen. Nun sollten das High-Nibble an
den Datenleitungen anliegen. Nun lese ich also vom PCF8574 Daten. Da
ist jetzt die Frage was nun mit meinen Steuerleitungen passiert. Meiner
Ansicht nach müssten die Leitungen alle H sein da mit Pull-Ups
angeschlossen. Somit sollte es da eigentlich kein Problem geben, oder?
Danach E auf L ziehen damit das nächste Nibble am Datenbus anliegt und
wieder nach H damit die Daten gelesen werden können. Wieder lesen, und
gut ist.

Nur leider funktioniert das nicht. Kennt einer das Problem oder weiß
vielleicht woran das liegen könnte.

Danke schon mal, der Jochen
#52543
Lesenswert?

Wenns schneller gehen soll, dann empfehle ich meine Lösung in der
Codesammlung mit dem 74HC164.
Man braucht zwar 3 Drähte, aber dafür ist die Ansteuerung wesentlich
einfacher und es muß nur je ein Byte geschoben werden.

Beim PCF8574 muß man ja je Byte 7 Bytes senden:
- Start
- I2C-Adresse
- 1.Nibble + E = 0
- 1.Nibble + E = 1
- 1.Nibble + E = 0
- 2.Nibble + E = 0
- 2.Nibble + E = 1
- 2.Nibble + E = 0
- Stop

Aber beim 74HC164:
- komplettes Byte reinschieben (über SPI) während E = 0
- E = 1 setzen (SBI)
- E = 0 setzen (CBI)


Peter
#52545
Lesenswert?

@Jochen,

trotzdem mußt Du dann immer noch mindestens 9 Bit bei lahmen 100kHz
senden, also 90µs.
Bei nötigen 37µs Wartezeit zwischen den Bytes bist Du bist dann also
immer noch um Klassen langsamer als mit 74HC164.

Ganz abgesehen davon, daß Du für einen PCF8574 fast 10 Stück 74HC164
kaufen kannst.

Mit der Nibble-Methode ohne extra E brauchst Du sogar (7*9+2)*10µs =
650µs, kein Wunder, daß Du da nie ein Busy zu sehen bekommst.


Das AVR SPI kann bis zu 4MHz, das sind dann nur 2µs bis in dem 74HC164
das Byte drin ist. Du must also noch zusätzliche 35µs echt warten bis
zum nächsten Byte.
Bzw. Du wählst gleich einen entsprechend niedrigeren SPI-Takt.


Peter
Gast #52546
Lesenswert?

Hallo noch mal,

Was die Kosten angeht, da hab ich drei Stück umsonst von TI bekommen
;-). Was die Geschwindigkeit angeht, geb ich Dir natürlich Recht. Das
ist für mich allerdings unwichtig da ich ja keine Daten in
Hochgeschwindigkeit durch das Display jagen will ;-)

Ansonsten werd ich mir die Idee auf jeden Fall im Hinterkopf behalten.

Schönen Tag noch, der Jochen
Gast #52547
Lesenswert?

Hi,
der AVRco Pascal Compiler macht das mit einem PCA9555. Da wird das
Display im 8Bit Modus angesprochen und das Busy Flag wird auch
berücksichtigt. Nachteil bei der Lösung ist eigentlich nur das es den
PCA9555 nur in SMD gibt, ansonsten funzt das prima.

Gruß
Markus
www.embedit.de

PS: Wenn das Display einen KS007x Controller hat kann es Probleme mit
dem Timing geben, das stimmt nämlich mit dem eines original HD44780
nicht überein

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