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..
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.
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.
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
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
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 ;)
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 ;)
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!
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 ;)
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.
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.