Forum: Mikrocontroller und Digitale Elektronik I2C-Schaltung sendet nur Unsinn - wie debuggen?


von newbie (Gast)


Lesenswert?

Ich wollte mir gerade eine I2C-Schaltung zwischen Attiny (Slave) und 
Raspberry Pi (Master) aufbauen. Der Attiny kann auch mit 3,3V betrieben 
werden, soweit also kein Problem.

Mittels dem Befehl "i2cdetect" wird auch erkannt, dass der Attiny als 
Slave am I2C hängt. I2C an sich funktoioniert also wohl. Jedoch 
funktioniert das Senden von Daten nur sehr unzuverlässig und das 
Empfangen von Daten noch unzuverlässiger (manchmal kommt durchaus am 
Attiny an, was ankommen soll, und die LED leuchtet dann, oft aber auch 
nicht).

Nach sehr vielen Versuchen habe ich das Gefühl, dass die Geräte die 
Spannung nicht auf LOW gezogen kriegen. Ich kriege i.d.R. als Antwort 
des Attiny 0xff oder 0x7f oder auch 0xXX (ich vermute, das bedeutet 
undefinierte Spannung), obwohl ich 0x00 erwarte.

Meiner Recherche nach sollte der Raspberry Pi an sich schon einen 
Pullup-Transistor für I2C haben, jedoch messe ich in diesem Fall 
ungefähr 1,5V an der Leitung zwischen Attiny und Raspberry Pi. Deshalb 
habe ich verschiedene Widerstandsgrößen versucht: 20 Ohm, 330 Ohm, 
3,3kOhm, 10kOhm, 47kOhm. Nie habe ich die erwarteten Zahlen erhalten. 
Bei 20 Ohm tendierte die Ausgabe Richtung 0x0, aber es war immer noch 
nicht alles 0. Nur wenn ich einen Pulldown-Transistor aufgebaut hab, war 
logischerweise alles auf 0 (aber so funktioniert I2C ja nicht mehr).

Wie kann man sowas denn am besten debuggen?
Mein Multimeter ist viel zu langsam, um irgendwie zusehen, welche 
Spannungen nun anliegen, sobald ich Daten senden will. Ich sehe bei 
einem Massenkommando wie "i2cdump" (liest alle Register auf dem Slave), 
dass die Spannung einbricht, aber nicht schnell genug bis auf 0,0 (an 
meinem Multimeter, aber vllt ist das auch einfach zu langsam).

von newbie (Gast)


Angehängte Dateien:

Lesenswert?

Anbei mal noch so eine schematische Schaltung.

- 3,3V-Spannungsausgang des Pi am Vcc-Eingang des Attiny
- GND des Pi am GND-Eingang des Attiny
- SCL und SDA jeweils verbunden (testweise mit Pullup-Widerständen)

von Jens P. (picler)


Lesenswert?

Die Pullups dürften zu groß sein. Probiere mal 1,8k.

Edit: Zu spät gelesen, dass du verschiedene Pullups schon probiert hast. 
Bei I2C sind mehrere Open-Kollektor-Transistoren parallel geschalten. 
Somit wird der High-Pegel nur durch den PullUp erzeugt. 1,5V sind aber 
auf jeden Fall zu wenig. Hast du ein Oszi, vielleicht sogar ein DSO? 
Damit kann man I2C ganz gut debuggen.

: Bearbeitet durch User
von Jens P. (picler)


Lesenswert?

Vielleicht sendet der RPi auch mit zu hoher Frequenz. Es gibt 100kHz, 
400kHz und 1MHz. 400kHz sind quasi Standard aber wenn die Frequenz im µC 
falsch eingestellt ist, gibt es Probleme. Ich kenne den Tiny nicht, aber 
wäre es denkbar, dass der I2C noch auf Master steht?

von newbie (Gast)


Lesenswert?

Jens PICler schrieb:
> Die Pullups dürften zu groß sein. Probiere mal 1,8k.

Sehr komisch. Als ich es eben mit 1,5kOhm probiert habe, lief es mal 
recht gut (nicht optimal, aber viel besser). Dann habe ich 1,0kOhm, 
1,8kOhm und wieder 1,5kOhm probiert und bei keinem wollte es dann. Da 
steckt doch irgendwo der Wurm...

Oszilloskop hab ich leider keins.

LOW und HIGH scheint damit aber schonmal ganz gut zu passen. An SCL hat 
er nun standardmäßig 3,3V, an SDA standardmäßig 0,10V. Ob das so gehört, 
weiß ich noch nicht, aber auf jeden Fall ist das eine ganz klar HIGH und 
das andere ganz klar LOW.

von newbie (Gast)


Lesenswert?

Jens PICler schrieb:
> Ich kenne den Tiny nicht, aber
> wäre es denkbar, dass der I2C noch auf Master steht?

Das eigentlich nicht. Der Tiny kann gar kein I2C von sich aus. Das ist 
eine Software-Implementierung für ein Slave-Protokoll (über so 
Allgemein-Seriell-Pins, USI heißt es). Im Moment nutze ich da ein 
"i2cslave"-Programm.

https://github.com/ni-c/raspberry2c (Dateien sind in include/ und libs/)


Aber soweit ich mich noch an eine Vorlesung erinnerre, dachte ich, dass 
bei I2C doch alle Komponenten den Takt "vereinbaren", weil einer sein 
LOW am spätesten wieder loslässt... Lese jetzt aber bei Wikipedia "Der 
Bustakt wird immer vom Master ausgegeben.". Anscheinend habe ich das mit 
einem anderen Protokoll verwechselt.

Dann ist natürlich die Frage, wie schnell mit Attiny hinterherkommt. 
Getaktet ist er meines Wissens mit 1MHz. "The default clock source 
setting is therefore the Internal Oscillator running at 8.0 MHz with 
longest start-up time and an initial system clock prescaling of 8, 
resulting in 1.0 MHz system clock."

Nur wie krieg ich daraus die Baudrate des USI/i2c-Anschlusses? Im 
Datenblatt gibts noch einen Punkt "Serial Programming Characteristics". 
Da steht "Oscillator Frequency (ATtiny24/44/84V): 0-4MHz (min-max)". Ist 
das das richtige Stichwort?
http://www.atmel.com/Images/doc8006.pdf (S. 183)

Nur der kann wohl keine 4MHz Frequenz erreichen, wenn er selbst nur mit 
1MHz läuft?

von newbie (Gast)


Lesenswert?

Jens PICler schrieb:
> 400kHz sind quasi Standard aber wenn die Frequenz im µC
> falsch eingestellt ist, gibt es Probleme.

AHA! Ich hab die Baudrate im Raspberry Pi mal auf 2 setzen wollen. Ging 
nicht, Minimum war 3814. Jetzt krieg ich aber bei 100 Iterationen von 
"Schreibe 0, schreibe 1" keinen einzigen Fehler. Sieht gut aus.

Beim Auslesen des Speichers gibts auch kein einziges X mehr und die 
Ausgabe ist auch richtig.

Dann sollte ich nur noch wissen, wie ich die richtige Baudrate irgendwo 
ablesen kann. Vielleicht weiß da einer was, ich find den 
Atmel-Dokumentationen fehlt immer das Inhaltsverzeichnis...

von Jens P. (picler)


Lesenswert?

newbie schrieb:
> Dann sollte ich nur noch wissen, wie ich die richtige Baudrate irgendwo
> ablesen kann. Vielleicht weiß da einer was, ich find den
> Atmel-Dokumentationen fehlt immer das Inhaltsverzeichnis...

Da du eine Software-I2C-Lösung hast, wird die richtige Baudrate 
nirgendwo stehen. Die ist in erster Linie von der Leistungsfähigkeit des 
µC abhängig. Bei 8MHz µC-Takt hast du bei 400kHz Baudrate ca. 25 Befehle 
pro Bit. Das könnte schon etwas knapp werden. 1MHz kannst du dabei 
vergessen. Die Frequenz kann hier beliebig tiefer sein, da der Master 
den Takt vorgibt und sich alle Slaves danach richten müssen. Sie müssen 
halt nur hinterherkommen. Natürlich spielt auch noch die Leitungslänge 
eine Rolle. Es existieren zwar hier im Forum Berichte von Übertragungen 
über 20m, doch I2C wurde nun mal für die Verbindung zwischen zwei ICs 
auf einer Platine gemacht.

von Stefan (Gast)


Lesenswert?

I2c braucht PullUps und zwar extern und keine PullDowns wie in deiner 
Zeichnung. Darum misst du auch die Hälfte der Betriebsspannung.

von spontan (Gast)


Lesenswert?

@stefan:  Brille kaufen. Ich seh da PullUps.

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.