I²C-Unverträglichkeiten

Hallo,

ich betreibe am I²C-Bus eines Arduino Uno vier Geräte (LCD, LED-Display, Temperatursensor, FM-Radio). Problem: das Radio funktioniert nur, wenn das LED-Display NICHT am Bus hängt. Es gibt keinen Adresskonflikt.
Es ist sogar so, daß wenn ich das System ohne LED-Display starte und manuell später dazuschalte - dann laufen alle 4 Busgeräte ohne Probleme parallel.
Der Konflikt besteht nur zwischen diesen beiden Geräten. Im Moment bin ich etwas ideenlos...

Grüße
Roland

Damit wir Ideen haben können, fehlt Schaltplan, Sketch und genaue Liste der Komponenten.

So sind wir auch ratlos. Ich seh weder Schaltplan, Bilder vom Aufbau noch einen Sketch!

FM-Radio? Ich würde behaupten, das ganze Problem kann mit diversen Störungen auf den I2C Leitungen zu tun haben.

Theseus:
Damit wir Ideen haben können, fehlt Schaltplan, Sketch und genaue Liste der Komponenten.

Und länge der Kabel dazwischen.

Guten Morgen,

also zugegeben, ein paar Infos fehlen wohl:

-LCD: Ywrobot LMB162AFC Alphanumerisch 2*16 Zeilen
-LED: Adafruit 7-Segment Backpack HT16K33
-Temperatursensor: C-Control Temperatursensor 198298
-Radio: Seeed Studio Grove - I2C FM Receiver

Den Schaltplan spare ich mir, es ist ein simpler I²C-Bus mit 4k7-Pullups an den Signalleitungen. Stromversorgung über einen 78S05 mit kompletter Beschaltung. Busverdrahtung sternförmig (serielle Verschaltung auch getestet, erfolglos), Kabel pro Modul ca. 20 cm Flachbandleitung.

Den Sketch habe ich mir (und Euch) erspart, weil er ellenlang ist und weil die Module ja alle funktionieren - sie dürfen nur beim Einschalten nicht zusammen am Bus hängen. Ich trenne aber gerne die relevanten Codebausteine heraus und liefere sie nach. Dauert ein wenig...

5 mal 20 cm = 1m
Und du wunderst dich über einen versagenden I2C Bus...

also zugegeben, ein paar Infos fehlen wohl:

Da du haben Recht!
Die wichtigsten Infos fehlten

Ein Temperaturfühler für über 15 Euro? :o
Der kann auch nicht mehr als ein DS18B20...

Die 4k7 pullups sind für diese Längen untauglich bzw. weil 4 Leitungen im Spiel sind, musst du den Wert verändern = verkleinern. Teste mal mit 1k5.. 1k2 Widerständen. Das sollte die Signale wieder zurechtschleifen.

Ich konnte auf die Schnelle nur einen englischsprachigen link mit guter Erklärung bzgl. Widerständen am I2C Bus finden:

Mit welcher Spannung gehst du in den 78S05 rein und hat dieser einen Kühlkörper ?

HotSystems:
Mit welcher Spannung gehst du in den 78S05 rein und hat dieser einen Kühlkörper ?

Und Kondensatoren davor wie dahinter....

-LCD: Ywrobot LMB162AFC Alphanumerisch 2*16 Zeilen
-LED: Adafruit 7-Segment Backpack HT16K33
-Temperatursensor: C-Control Temperatursensor 198298
-Radio: Seeed Studio Grove - I2C FM Receiver

Habe mal nachfolgend die Stromverbräuche zusammengestellt:

  1. LCD LMB162AFC: 70 mA typ. für backlight, Anzeige: 1..2mA
  2. 7Segm. HT16K33: 40 mA angebl. max. Wert, wenn alle Segmente leuchten
  3. Tem. Sensor: 1,25 mA
  4. Receiver: 21 mA

ergibt zusammen mit dem Arduino Selbstverbrauch ca. 150 mA.

Wenn der 78S05 mit 12V gespeist wird und alles versorgt, dann entsteht eine Verlustleistung von
Pv = (12V - 5V) * 0,15mA = ca. 1W; das müsste auf jeden Fall gekühlt werden, sonst wird er zu heiß.

Sollte eine ausreichende Kühlung bereits vorhanden sein, dann gehe ich davon aus, dass das Problem in den zu groß dimensionierten I2C pullup-Widerständen liegt, die dann auf 1k5 .. 1k2 reduziert werden sollten.

Kondensatoren würden imho eher eine Verschlechterung, da zusätzliche Verschleifung der Signale bringen; dafür sorgen bei den Längen schon die Leitungskapazitäten.

rpt007:
Wenn der 78S05 mit 12V gespeist wird und alles versorgt, dann entsteht eine Verlustleistung von
Pv = (12V - 5V) * 0,15mA = ca. 1W; das müsste auf jeden Fall gekühlt werden, sonst wird er zu heiß.

Hier meinst du sicher 0,15A, nicht mA. :wink:

Zur Länge des Busses: da geht noch einiges! :o Ich kann nur noch mal wiederholen: nur Radio und LED beharken sich - die aber beharrlich.

Temperaturfühler: nein, 0 Euro! (Fremde Bastelkiste :wink: Sonst in der Tat überteuert (der Conrad-Effekt).

Pullups: Das ist in der Tat ein Ansatzpunkt. Ich glaube, bis 1k kann man problemlos runtergehen. Werde ich testen!

78S05: (Kurzform:) Kein Kühlkörper, da aktuell nur 0,7 W Verlustleistung => handwarm. Komplette Kondensatorbeschaltung nach Vorgabe. Allerdings, zweiter Ansatzpunkt, wenn die kleineren Pullups nichts bringen: größeren Pufferkondensator verwenden. Die 5V einschalten, Puffer laden lassen und erst dann den Bus initialisieren. Vielleicht führt das LED-Display zu einem Spannungseinbruch...

DonKrawallo:
Vielleicht führt das LED-Display zu einem Spannungseinbruch...

Hast du die Stromaufnahme des Displays mal gemessen ?
Ist da ein Vorwiderstand eingebaut ?

Es gibt Displays auf dem Markt, die ohne einen Vorwiderstand geliefert werden.
Dann ist die Stromaufnahme deutlich zu hoch.

Edit:
Hier meine ich den Vorwiderstand für die Led der Hintergrundbeleuchtung.

Und wenn du mal probierst beim Initialisieren im setup() hinter jeder Komponente ein kurzes delay() einzufügen?

Hier meinst du sicher 0,15A, nicht mA

So isses. Danke für die Richtigstellung. Zumindest bin ich bei der Verlustleistung nicht auf 1mW gekommen :roll_eyes:

Hast du die Stromaufnahme des Displays mal gemessen ?

Wenn die Verlustleistung bei 0,7W, also deutlich unter dem Wert liegt, den ich anhand der Datenblätter überschlägig berechnet hatte, dann zieht das Display auch tatsächlich nur die 70mA oder weniger für das Backlight.

Somit würde sich imho der Vorwiderstand erübrigen und die Problematik sich von einem potenziellen Stromversorgungsproblem Richtung pullups richten. Ich denke, da liegt der Hund begraben.

Der Vorschlag von @Scherheinz mit dem verzögerten Initialisieren trägt wahrscheinlich auch zum Stabilisieren bei; jedenfalls schadet es auch nicht.

Das Display ist ein I²C-Modul inklusive Treiber, d.h. direkter Anschluß an 5V und Bus. Die Stromaufnahme habe ich gemessen, es zieht ohne eingeschaltete Segmente (und das ist der aktuelle Testzustand) 0,11 mA (!). Beim Einschalten erzeugt es je einen kurzen Peak von +90 mA und -50 mA, also alles im grünen Bereich.
Die Pullups sind nun umgelötet (je 1,1 kOhm). Jetzt geht das Radio gar nicht mehr! Auf dem Bus liegen die Pegel bei low=0,2 V und high=5,0 V. Eigentlich gut...
Edit:
Wieder auf 4k7 gegangen - Radio geht wieder (wie vorher). Werde noch mal einen Zwischenstufe testen. Verzögertes Initialisieren brachte leider auch keine Abhilfe. Ich kann aber erst morgen weiter testen - Danke erst mal für die vielen Tipps!

Viele I2C Platinchen haben schon Pullups drauf.
Vielleicht auf dem Wege schon zuviel Buslast.

Bingo! Das Problem lag genau anders herum. Ich habe die Pullups komplett entfernt - jetzt läuft's problemlos. Das macht zwar keinen Sinn, daß Busgeräte ihre eigenen Pullups haben, aber so ist es wohl...