Forum: Mikrocontroller und Digitale Elektronik BMP280 und sht21 am langen I2C Bus


von Pete (Gast)


Lesenswert?

Hallo,

habe ein komisches Problem. An einem Wemos habe ich einen BMP280 und 
einen SHT21 am I2C Bus hängen. Der BMP hat ca. 10cm  Kabel bis zum Wemos 
und der SHT ca 5m. Der SHT funktioniert auch bei der Länge des Kabels 
einwandfrei. der kurz angebundene BMP280 funktioniert nur, wenn ich den 
SHT abklemme. Noch komischer: Alleine das lange Kabel bis zum SHT 
scheint den BMP zu stören. Es reicht nämlich nicht, den SHT am Ende 
abzuklemmen. Das Kabel muss entfernt werden, um den BMP zum laufen zu 
bringen. Nehme ich ein kürzeres Kabel zum SHT (1m), dann gehen beide 
einwandfrei. Welches Problem liegt hier vor?
Ach noch was, am Bus hängt noch ein BH1750 Lichtsensor. Direkt an den 
BMP280 mit dran. Den stört das lange Kabel nicht. Der geht immer, 
genauso wie der SHT21.

Grüße..

von kenny (Gast)


Lesenswert?

Ohne Deinen Aufbau genau zu kennen, vermute ich das hier die Kapazität 
der Leitungen zum tragen kommt.

von Pete (Gast)


Lesenswert?

Das Kabel ist ein 4 Pol- Telefonkabel. Was mich irritiert, das ganze hat 
mal funktioniert.

von M. K. (sylaina)


Lesenswert?

Pete schrieb:
> Kabel bis zum Wemos
> und der SHT ca 5m

5m sind schon ganz schön viel für I2C. Wie schaut denn das 
Oszilloskop-Bild aus? Ich vermute mal, dass die Kapazität des Kabels zu 
hoch ist und ggf. hast du auch noch Reflektionen, die das I2C-Signal 
stören.

von Pete (Gast)


Lesenswert?

War noch nicht mit dem oszi dran. Was mich verwirrt ist eben, dass der 
sht in 5 m Entfernung funktioniert, der bme in 10 cm nicht. Und wie 
gesagt , dass das ganze mal so  schon mal funktioniert hat.

von Klaus R. (klara)


Angehängte Dateien:

Lesenswert?

Pete schrieb:
> Ach noch was, am Bus hängt noch ein BH1750 Lichtsensor. Direkt an den
> BMP280 mit dran. Den stört das lange Kabel nicht. Der geht immer,
> genauso wie der SHT21.

Geh doch mal mit der Taktfrequenz des I2C Bus herunter. Du wirst 
vermutlich mit 100 kHz takten. 5 m könnten schon zu viel für einen 
BMP280 sein. Bei dem kommt es sicher auf genaues Timing an.

Außerdem sollte man vor jedem CLK und SDA am Device einen 330 Ohm 
Widerstand in Reihe schalten. Das verbessert die Signale. Die 
Portkapazitäten werden so in ihrer störenden Wirkung gemindert.

Mit "Wire.setClock(frequenz)" läßt sich der Takt verändern. Ich selber 
wollte mal mit ca. 3 KHz takten. Das hätte ich für ca. 20 m Telefonkabel 
benötigt. Leider konnte ich nur bis etwas unter 10 KHz kommen. In der 
Wire-Lib achtet man in der Tat auf ein internes Tastverhältnis das 
eingehalten werden muß. Das war wohl mit 10 KHz erreicht.

Anbei meine INO.
mfg Klaus

von Stefan F. (Gast)


Lesenswert?

Pete schrieb:
> Welches Problem liegt hier vor?

Hänge ein Oszilloskop an den Bus, dann siehst du es sofort.

> Was mich irritiert, das ganze hat mal funktioniert.

Zwischen "geht" und "geht nicht" ist immer eine Schwelle. Steht man kurz 
davor, geht es noch. Da können ganz kleine Unterschiede relevant ein, 
wie die Zimmertemperatur oder das Möbel verrückt wurden.

> War noch nicht mit dem oszi dran. Was mich verwirrt ist eben,
> dass der sht in 5 m Entfernung funktioniert, der bme in 10 cm nicht.

Die Chips werden unterschiedliche Anforderungen ans Signal haben oder 
unterschiedlich starke Ausgangstreiber.

5 Meter sind für I²C verdammt viel. Für solche Leitungslängen ist I²C 
nicht vorgesehen - auch wenn es unter gewissen Umständen irgendwie 
funktionieren mag.

Siehe https://www.nxp.com/docs/en/user-guide/UM10204.pdf Kapitel 7

von M. K. (sylaina)


Lesenswert?

Pete schrieb:
> War noch nicht mit dem oszi dran. Was mich verwirrt ist eben, dass der
> sht in 5 m Entfernung funktioniert, der bme in 10 cm nicht.

Deshalb ja die Sache mit den Reflektionen. Aus den 5m kommt vielleicht 
was, was der BME280 in 10 cm nicht mehr ganz so geil findet. Das siehste 
am ehesten mit nem Oszi ;)

von M. K. (sylaina)


Lesenswert?

Klaus R. schrieb:
> Mit "Wire.setClock(frequenz)" läßt sich der Takt verändern. Ich selber
> wollte mal mit ca. 3 KHz takten. Das hätte ich für ca. 20 m Telefonkabel
> benötigt. Leider konnte ich nur bis etwas unter 10 KHz kommen. In der
> Wire-Lib achtet man in der Tat auf ein internes Tastverhältnis das
> eingehalten werden muß. Das war wohl mit 10 KHz erreicht.

Beim AVR heißt das taktbestimmende Register TWBR und weniger als 0 kann 
man da nicht reinschreiben für die obere Frequenz und mehr als 255 passt 
da auch nicht rein für die untere Frequenz. Daher gibts da obere und 
untere Grenzen für die Frequenz ;)

von Pete (Gast)


Lesenswert?

Hallo,

Problem gelöst! Der Tipp von @sylaina mit Wire.setClock hat geholfen. 
Habe die Frequenz heruntergesetzt, und konnte sogar noch einmal auf 6m 
verlängern. Das Oszi hat mir kein sauberes Rechtecksignal angezeigt. Die 
High-Pegel waren alle "verkrüppelt" Ich bin zwar (leider) kein Experte 
im Umgang mit dem Oszilloskop, aber im Vergleich zum Signal ohne 5m 
Kabel war das klar zu erkennen.

Danke für eure Hilfestellung!

von M. K. (sylaina)


Lesenswert?

Dann ist es in der Tat ein Kapazitätsproblem der Leitung. Ich empfehle 
dir zudem noch ein wenig mit den Terminierungswiderständen zu spielen 
damit das Signal noch sauberer wird. Das erhöht die Ausfallsicherheit, 
falls vielleicht mal jemand das Kabel tauschen will und es danach nicht 
mehr geht ;)

von Falk B. (falk)


Lesenswert?

Stefan ⛄ F. schrieb:
> 5 Meter sind für I²C verdammt viel. Für solche Leitungslängen ist I²C
> nicht vorgesehen - auch wenn es unter gewissen Umständen irgendwie
> funktionieren mag.

Wenn man weiß was man tut gehen auch 100m. Sowas hab ich mal in einer 
Industriesteuerung gesehen, dort wurde ein digitales Poti verstellt. Mit 
ausreichend niedrigem Takt, passenden Pull-Ups und geschirmten Kabel 
geht das.

von Falk B. (falk)


Lesenswert?

M. K. schrieb:
> Dann ist es in der Tat ein Kapazitätsproblem der Leitung. Ich empfehle
> dir zudem noch ein wenig mit den Terminierungswiderständen zu spielen

I2C hat keine Terminierungswiderstände, nur Pull-Up Widerstände!
Die sollten so niederohmig wie möglich sein, sodaß die ICs noch sauberen 
LOW-Pegel erreichen. Ich mein, I2C ist für max. 3mA Pull-Up Strom 
gebaut, macht min. 1,8k an 5V bzw. 1,1k an 3,3V.
Wo die Pull-Up Widerstände angeschlossen werden ist egal, das Thema 
Wellenwiderstand ist hier nicht maßgeblich.

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.