Hallo,
ich habe vor mehrere I2C Devices an meinem Arduino zu betreiben. Auf den ersten Blick scheint das ja recht einfach zu sein. Also habe ich mich zum Thema eingelesen und bin auf die Pull-Up Widerstande gestoßen.
Je mehr ich zu dem Thema lese um so verwirrter bin ich nun, da die Infos sich teilweise komplett widersprechen. Im Prinzip ist meine Frage dieselbe wie in diesem Thema allerdings wird sie dort für mich nicht ausreichend beantwortet. Deshalb möchte ich hier mal konkret nachfragen.
Jetzt habe ich folgende Fragen.
1.) Was bedeutet es, dass der Arduino wohl einen internen Pull-up-Widerstand hat. Mit dieser information kann ich leider gar nichts anfangen.
2.) Was kann schiefgehen, wenn der Pull-up-Widerstand fehlt. Wenn ich es richtig verstanden habe können dann die Daten nicht mehr übertragen werden da die "Logik-Level" nicht schnell genug erreicht werden. Ist es richtig, dass bei fehlendem Pull-up-Widerstand daher keine Gefahr für die Hardware ausgeht ?
3.) Wie geht man in meinem konkreten Fall jetzt vor. Besorge ich mir die Datenblätter und suche nach internen Pull-up-Widerständen? Und was bedeutet das dann, wenn die Devices welche haben oder eben keine haben?
Ich würde mich freuen wenn mir jemand am Beispiel dieses konkreten Setups hilft, damit ich auch ein generelles Verständnis für das Thema bekomme. Vielen Dank schonmal für eure Antworten
Miss erst mal an Deinen Modulen im stromlosen Zustand jeweils den Widerstand zwischen SDA / SCL und Vcc-Anschluß. Oft sind bei den Modulen PullUp-Widerstände schon verbaut.
Beim I2C-Bus sind die Ausgänge aller angeschlossenen Geräte 'open Collector' bzw. 'open Drain'. D.h. alle Geräte können den Bus auf Gnd ziehen, aber keiner der Geräteausgänge kann einen High-Pegel erzeugen. Um einen High-Pegel auf dem Bus ( sowohl SDA als auch SCL ) zu erzeugen, ist ein Pullup-Widerstand notwendig. Fehlt der, geht zwar nichts kaputt, aber es ist auch keine Datenübertragung möglich.
Viele der I2C Module haben einen solchen Widerstand bereits auf dem Modul verbaut. Schaltet man jetzt mehrere dieser Module zusammen, so sind alle diese Pullups parallel geschaltet. Hat man sehr viele solcher Module, kann der resultierende Widerstand so niedrig werden, dass die Ausgänge überlastet werden, wenn sie den Bus auf Gnd ziehen wollen. Dann muss man die Pullups auf einigen Modulen deaktivieren - aber mindestens auf einem muss er bleiben.
U.a bestimmt der resultierende Wert aller Pullups auch die mögliche Geschwindigkeit auf dem Bus. Denn von diesem Wert ist abhängig, wie schnell der High-Pegel erreicht wird, wenn alle Ausgänge 'offen' sind.
Hier gibt es Informationen zum Wert des Pullup-Widerstand.
Wie gesagt generiert der Pullupwiderstand den HIGH Pegel der SDA bzw SCL Leitung.
Dieser Widerstand muß einerseits die Kapazität der Leitungen in einer gewissen Zeit laden, andererseits auch die Ströme der Eingänge der verschiedenen Devices bringen. Darum muß der Pullupwiderstand umso kleiner sein, je mehr Devices am I2C Bus hängen bzw je länger der Kabel des Busses ist. Andererseits darf er auch nicht zu klein sein um die Ausgangstransistoren nicht zu überlasten. Der minimale Gesamtpullupwiderstand darf übersschlagsmäßig nicht kleiner als 2,2kOhm sein.
Der Gesamtpullupwiderstand errechnet sich aus der Paralellschaltung aller Pullupwiderstände der Devices und des Arduino.
Der Arduino aktiviert einen Pullupwiderstand im Inneren des Controllers der zwischen 20 und 50 kOhm liegt. Das ist wenig aber es reicht für ein Devices und einige cm Kabel. Die Module mit den I2C Devices können selbst Pullupwiderstände haben. Das mußt Du entweder die Vorgeschlagen messen oder in den Daten bzw Unterlagen der Module lesen.
2.) ... Ist es richtig, dass bei fehlendem Pull-up-Widerstand daher keine Gefahr für die Hardware ausgeht ?
Ja.
3.) Wie geht man in meinem konkreten Fall jetzt vor. ...
Wenn Du die Geräte fest verkabelst und sie nicht an-/abgestöpselt werden: Nimm zwei Widerstände à 4,7 kOhm und hänge sie irgendwo an SCL und SDA jeweils gegen +5 V.
Wenn Du sicher sein möchtest, dass der Bus auch noch funktioniert, wenn Du mal ein Gerät abhängst, statte jedes Gerät mit je zwei Pull-up-Widerständen à 10 kOhm aus. Wenn die Leitungen nicht allzu lang sind, funktioniert das.
Testen oder im Datenblatt Nachgucken, ob schon Pull-up-Widerstände vorhanden sind, ist allerdings auch nicht verkehrt. Wenn zu viele Widerstände parallel geschaltet werden verringert sich der „Gesamt-Pull-up“.
Meines Wissens haben die Displays mit I2C-Schnittstelle eingebaute PullUps.
ArdunioArti:
Zusätzlich hat der Arduino wohl noch einen internen 10kOhm Widerstand.
Der Arduino UNO hat keine, der Arduino Mega2560 hat je 10 kOhm. Das sieht man im Schaltbild.
ArdunioArti:
3.) Wie geht man in meinem konkreten Fall jetzt vor. Besorge ich mir die Datenblätter und suche nach internen Pull-up-Widerständen? Und was bedeutet das dann, wenn die Devices welche haben oder eben keine haben?
Wenn Du es genau wissen möchtest, schaust Du in Schaltpläne oder mißt. Nach meiner Einschätzung sollte es aber "einfach so" funktionieren. Worst case vier Widerstände mit 4,7 kOhm parallel ergibt mehr als 1 kOhm, damit ist kein Ausgang überlastet, also keine Gefahr.
[quote author=ArdunioArti on Today at 12:04 pm]Zusätzlich hat der Arduino wohl noch einen internen 10kOhm Widerstand.
Der Arduino UNO hat keine, der Arduino Mega2560 hat je 10 kOhm. Das sieht man im Schaltbild.
[/quote]
Die I2C Bibliothek schaltet die dem Kontroller internen Pullups ein.
Grüße Uwe
uwefed:
Die I2C Bibliothek schaltet die dem Kontroller internen Pullups ein.
Ja, die ungefähr 50 kOhm sollen für kurze Entfernungen reichen. Meine praktischen Erfahrungen sind aber nicht so positiv, daher hatte ich es nicht erwähnt.
uwefed:
Meiner Erfahrung ein DS3231 auf 4cm reichen die internen Pullups.
Meine DS3231-Platinen haben PullUps drauf, behauptet ein Schaltplan, den ich fand. In der Kombi UNO - OLED - DS3231 funktioniert das Display, ohne DS3231 aber nicht, was den Schaltplan bestätigen würde. Ich nutze allerdings gerne einen erhöhten Takt von 400kHz.
Einem Anfänger möchte ich daher die internen 50 kOhm des UNO nicht empfehlen, weil nach meiner Erfahrung zu unsicher.
Bei vielen I2C Geräten an einem Bus besteht eher die Gefahr, daß zu viele Pullup-Widerstände montiert sind. Man kann den Kurzschlußstrom mit dem Multimeter prüfen, es sollten nicht viel mehr als 2mA nach Gnd fließen - bei 5V Vcc wären das ca. 2k Pullup insgesamt.
Vielen Danke für die vielen Antworten.
Ich habe jetzt wie hier beschrieben versucht Rpmin und Rpmax auszurechnen.
VCC= 5V Cb=400pF Standard Mode
Damit komme ich auf Rpmin=1000Ω und Rpmax=2950 Ω
Ich nehme an, dass der Wert von 400pF der Maximalwert für I2C ist.
Das heiß also, dass der minimale Rp lediglich durch die verwendete Spannung bestimmt wird und bei einem Arduino, der mit 5V versorgt wird bei 1kΩ liegt.
Der maximale Wert ist abhängig von der kapazitiven Belastung, welche durch die einzelnen Devices und die Kabellänge bestimmt wird.
Damit lässt sich für mich als Elektroniklaien Rpmax leider immer noch nicht berechnen. Ich muss ja jetzt irgendwie Cb noch bestimmen.
Wie geht man hier vor ?
Kann man Cb der einzelnen Geräte messen ?
Ich habe jetzt auch wie von euch vorgeschlagen, die Pull-up-Widerstände des Displaycontrollers und des Datenlogger-Shields gemessen. Ich habe 2,2kΩ und 4,65kΩ gemessen. Dies ergibt einen Gesamtwiderstand von 1,5 kΩ. Damit sollte das Ganze ohne zusätzlichen Pull-up-Widerstand funktionieren. Ich werde das nachher mal testen.
ArdunioArti:
Wie geht man hier vor ?
Kann man Cb der einzelnen Geräte messen ?
Worst case: Unter 220 Ω fließt zu viel Strom, bei hohen Widerstandswerten werden die Signale durch (Leitungs-)Kapazitäten verschliffen.
Wenn Du die Wahl nicht begründen mußt, so solltest Du mit Werten zwischen 1 kΩ und 10 kΩ zu guten Ergebnissen kommen, wobei ich eher zu 4,7 bis 10 kΩ tendiere.
Wenn Du den I2C-Bus beschleunigen möchtest: "Wire.setClock(400000L); should set it to 400kHz. Wire.setClock() must be called after Wire.begin(). Wire.begin() initializes the bitrate to 100kHz. "