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..
Ohne Deinen Aufbau genau zu kennen, vermute ich das hier die Kapazität der Leitungen zum tragen kommt.
Das Kabel ist ein 4 Pol- Telefonkabel. Was mich irritiert, das ganze hat mal funktioniert.
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.
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
Mit Google-Account einloggen
Noch kein Account? Hier anmelden.