Forum: Compiler & IDEs PCF8574 mit Atmega8 ansteuern - OHNE TWI


von TeXoR (Gast)


Angehängte Dateien:

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?

von Andreas K. (a-k)


Lesenswert?

ZIP kann ich direkt öffnen, RAR nicht

von TeXoR (Gast)


Angehängte Dateien:

Lesenswert?

Ups, da habe ich nicht drüber nachgedacht...
Hier die zip.

von Falk B. (falk)


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

von Falk B. (falk)


Lesenswert?

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

von TeXoR (Gast)


Lesenswert?

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.

von Falk B. (falk)


Lesenswert?

@ 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

von Hubert G. (hubertg)


Lesenswert?

Wenn das TWI nur an den belegeten Pin scheitert, die Fleury-Lib kann 
auch SW-TWI mit beliebigen Pin.

von Hubert G. (hubertg)


Lesenswert?

Und hier gibts die passende LCD-Lib dazu. 
http://computerheld.de/i2clcd/

von TeXoR (Gast)


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.

von Falk B. (falk)


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

von Falk B. (falk)


Lesenswert?

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

von STK500-Besitzer (Gast)


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?

von Falk B. (falk)


Lesenswert?

@  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.

von Falk B. (falk)


Lesenswert?

Kleiner Nachtrag. Die selbstgestricktehn Warteschleifen sind meist nicht 
so gut. Besser so.

http://www.mikrocontroller.net/articles/AVR-GCC-Tutorial#Warteschleifen_.28delay.h.29

MFG
Falk

von TeXoR (Gast)


Lesenswert?

Hi,

alles klar, es funktioniert jetzt ;)

Wenn der Code fertig ist, dann poste ich ihn, jedoch kann das noch 
einige Wochen dauern.

von kalli (Gast)


Lesenswert?

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

von Falk B. (falk)


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

von kalli (Gast)


Lesenswert?

@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

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.