PCF8574 mit Atmega8 ansteuern - OHNE TWI

Gast #725162
Lesenswert?

Hi,

für die Schule soll ich eine LCD über den I2C-Bus ansteuern. Die Pins 
für das TWI sind leider schon belegt, also kann ich das TWI nicht 
benutzen.

Also habe ich zuerst eine Platine mit dem PCF8574 und eine 
Ausgabeplatine mit 8 LEDs gelötet.
Die Ausgabeplatine funktioniert, ich habe ein Lauflicht mit der Platine 
getestet.

Nun habe ich das I2C-Protokoll durchgeackert und ein Programm 
geschrieben, welches an die Adresse 0x20 (die Adressleitungen des 
PCF8574 sind alle auf LOW) ein Byte 0x55 sendet. Jedoch bleiben die LEDs 
alle an.

Ich habe die Daten- und die Clock-Leitungen mit einem Logic-Analyzer 
aufenommen, das Ergebnis und der C-Code sind im Anhang.

Nach der Adresse und dem R/W-Bit erfolgt kein Acknowledge vom Slave.
Die Zeiten dürften doch keine Rolle spielen, solange sie groß genug 
sind, oder?

Vlt. kann jmd. den Code ausprobieren. Möglicherweise habe ich trotz 
mehmaligem Duchklingeln einen Fehler in der Schaltung. Im dümmsten Fall 
ist das IC defekt...
Oder ist der Code fehlerhaft?
Angehängte Dateien:
#725203
Lesenswert?

@ TeXoR (Gast)

>geschrieben, welches an die Adresse 0x20 (die Adressleitungen des

Ist die Adresse nicht eher 0x40 beim PCF8574?

[[Port-Expander PCF8574]]

Und Vorsicht, der PCF8574 A hat die Adresse 0x70.

>Nach der Adresse und dem R/W-Bit erfolgt kein Acknowledge vom Slave.

Klar, falsche Adresse.

>Die Zeiten dürften doch keine Rolle spielen, solange sie groß genug
>sind, oder?

Ja.

MFG
Falk
Gast #730578
Lesenswert?

Hey,

mein Lehrer und ich haben jetzt herausgefunden, dass das Acknowledge bei 
der Adresse 0111000 fast vorhanden ist. D.h. der Pegel ist beim 
Acknowledge bei ca. 2-3 V, also weder HIGH noch LOW. Ich habe zuerst 
4,7k Widerstände benutzt, und jetzt 10k, vomit es allerdings auch nicht 
funktioniert.
Woran kann das liegen? Muss man am AVR noch etwas einstellen?

Vielen Dank schonmal soweit.
#730621
Lesenswert?

@ TeXoR (Gast)

>der Adresse 0111000 fast vorhanden ist. D.h. der Pegel ist beim
>Acknowledge bei ca. 2-3 V, also weder HIGH noch LOW.

Da zieht wohl jemand nach HIGH.

> Ich habe zuerst
>4,7k Widerstände benutzt, und jetzt 10k, vomit es allerdings auch nicht
>funktioniert.

Ist eagl, beides müsste problemlos laufen.

>Woran kann das liegen? Muss man am AVR noch etwas einstellen?

Deine SOFT-TWI Routine ist vielleicht buggy. Die muss SDA nach dem 8. 
Bit loslassen (auf Tristate schalten). Es kann sein dass sie durch einen 
Fehler SDA aktiv nach HIGH treibt. Dagegen kommt der PCF8574 natürlich 
nicht an.
Siehe

Ausgangsstufen Logik ICs

BINGO! Ich schaue gerade in deinen Quelltext. Du greifst NIRGENDS auf 
dass DDRD Register zu. Das MUSST du aber! Denn um das ACK zu LESEN, muss 
der AVR SDA loslassen (auf Eingang schalten) und NICHT aktiv nach HIGH 
treiben!

MFG
Falk
Gast #730626
Lesenswert?

>BINGO! Ich schaue gerade in deinen Quelltext. Du greifst NIRGENDS auf
>dass DDRD Register zu.

Ohne einen Blick ins Programm geworfen zu haben:
Muß man TWI/I²C nicht grundsätzlich über das DDR realisieren?
Ich würde das PORT-Register auf 0 setzen, dem Port-Pin einen 
Pull-Up-Widerstand verpassen (wie es ja I²C-Standard ist) und dann die 
Daten über das DDR ausgeben. Wenn man dem DDR eine "1" zuweist, wird der 
Port zum Ausgang und ist niederohmig/liefert L-Pegel, da das 
PORT-Register ja 0 ist. Weist man ihm eine 0 zu, wird er als Eingang 
konfiguriert, ohne dass der Pull-Up eingeschaltet ist.
Dadurch hat man leider eine negative Logik, die sich aber mit etwas 
Hirnschmalz ertragen lässt...
Oder liege ich falsch?
#732436
Lesenswert?

@ kalli (Gast)

>Ich habe das gleiche Problem...
>Kannst du zwischendurch mal kurz Beschreiben woran es lag ???

Vielleicht mal den Thread in Ruhe lesen?

"BINGO! Ich schaue gerade in deinen Quelltext. Du greifst NIRGENDS auf
dass DDRD Register zu. Das MUSST du aber! Denn um das ACK zu LESEN, muss
der AVR SDA loslassen (auf Eingang schalten) und NICHT aktiv nach HIGH
treiben!"

MG
Falk

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