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?
@ 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 PCF8574A 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
OK, Entwarnung. Das Timingdiagramm sieht gut aus, mal abgesehen davon,
dass der IC kein ACK sendet :-(
Das mit der Adresse 0x20 bzw 0x40 ist Ansichtsache. Betrachtet man
streng nur die Adressbits ist es 0x20, betrachtet man das erste Byte mit
R/W Bit ist es 0x40 ;-)
MFG
Falk
Der Blitz soll mich treffen, ich habe die Kathoden der LEDs auf GND
geschaltet.
Ist das IC jetzt hin? (Leuchten tun sie noch^^)
Danke schonmal, ich melde mich ob es funktioniert, wenn ich die LEDs
umgelötet habe.
@ TeXoR (Gast)
>Der Blitz soll mich treffen, ich habe die Kathoden der LEDs auf GND>geschaltet.>Ist das IC jetzt hin? (Leuchten tun sie noch^^)
Nöö.
>Danke schonmal, ich melde mich ob es funktioniert, wenn ich die LEDs>umgelötet habe.
Hast luego.
Falk
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.
@ 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
P.S. Das gleiche gilt für SCL. Auch die Taktleitung ist Open Collector,
denn der Slave darf den Takt auf LOW halten, wenn er ihm zu schnell ist.
MFG
Falk
>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?
@ STK500-Besitzer (Gast)
>>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?
Beim AVR: Ja.
>Oder liege ich falsch?
Nein.
MFG
Falk
P.S. Ich meine natürlich DDRC.
Hi All... bin neu hier...
Anmeldung folgt...
@TeXoR...
Ich habe das gleiche Problem...
Kannst du zwischendurch mal kurz Beschreiben woran es lag ???
Danke im Voraus...
mfg
Kalli
@ 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
@Falk...
Ja- danke für den Hinweis...
hab's wohl mitten in der Nacht - überlesen :-)
ich habe das Problem bereits selbst gelöst...
( ich benutze nicht die Routinen von @TeXoR -
sondern - eigene)...
- der Fehler war aber der Gleiche...
mfg
Kalli