Fragen zum I2C Bus

Hallo Zusammen,

ich habe ein paar Fragen zum I2C Bus.

Ist mein Bus wie in dem Bild zusehen richtig verdrahtet? Es hängen ja alle Teilnehmer parallel und das sollte doch so richtig sein oder?

Ich habe eine Gesamt Kabellänge von ca. 1,4m ist dies zu lang und sollte ich vielleicht einen Extender nutzen und wenn ja welchen und wie wird dieser in den Bus eingebunden?

Was würddet ihr für ein Kabel wählen? Ich kann leider nicht an Kabel weg sparen von daher sollte vielleicht das Kabel schon richtig gewählt werden oder? Telefon/Fernemeldekabel vielleicht?

Wie habt ihr das so mit den Verkabeln des Boards gelöst? Ich habe bis jetzt nur diese Steckbrett Kabel aber die sind leider viel zu kurz.

Muss ich in meinem Programm Code die Pullup Widerstände aktivieren oder muss ich die aufgrund der Kabelwahl und Kabellänge selber mit ein löten und anpassen?

SaschaH87:
Ist mein Bus wie in dem Bild zusehen richtig verdrahtet? Es hängen ja alle Teilnehmer parallel und das sollte doch so richtig sein oder?

Für mich sieht das richtig aus. Ich bin allerdings nicht allzu I²C-erfahren und was die MCP-Dinger sind, weißt vermutlich nur Du.

SaschaH87:
Ich habe eine Gesamt Kabellänge von ca. 1,4m ist dies zu lang und sollte ich vielleicht einen Extender nutzen und wenn ja welchen und wie wird dieser in den Bus eingebunden?

1,4 m sind nicht gerade kurz. Aber I²C wurde für den Gebrauch z. B. in TV-Geräten konzipiert und wenn man Breite und Höhe einer großen Glotze addiert, kommt man leicht auf über 1 Meter. Ich würde sagen, dass 1,4 m noch akzeptabel sind.

SaschaH87:
Was würddet ihr für ein Kabel wählen? Ich kann leider nicht an Kabel weg sparen von daher sollte vielleicht das Kabel schon richtig gewählt werden oder? Telefon/Fernemeldekabel vielleicht?

Bei meinen Experimenten und Basteleien mit dem I²C-Bus waren die Leitungen entweder Leiterbahnen oder einfache Drähte, wie man sie für Steckbretter benutzt. Wenn Du sicher sein möchtest, dass es nicht an den Kabeln liegt, wenn etwas nicht funktioniert, solltest Du abgeschirmtest Kabel benutzen. Ich würde einfaches CAT5-Verlegekabel benutzen, davon habe ich noch einen Ring mit ungefähr 70 m im Keller liegen.

SaschaH87:
Wie habt ihr das so mit den Verkabeln des Boards gelöst? Ich habe bis jetzt nur diese Steckbrett Kabel aber die sind leider viel zu kurz.

Ich habe die Drahtenden entweder wie gewohnt in die Buchsenleisten eines Unos gesteckt oder an Stiftleisten angelötet und dann diese an den Uno gesteckt. Reine Draht-Buchsenleisten-Steckverbindungen sind halt nicht so unheimlich sicher, was den Kontakt angeht. Und dass mal ein Draht rausgerutscht ist, ist mir auch schon passiert. Zum Probieren stecke ich, am Ende wird gelötet.

SaschaH87:
Muss ich in meinem Programm Code die Pullup Widerstände aktivieren oder muss ich die aufgrund der Kabelwahl und Kabellänge selber mit ein löten und anpassen?

Wenn Du die internen Pull-up-Widerstände im Code aktivierst, sollten die genügen. Weil ich die Pull-ups schon einmal vergessen hatte, habe ich mir angewöhnt externe Widerstände zu benutzen.

HTH

Gregor

SaschaH87:
Ist mein Bus wie in dem Bild zusehen richtig verdrahtet? Es hängen ja alle Teilnehmer parallel und das sollte doch so richtig sein oder?

Das ist so nicht verlässlich zu sagen.
Auf den ersten Blick: nein.
Am MCP-Chip0 belegt der I2C die Pins 3 & 4 an den anderen 1 & 2 - dementsprechend ist die Betriebsspannung ebenfalls verbastelt.
Du musst Dir angewöhnen die Signalleitungen und Pins zu beschriften.

Ich habe eine Gesamt Kabellänge von ca. 1,4m ist dies zu lang und sollte ich vielleicht einen Extender nutzen und wenn ja welchen und wie wird dieser in den Bus eingebunden?

Welche Geschwindigkeit benutzt Du auf dem Bus?
100Khz gehen eigentlich problemlos. 5Mhz ungeschirmt und in "verschmutzter" Umgebung eher nicht.
Die Leitungskapazität sollte 200pf nicht übersteigen - sonst brauchts Buffer.
Es soll Leute geben, die damit 400Khz auf 50mtr und mehr machen.

Wie habt ihr das so mit den Verkabeln des Boards gelöst? Ich habe bis jetzt nur diese Steckbrett Kabel aber die sind leider viel zu kurz.

Besorg Dir Stiftleisten und Schrumpfschlauch. Löte Dir die Drähte an und fertig.
Ich hab die als 25cm auch schon fertig gesehen sowohl als male/male als auch male/female.

Muss ich in meinem Programm Code die Pullup Widerstände aktivieren oder muss ich die aufgrund der Kabelwahl und Kabellänge selber mit ein löten und anpassen?

Machs selber.
In der Spezifikation http://www.nxp.com/documents/user_manual/UM10204.pdf Punkt7

Gruß

Flachbandkabel kann ganz praktisch sein, wenn man mal Änderungen am Aufbau durchführen möchte. Meine Port-Expander Platinchen haben Stiftleisten, für die sich die Buchsenleisten einfach da aufs Flachbandkabel aufquetschen lassen, wo sie benötigt werden - notfalls mit einer Rohrzange. Über dieses Kabel kann man auch die Versorgungsspannung für die einzelnen Module laufen lassen.

Was die Pullup-Widerstände betrifft, da kann man den Kurzschlußstrom der Signalleitungen gegen Gnd messen (im eingeschalteten Zustand). Keine Angst, dabei geht nichts kaputt. Der Strom sollte nicht höher als je 3mA sein, falls doch muß man die irgendwo verbauten Pullups entfernen. Weniger Strom geht auch, ist dann aber störanfälliger. Eigentlich sollten Pullups nur an den Enden des Kabels sitzen, und da kann man noch einen Widerstand dranhängen, um den Kurzschlußstrom auf 3mA zu bringen.

gregorss:
Wenn Du die internen Pull-up-Widerstände im Code aktivierst, sollten die genügen.

Die internen pullup-Widerstände des Arduino sind definitiv zu hochohmig. Ich würde schon auf 1,5kOhm runtergehen. Könnte funktionieren.

Ein sehr Grevierender Fehler ist das fehlen der gemeinsamen Masse. Die 0V des Netzteils müssen mit GND von Arduino verbunden werden.

Jede MCP muß eine andere Adresse haben.

Grüße Uwe

uwefed:
Die internen pullup-Widerstände des Arduino sind definitiv zu hochohmig. Ich würde schon auf 1,5kOhm runtergehen. Könnte funktionieren.

Huch?! Wegen der Leitungslänge oder wegen der MCPs?

Gruß

Gregor

Huch?! Wegen der Leitungslänge oder wegen der MCPs?

Die Lösung liegt dazwischen.
Schau mal in die bereits angesprochene Spec - 7.2.4

Gruß

Laie:
Die Lösung liegt dazwischen.
Schau mal in die bereits angesprochene Spec - 7.2.4

Oha. Tatsächlich. Danke!

Gruß

Gregor

Auf der Schaltung steht 5 Volt extern. wenn das nicht die selben 5 Volt sind, mit denen der Arduino versorgt wird, dann fehlt eine Verbindung vom GND Arduino zum GND Externe 5 Volt.

gregorss:
Huch?! Wegen der Leitungslänge oder wegen der MCPs?

Wegen beidem.
Durch die Leitungslänge hat der Kabel eine signifikante Kapazität und jedes Device braucht etwas Strom an den Eingängen. Beides bedingt ein langsameres Ansteigen der L-H Flanke und bei zu langsamen Ansteigen ein Nicht-erreichen des High Potential in der durch die Übertragungsgeschwindigkeit gegebenen Zeit.

Grüße Uwe

Hallo in die Runde,

vielen Dank erst mal für die vielen Antworten. Ich hätte nicht gedacht, dass ich damit so eine Lawine an Post lostrete. Aber dafür ist ja ein Forum da.
Ich möchte euch gerne weitere Informationen geben.

@all:

Ich habe jetzt vom Arduino aus für den I2C Bus erst mal ein ganz normales Steckbrettkabel genommen. Dieses habe ich mit Iso Band am Board festgeklebt damit es sich nicht mehr lösen kann. Dann habe ich am Ende des Kabels den Stecker abgeschnitten und eine ganz kleine Aderendhülse draufgemacht. Dieses Kabel habe ich dann in eine Wagoklemme gesteckt.
Von dort aus bin ich mit Fernmeldekabel weitergegangen. 2x2x0,6, gedreht mit einem gesamten Schirm. Damit erhoffe ich mir erst mal Störungen von außen auszuschließen.
Die Kabellänge des gesamten I2C Bus beträgt jetzt exakt 1,3m.

@Laie und uwefed und Franz54:

Ein 5V DC Netzteil versorgt erst mal das Arduino mit Spannung aber auch jeden MCP einzeln mit dieser Spannung. Das heißt alle Komponenten sprich Arduino und auch die MCPs werden vom selben Netzteil mit Spannung versorgt und haben somit auch den selben Ground.

Ich habe in meinem Bus 4 MCP23017 verbaut. Diesen habe ich wie im Bild angeschlossen.
Deshalb würde ich jetzt erst mal sagen, dass ich dort keinen Fehler habe oder was meint ihr?
Auch hat jeder MCP eine eigene Adresse im Bus.

Wie finde ich den, welche Geschwindigkeit mein Bus nutzt und wie verändere ich diese?
Ich sollte mal die Leistungskapazität ermitteln damit ich den externen Pullup Widerstand berechnen kann?

@DrDiettrich:

Wie genau meinst du das mit dem Messen? Kannst du mir das mal kurz genauer erläutern?
Die Verbauten Pullups vom Board kann ich ja nicht entfernen oder? Die muss ich doch im Code irgendwie deaktivieren oder nicht? Da ich diese im Code bis jetzt nicht aktiviert habe muss gehe ich davon aus, dass diese immer aktiv sind?

Gruß,

Sascha

Die Pullup-Widerstände gehören mit +5V verbunden.

Die internen Pullups des Arduino stören nicht. Du kannst sie aktiviert lassen.

Grüße Uwe

Ein 5V DC Netzteil versorgt erst mal das Arduino mit Spannung aber auch jeden MCP einzeln mit dieser Spannung. Das heißt alle Komponenten sprich Arduino und auch die MCPs werden vom selben Netzteil mit Spannung versorgt und haben somit auch den selben Ground.

Ich habe in meinem Bus 4 MCP23017 verbaut. Diesen habe ich wie im Bild angeschlossen.
Deshalb würde ich jetzt erst mal sagen, dass ich dort keinen Fehler habe oder was meint ihr?
Auch hat jeder MCP eine eigene Adresse im Bus.

Wie finde ich den, welche Geschwindigkeit mein Bus nutzt und wie verändere ich diese?
Ich sollte mal die Leistungskapazität ermitteln damit ich den externen Pullup Widerstand berechnen kann?

Ich würde grundsätzlich den Ground für den I2C mitziehen. Wenn Du irgendwann (sag nie nie) doch auf die Idee kommst die Kommunikationsleitungen vom Rest zu trennen oder an einem Sternpunkt zusammenzufassen, kommst Du in Schwierigkeiten.

Den Fehler mit den Pullip's, die Du zu Pulldown's gemacht hat kennst Du ja schon.

Für deine kapazitiven Werte such nach einem Datenblatt für Dein Kabel. Bei 1,5 mtr Ysty 2x2x,08 sind ca 10nF/Km die Regel.
Nimm für den Rest nochmal einen Aufschlag von 50% - reicht.

Du schreibst von Wago. hoffentlich Serie 243...

Gruß

Du fragst ernsthaft, wie Du den Strom von SDA nach Gnd messen kannst? Hast Du überhaupt ein Meßgerät?

@DrDiettrich:

Nein das wollte ich nicht fragen....sorry stand ein wenig auf dem Schlauch...waren ein bisschen viele Post :smiley:

Danke Messgerät und wie ich STROM messe weiss ich :wink: Danke aber nochmal der Nachfrage.

@Laie und uwefed:

ah ok stimmt....dann lasse ich die Pullups vom Arduino einfach so wie sie sind und würde dann die beiden Widerstände von GND auf 5V wechseln und deren Größe erst mal neu berechnen....

Hallo :slight_smile:

ich hoffe ihr steinigt mich jetzt nicht. Aber das mit dem Messen des Stromes hat nicht geklappt, weil in der Tat mein Messgerät kein Strom messen kann…blöde günstige ware… :smiley:

ich habe allerdings folgendes gemacht:

Spannung gemessen am letzten Bus Teilnehmer: 5,08 V

Widerstand des gesamten Bus gemessen. Eine Messspitze je an SDA und SCL gehalten: 19,72 kOhm
(Ich hoffe das war so richtig)

Strom berechnet: 0,41 mA

Ist das so richtig und wäre das der Strom der ok wäre?

Gruß,

Sascha

Nein!

Eine Anleitung:

Du machst auf den Master ein Programm, mit Wire.begin().
Aber keine I2C Zugriffe.

Dann misst du die Spannung zwischen SDA und GND und zwischen SCL und GND.
Beide male werden bei dir 5,08V angezeigt.

Dann belastest du den Bus.
Also einen Widerstand zwischen SDA und GND.
Z. B. 100 Ohm, der konkrete Wert ist recht egal
Jetzt nochmal zwischen SDA und GND messen.

Dann die ganze Nummer nochmal mit SCL und GND durchziehen

Ein bisschen rechnen, dann weißt du, wie viel Ohm die Pullup haben.
Und wie viel mA die Pullup liefern/durchlassen.

Alles klar DANKE also dann so was hier?

#include <Wire.h>

void setup()
{
Wire.begin(); // join i2c bus (address optional for master)
}

kannst du dir vielleicht mal meinen Code anschauen, ob ich dort vielleicht einen fehler bzgl. i2c drin habe?

Code.ino (11.6 KB)

Ja, so ist das gemeint.

Und der Code?
Kann ich nicht testen.
Ich sehe da kein Wire.begin()

Liefert der Webserver denn seinen Status 200?

Also der Code funktioniert so bei ganz gut. die Frage war nur ob du da bzgl. i2c einen fehler meiner seits entdeckts. ansonsten alles gut..

vielen danke.... ich werde das so morgen früh mal testen....danke!!!