Hallo,
ich bin gerade dabei, eine Datenübertragung zwischen zwei ATmega8
mittels dem TWI zu realisieren. Leider stoße ich dabei auf ein paar
Probleme, die wahrscheinlich auf mein Halbwissen zum Thema TWI
zurückzuführen sind ;-)
Ich habe mich schon auf einigen Seiten im Netz belesen und unter anderem
mit Hilfe des Datenblattes ein einfaches Programm geschrieben. Der
Master soll dabei ein Byte an den Slave senden. Mehr ist es bisher
nicht.
Guckst du hier:
Master-Transmitter:
Der Master soll anhand der 3 LEDs den aktuellen Status anzeigen, der
Slave soll anzeigen, ob die letzte Aktion erfolgreich war.
Bisherige Beobachtungen: Master blinkt 2 mal hintereinander grün auf,
bleibt dann auf gelb stehen (zwischen dem Senden der Adresse und den
Daten).
Beim Slave leuchtet nach dem zweiten grünen Blinken am Master die LED an
PIN D2 auf (signalisiert, dass der Slave angesprochen und daraufhin ein
ACK gesendet wurde).
Wieso hängt der Master fest? Ist der Code für den Slave zum Empfangen
ausreichend oder hab ich da was falsch verstanden (sehr wahrscheinlich)?
> Ist es richtig ...
Ja
Bevor du Master und Slave ohne Erfahrung programmierst, solltest du
eines der beiden Geräte durch eins ersetzen, das bekanntermaßen
funktioniert.
Nimm zum Beispiel einen PCF8574 als SLave.
Und benutze den seriellen Port, um Debug Meldungen an ein Terminal
auszugeben, so wie hier beschrieben:
http://stefanfrings.de/avr_hello_world/index.html
Es könnte auch sehr hilfreich sein, den I2C Bus mit einem
Speicheroszilloskop oder Logikanalyzer zu beobachten.
Hast du pull-up Widerstände eingebaut? Welchen Pegel haben die beiden
Leitungen in dem Moment, wo es hängt? Und welchen Pegel haben sie nach
Reset der beiden Controller VOR der ersten Übertragung?
> Bevor du Master und Slave ohne Erfahrung programmierst, solltest du> eines der beiden Geräte durch eins ersetzen, das bekanntermaßen> funktioniert.
Genau das wäre sehr hilfreich! Ich hatte bisher keine Idee, wie man
beispielsweise nur den Master (Sender) testen könnte. Wenn man Sender
und Empfänger gleichzeitig aufbaut und testen will, ist die Fehlersuche
natürlich enorm schwer.
Der PCF8574 gibt im Empfangsmodus ein Byte direkt an den I/O-Ports aus,
richtig?
Die Sache mit den Debug-Meldungen muss ich mir nochmal genauer
anschauen. Ich bin mir nicht sicher, ob ich das mit meiner
"Programmierausrüstung" hinbekomme...
Einen Logikanalysator habe ich leider ebensowenig zur Verfügung, wie ein
Oszilloskop.
Die SCL- und die SDA-Leitungen hab ich mit pull-ups versehen (4,7kohm).
Lassen sich die Pegel nur mit einem Oszilloskop betrachten oder gibt's
da auch andere Wege?
Chris K. schrieb:>> Bevor du Master und Slave ohne Erfahrung programmierst, solltest du>> eines der beiden Geräte durch eins ersetzen, das bekanntermaßen>> funktioniert.>> Genau das wäre sehr hilfreich! Ich hatte bisher keine Idee, wie man> beispielsweise nur den Master (Sender) testen könnte. Wenn man Sender> und Empfänger gleichzeitig aufbaut und testen will, ist die Fehlersuche> natürlich enorm schwer.
Du könntest deinen Sender zb erst mal mit einer als funktionierend
bekannten Implementierung ersetzen. Wie zb die Fleury TWI (I2C) Routinen
http://homepage.hispeed.ch/peterfleury/avr-software.html
> Der PCF8574 gibt im Empfangsmodus ein Byte direkt an den> I/O-Ports aus, richtig?
Ja. Du sendest einfach die Adresse und dann ein Byte.
Die Ausgänge sind (fast) Open-Collector, also wenn du da LED's
anschließst, dann zwischen VCC und den I/O Pins.
> Lassen sich die Pegel nur mit einem Oszilloskop betrachten oder> gibt's da auch andere Wege?
Der andere Weg wäre eben ein Logikanalyzer. Dafür sind diese Geräte
gemacht.
Da man I2C beliebig langsam takten kann, kann man die Signale
prinzipiell auch mit zwei LED's, Stift und Papier aufzeichnen.
ich weiss jetzt allerdings nicht auswendig, wie hoch die niedrigste
Frequenz ist, die so ein Atmega8 mit seinem TWI Taktgeber unterstützt.
Schonmal erwägt, für den Anfang Soft-i2C zu benutzen? Da könntest du
beliebig _delay_ms() Pausen einbauen.