Forum: Mikrocontroller und Digitale Elektronik LCD am I2C


von jochen (Gast)


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

von Peter D. (peda)


Lesenswert?

Der I2C ist ja mit 100kBit sehr langsam und Du must ne ganze Menge
I2C-Pakete erzeugen für das Signalspiel.

Da vermute ich mal, daß das Busy Bit schon längst wieder aus ist, ehe
Du es auch nur einmal eingelesen hast.

Mit den festen Wartezeiten solltest Du bei einem so langsamen Bus also
schneller sein.


Peter

von Mark de Jong (Gast)


Lesenswert?

Hallo Jochen,

Um die ports als eingang zu nutzten solltest Du die pins erst auf high
setzten.

auszug aus das datenblatt,erste seite:
"The I/Os should be high before being used as inputs."

Grüße Mark.

von Moritz Veit (Gast)


Lesenswert?

Hi jochen,
kannst du mal den code bitte posten weil ich mich demnächst auch an so
etwas dranmachen will allerdings immoment noch probs mit der
ansteuerung des pcf habe .... wäre supper wenn du den code grad
hochladen könntest damit ich das dann entsprechned bei mir abändern
kann.

cu
knirps

von Peter D. (peda)


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

von jochen (Gast)


Lesenswert?

Hallo Peter,

die Lösung wäre ja mit dem PCF genauso möglich, wenn ich noch eine
Dritte Leitung (für E) mit dazu nehme.

Bin aber so wie es im Moment tut ganz zufrieden. Wäre zwar nett wenn
das mit dem Bussy-Flag gehen würde ist aber kein must have.

Der Jochen

von Peter D. (peda)


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

von jochen (Gast)


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

von Markus Burrer (Gast)


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

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.