Arduino Pro Mini 5V, Pullups für I2C?

Hallo

Ich möchte an einem Arduino Pro Mini 5V den I2C Port nutzen. Nun hat das Board zwei freie Pads hinten für I2C Widerstände. Wie gross müssen diese beim Pro Mini sein? Auch 4.7k?
Wenn ich ein OLED Display noch nutze, wären dann 10k besser, weil das OLED Display standardmässig schon 10k drauf hat?

Grüsse

Stef

Wie lange sind die Verbindungskabel?
Ist noch etwas am I2C Bus angeschlossen oder nur das Display?

Grüße Uwe

Du solltest alle Module prüfen, die an den I2C Bus angeschlossen werden sollen.
Wenn weitere Module auch die Pullups drauf haben, brauchst du def. keine weiteren.
Ansonsten sind 10k ok. Wobei auch 4k7 kannst du verwenden. Aber eben nur wenn keine weiteren Pullups vorhanden sind.

Das verwendete Target ist egal.
https://www.nxp.com/docs/en/user-guide/UM10204.pdf Chapter 7.1

Kabellänge ca. 70cm - 1m. Etwas viel, aber ich versuchs.
Ist nur der Pro Mini und das OLED Display an einem Uno dran.

Der Uno hat ja keine drauf und der Pro Mini auch nicht (nur optional). Also haben bis jetzt nur das OLED Display 10k drauf.

War mir grad nicht sicher, ob der ProMini was spezielles hat. Gemäss Schema steht ja nur "Optionale Widerstände" drin.

Die Widerstände sind ja egal ob beim Master oder Slave vorhanden, ist ja ein Bus?!

Stimmt nicht ganz. Es werden die internen Pullupwiderstände aktiviert. Diese sind zwischen 20-50kOhm.

Da würde ich schon einen etwas kleinen Pullupwiderstand nehmen. Würde 2,2kOhm wählen.

Grüße Uwe

Dann wären es ca. 1.65k? Ist das nicht ein bisschen wenig?

Nebenbei, ist das beim Mega dann auch so, dass man die internen Pullups berücksichtigen sollte? Macht nicht so viel aus, aber dann wären bei einem Mega, einem Uno und eine Display ja 10k plus interne 20-50k, 10k vom Display = 4k gerade i.O. wenn die Kabellänge unter 50cm bleibt?

So ist's wohl.
Bedenke: Der R soll der Kapazität der Leitung und der erforderlichen Flankensteilheit entsprechen.
Bei Deinen 70cm ist es nicht sooo problematisch - Der obere und untere R ist da eher soweit auseinander, das es sich nicht lohnt nachzurechnen :wink:
Das mit 10K geht. 5 K tun es wohl auch. Und sobald Du noch was dran baust, was einen eigenen R mitbringt, ist das eh Makulatur. :wink: Passt schon...

Alles klar, vielen Dank!

Der I²C-Bus kann mit verschiedenen Frequenzen betrieben werden. Je nach verwendeter Bibliothek wird diese Frequenz auch verändert. Generell lohnt ein Blick auf diesen Umstand, besonders natürlich bei größeren Entfernungen. PullUp-Widerstände und Busfrequenz müssen gemeinsam betrachtet werden.

Ich verwende den MultiSpeedI2CScanner.

Das ist einfach ein I2C Scanner, oder? Der scannt nach verfügbaren Adressen die am I2C Bus erkannt werden können. Wie kann mir das bei den Widerständen/Kabellängen helfen?

Hallo,

der Scanner hilft einem in sofern das man überhaupt erstmal grob weiß das der Bus funktioniert und alle Devices erkannt werden oder eben auch nicht und es keinen Adresssalat gibt.

Das mit den Pullups ist eine leicht komplexere Geschichte. Wenn man die Standardeinstellung von 100kHz belässt, kann man 10k für die Pullup locker verwenden. Ich rede vom Gesamtwiderstand aller vorhandenen Pullups. Es weiß ja niemand wo alles bei jemanden noch irgendwo Pullups verbaut sind. Das muss derjenige immer selbst wissen oder nachmessen.

Ein guter Kompromiss für alles als Zielwert sollten 4,7k sein. Damit erreicht man in der Regel schon einmal ordentliche Pegel. Damit sind auch 400kHz mit leichter Abweichung kein Problem falls man das nutzen möchte, hängt auch immer vom Device ab ob es die Frequenz unterstützt. Und wie ich selbst feststellen durfte verhält sich der Takt vom Master sowieso dynamisch. Extrembsp. Man stellt 800kHz ein und hat 4,7k Pullups. Der Bus funktioniert. Misst man jedoch nach taktet er deutlich langsamer. Grund ist das die Flanken verschliffen und nicht steil genug sind. Und das alles auf und innerhalb eines Boards mit onboard Devices und ohne weiteren externe Devices. Der Master taktet nämlich nicht sturr drauflos sondern guckt nach den Schwellwerten. Möchte damit sagen, wer wirklich einen schnelleren Bus benötigt muss nachmessen und die Pullups anpassen. Da werden dann Werte um die 2,2k erforderlich. Wer noch höher takten möchte kommt dann ganz schnell in Regionen von 1,5k. Das hängt alles vom Controller ab was er für Einstellungen bietet und ob das die Devices überhaupt können. 100kHz bis 400kHz sind in der Regel Standard was alle Devices können sollten.

Wer immer nur Standard fährt interessiert das alles nicht und muss nur dafür sorgen das der Pullupwert nicht zu groß und nicht zu klein ist. Da ist zwischen 4,7k und 10k alles erlaubt. Nur die Kabellänge sollte man im Auge behalten. Ich weiß aus dem Forum das auch 1 Meter hier und da funktioniert, aber dafür ist I2C nie gedacht gewesen. Das kann und wird auch irgendwie funktionieren. Nur sollte man sich nicht wundern wenn Datenmüll übertragen wird. Die Fehlersuche ist dann nämlich schwierig, weil das ACK meistens durchkommt und man dennoch dumm dasteht. Man müßte dann mit Logikanalyzer und Oszi auf Fehlersuche gehen. Dafür gibts I2C Portexpander die das Problem mit der Kabellänge entschärfen.

Wegen der Position der Pullups. Nach Möglichkeit am letzten Devices vom Bus. Das hat dann etwas von einer Terminierung. Es macht keinen Sinn die Pullups am Master zu platzieren und dann 1 Meter Kabel mit vielleicht noch offenen Enden. Will man maximal flexibel sein entfernt man alle Pullups von allen Devices und baut sich einen externen Terminator. Gab es früher am SCSI Bus wer den noch kennt. Dann kann man die Device bunt mischen je nach Bedarf und klemmt die Pullups immer ans Kabelende bzw. am letzten Device an. Oder man sucht sich ein bestimmtes "letztes" Device zum Abschluss aus und entfernt die Pullups auf allen anderen. Einfach mal in Ruhe überlegen.

beschreibt die Problematik mit dem Pullup Widerstand sehr anschaulich.

Grüße Uwe

Danke euch beiden! Werde ich mal durchmessen wie viel effektiv verbaut ist.

Habe gerade noch unter den Pullups im Gammon Forum das hier gefunden: GitHub - DSSCircuits/I2C-Master-Library: An alternative library to Arduino's Wire library

Diese Library sagt er ist nur für den Master, damit dieser Blockaden überbrückt. Im Beispielsketch wird die Lib mit I2C.h aufgerufen. Hat diese schon jemand verwendet?
Wird da beim Master dann diese Lib mit I2C.h und beim Slave die normale Wire.h eingefügt? Befehle sind dann beim Master I2C.write(.....) und beim Slave normal mit Wire?

Der Scanner kann Dir eine Information geben, welche Frequenzen Dein OLED grundsätzlich akzeptiert, denn nicht jede Hardware kann jede Frequenz verarbeiten. Wire verwendet meines Wissens beim ProMini 100 kHz, das sollte immer funktionieren. Bibliotheken wie U8g2, verändern diese Frequenz beispielsweise auf 400 kHz. Bei kurzen Kabeln ist das kein Problem, bei längeren dann eben doch. Eventuell mußt Du auf 100 kHz zurückgehen.

Die anderen Aspekte sind in #12 ausführlich beschrieben.

This topic was automatically closed 180 days after the last reply. New replies are no longer allowed.