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?
Ups, da habe ich nicht drüber nachgedacht... Hier die zip.
@ 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
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
Wenn das TWI nur an den belegeten Pin scheitert, die Fleury-Lib kann auch SW-TWI mit beliebigen Pin.
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.
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
Hi, alles klar, es funktioniert jetzt ;) Wenn der Code fertig ist, dann poste ich ihn, jedoch kann das noch einige Wochen dauern.
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
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
Mit Google-Account einloggen
Noch kein Account? Hier anmelden.