Hallo Leute, ich möchte einen I2C Bus aufbauen. Folgende Infos: - 32 einzelne Arduino Mega werden mit einem I²C Schnittstellengerät von NI (https://www.ni.com/de-de/shop/select/i2c-spi-interface-device) ausgelesen - die Länge der Datenleitungen von jedem Prüfstand beträgt ca. 2m - alle Datenleitungen gehen in eine Box wo sie parallel geschaltet werden und in meinen Eingang von der NI Box gehen - es sollen geschirmte und verdrillte Kabel verwendet werden Aufgrund der Kabellänge und der höheren Anzahl von I²C Teilnehmern habe ich mir gedacht ich verwende einen I²C Bus Extender P82B715P um zum einen die Bus Kapazität zu erhöhen und die hohe Störanfälligkeit zu verringern. Meine Frage: Hat jemand schon damit Erfahrung gesammelt, ob sowas zuverlässig funktionieren kann? Wird die Störanfälligkeit durch den P82B715 erhöht oder gibt es da noch eine andere Möglichkeit? Den P82B715 muss ich ja an jeden I²C Bus von jeden Arduino schalten. Muss ich den P82B715 dann auch an jedes Kabelende vor meiner NI Box schalten, oder reicht dort dann nur ein einelner? Meines Wissens muss ich nur die gesamte Bus Leitung mit einen Pullup Widerstand auf 5V ziehen. Oder benötige ich das für jeden einzelnen Teilnehmer machen? Ich habe einfach mal eine Prinzipskizze des Schaltplans/Aufbaus angehangen. Danke für die Hilfe Gruß Dave
Moin, für solche Anwendungen gibt es doch eigentlich Feldbussysteme...zum Beispiel CAN. Sowas mit I2C umzusetzten kommt mir nicht sehr sinnvoll vor. Gruß
PaSi schrieb: > Moin, > für solche Anwendungen gibt es doch eigentlich Feldbussysteme...zum > Beispiel CAN. Sowas mit I2C umzusetzten kommt mir nicht sehr sinnvoll > vor. > > Gruß Ne echt nicht. Da würde ich mir lieber ein kleines eigenes Protokoll auf RS232 Basis ausdenken. Oder direkt LIN nehmen.
@Dave (Gast) >- 32 einzelne Arduino Mega werden mit einem I²C Schnittstellengerät von >NI (https://www.ni.com/de-de/shop/select/i2c-spi-inter...) >ausgelesen >- die Länge der Datenleitungen von jedem Prüfstand beträgt ca. 2m >- alle Datenleitungen gehen in eine Box wo sie parallel geschaltet >werden und in meinen Eingang von der NI Box gehen >- es sollen geschirmte und verdrillte Kabel verwendet werden Kann man machen, sollte auch funktionieren. >Aufgrund der Kabellänge und der höheren Anzahl von I²C Teilnehmern habe >ich mir gedacht ich verwende einen I²C Bus Extender P82B715P um zum >einen die Bus Kapazität zu erhöhen und die hohe Störanfälligkeit zu >verringern. Kann man auch machen, erhöht den Aufwand aber zusätzlich. Es geht auch ohne, wenn gleich vielleicht etwas langsamer. 2m verdrilltes Kabel haben vielleicht 100pF, macht bei 32 Teilnehmern 3,2nF. Das ist zwar ca. Faktor 8 über den üblichen 400pF für einen normalen I2C Bus, geht aber mit langsamerem Takt. >Hat jemand schon damit Erfahrung gesammelt, ob sowas zuverlässig >funktionieren kann? Ich hab mal mit einem I2C IC an 500 (ja, FÜNFHUNDERT) Metern Kabel zu tun gehabt, der lief auch. >Wird die Störanfälligkeit durch den P82B715 erhöht Bist du ein Hypochonder, der immer und überall nur Probleme sieht? >Den P82B715 muss ich ja an jeden I²C Bus von jeden Arduino schalten. Ja. >Muss ich den P82B715 dann auch an jedes Kabelende vor meiner NI Box >schalten, Nein. > oder reicht dort dann nur ein einelner? Ja. >Meines Wissens muss ich nur die gesamte Bus Leitung mit einen Pullup >Widerstand auf 5V ziehen. Ja. > Oder benötige ich das für jeden einzelnen >Teilnehmer machen? Nein.
@ Cyblord -. (cyblord) >Ne echt nicht. Da würde ich mir lieber ein kleines eigenes Protokoll auf >RS232 Basis ausdenken. Oder direkt LIN nehmen. Klar, weil du der Oberheld bist und jedes Mal das Rad neu erfinden willst.
Falk B. schrieb: > @ Cyblord -. (cyblord) > >>Ne echt nicht. Da würde ich mir lieber ein kleines eigenes Protokoll auf >>RS232 Basis ausdenken. Oder direkt LIN nehmen. > > Klar, weil du der Oberheld bist und jedes Mal das Rad neu erfinden > willst. Jup. Das geht deutlich besser als dafür I2C zu vergewaltigen. Gerade wenn man nur reihum bisschen Daten abfragen will.
Danke für die Antworten @ Falk > Kann man auch machen, erhöht den Aufwand aber zusätzlich. Es geht auch > ohne, wenn gleich vielleicht etwas langsamer. > Was heißt denn langsamer? Statt 100 kHz mit 50kHz? Gibt es da ein Richtwert wie stark sich die Leitungskapazität auf die Taktrate auswirkt? >>Wird die Störanfälligkeit durch den P82B715 erhöht > > Bist du ein Hypochonder, der immer und überall nur Probleme sieht? > Oh hier meinte ich ob die Störanfälligkeit verringert wird. >> oder reicht dort dann nur ein einelner? > > Ja. Ok perfekt. >>Meines Wissens muss ich nur die gesamte Bus Leitung mit einen Pullup >>Widerstand auf 5V ziehen. > > Ja. > >> Oder benötige ich das für jeden einzelnen >>Teilnehmer machen? > > Nein. Dann habe ich das verkehrt auf meiner Skizze aufgezeichnet? @Cyblord Ziel ist es die vorhandene NI I²C Box zu nutzen. Deswegen würde mich es Interessieren wie ich das ganze mit I²C zum laufen bekomme. Mir ist aber bewusst, dass ein Feldbussystem die sicherere Variante wäre-
Vor vielen Jahren habe ich auch schon mal einen Feldbus mit I2C und P82B715 jahrelang fehlerfrei betrieben. Mit Leitungslängen bis zu 100m. Allerdings wegen der Kapazität kein abgeschirmtes oder verdrilltes Kabel, sondern mit Flachband Modularkabel,die Datenleitungen jeweils zwischen Masse bzw Versorgungsspannung. PullUps mit 330 Ohm. Von Bedeutung ist auch die Taktfrequenz, je niedriger umso problemloser. Da der Master bei mir ein PC mit DOS-Programm in Assembler mit Bitbanging war, kann ich nichts über die Frequenz dabei sagen.
:
Bearbeitet durch User
Dave schrieb: >> Kann man auch machen, erhöht den Aufwand aber zusätzlich. Es geht auch >> ohne, wenn gleich vielleicht etwas langsamer. >> > Was heißt denn langsamer? Statt 100 kHz mit 50kHz? > Gibt es da ein Richtwert wie stark sich die Leitungskapazität auf die > Taktrate auswirkt? Proportional langsamer: 400pF <-> 100 KHz 4000pF <-> 10 KHz Die Maximalgeschwindigkeit hängt von der Kabelkapazität und den Pullup-Widerständen ab. Die Maximalfrequenz ist dann proportional zu fg=1/(2*pi*R*C).
Man kann übrigens auch I2C über CAN-Bustreiber betreiben für besonders lange Leitungen oder bei hohem Störpotential. Also I2C-Protokoll und CAN-Hardware. Dafür gibt es auch schon betriebsfertige Module: http://www.cctools.eu/ext_index.php?artikel=1823
@ Dave (Gast) >> Kann man auch machen, erhöht den Aufwand aber zusätzlich. Es geht auch >> ohne, wenn gleich vielleicht etwas langsamer. > >Was heißt denn langsamer? Statt 100 kHz mit 50kHz? >Gibt es da ein Richtwert wie stark sich die Leitungskapazität auf die >Taktrate auswirkt? I2C muss min. 3mA gegen Masse schalten können, bei 5V sind das ~1,5kOhm Pull Up Widerstände. tau = R * C = 1,5kOhm * 3,2nF ~5us Das ist die Anstiegszeit der Signale bis 63%. Real wird man eher das Doppelte ansetzen, damit es nicht auf Kante genäht ist. D.h. du mußt für die steigende Flanke ca. 10us reservieren, die fallende ist schneller, sagen wir 0,5us. Dann noch ein wenig Zeit für LOW und HIGH macht in Summe ca. 12-15us/Bit bzw. ~66kbit/s. >>Wird die Störanfälligkeit durch den P82B715 erhöht >Oh hier meinte ich ob die Störanfälligkeit verringert wird. Nicht wirklich, denn die Pegel und Störabstände bleiben ja gleich. >>> Oder benötige ich das für jeden einzelnen >>>Teilnehmer machen? > >> Nein. >Dann habe ich das verkehrt auf meiner Skizze aufgezeichnet? Ja. >Ziel ist es die vorhandene NI I²C Box zu nutzen. Deswegen würde mich es >Interessieren wie ich das ganze mit I²C zum laufen bekomme. Mir ist aber >bewusst, dass ein Feldbussystem die sicherere Variante wäre- Man kann die 32 Busse mittels I2C MUX in Segmente auftrennen, dann vermindert sich die Last. Allein schon ein 4:1 Mux vermindert die Last um den Faktor 4, es gibt wahrscheinlich auch 8:1 und mehr. Den braucht man nur einmal für deine NI-Karte. Die Bus-Extender auf jedem Arduino fallen dann auch weg.
Moin, Ums verrecken wuerd' ich das nicht mit I2C machen wollen. I2C sollte auf der Platine bleiben oder zumindest im Geraet. Und nicht mehr als vielleicht 4 Slaves und ein Master an einem Bus. Jeder ominoese Switch im Bus vergroessert die Chance auf Aerger. Wenn man so richtig Probleme haben will, dann macht man sowas. Gruss WK
Falk B. schrieb: >>Oh hier meinte ich ob die Störanfälligkeit verringert wird. > > Nicht wirklich, denn die Pegel und Störabstände bleiben ja gleich. Der P82B715P verstärkt die Ströme des I2C-Bus um das 10-fache. Dadurch können die PullUp-Widerstände um das 10-fache verringert werden. Das bedeutet, dass die Kabelkapazitäten bei gleicher Geschwindigkeit 10 mal größer sein können. Aber auch, dass Störeinstrahlungen 10 mal stärker belastet, also verringert werden.
Für Leitungen dieser Länge ist ein RS485 oder CAN Bus eher angemessen. RS485 Bustreiber bekommt man sehr günstig aus Asien: https://www.aliexpress.com/item/5PCS-LOT-MAX485-module-RS485-module-TTL-turn-RS-485-module-MCU-development-accessories/32582289852.html Mit diesen Treibern brauchst Du Dir um Leitungslängen und Kapazitäten praktisch keine Sorgen mehr zu machen. Außerdem lassen diese Treiber erheblich größere Potentialdifferenzen (GND Pegel) zu, als I²C.
Dave schrieb: > Gibt es da ein Richtwert wie stark sich die Leitungskapazität auf die > Taktrate auswirkt? Du kennst den Pull-Up Widerstand vom I2C, du kennst die Kapazität, du kennst du Schaltpegel. Welche Information fehlt dir, um die Flanken und die maximale Taktrate auszurechnen? Hauptsächlich deine steigende Flanke der Signale wird langgezogen, weil du bei I2C keine Push-Pull-Treiber hast. Du könntest die Schirmung weglassen, die die kapazitive Last für deinen I2C-Bus deutlich erhöht. Ob die Schirmung zum Erreichen des nötigen Störabstandes nötig ist, kannst nur du beurteilen. Nimm ein Oszi, guck dir Störungen und Signalflanken an.
Man kann die Anstiegszeit bei langen Leitungen stark verkürzen, wenn man statt Pull-Ups Stromspiegel nimmt. Da steigt die Spannung linear an.
Mein Vorschlag: 1. Nimm PCA9548A I2C Switches und teile damit den Bus in 32 Segmente. Damit isolierst Du die Busse voneinander und ermöglichst es, dass jedes Segment die gleichen I2C Adressen nehmen kann. Du aktivierst immer nur genau ein Segment zur Zeit. 2. Jedes Bussegment verlängerst Du mit einem Paar P82B96, wodurch SCL und SDA jeweils als differentielle SIgnale übertragen werden. Damit sollte Deinem Vorhaben nichts mehr im Wege stehen. fchk
> Wenn man so richtig Probleme haben will, dann macht man sowas.
Das sehe ich auch so. Ich glaube auch das so etwas funktionieren kann,
aber es kann auch sein das es nicht funktioniert und dann hat man ein
Problem. In der Praxis wird es sicher auch von vielen Randbedingungen
abhaengen. Zum Beispiel Stoerungen in der Umgebung,
Potentialunterschiede, Massenankopplung an den einzelnen Slaves,
Stoerempfindlichkeit der einzelnen Devices. Da kann man sich dann
schonmal auf Slaves freuen die SDA oder gar SCL dauerhaft auf Masse
ziehen weil sie sich weggehaengt haben. Viel Spass....
Olaf
Ach Leute, nun kackt euch mal nicht ein. Es geht hier um 2m Leitungslänge...
> Ach Leute, nun kackt euch mal nicht ein. Es geht hier um 2m > Leitungslänge... Also fuer mich liesst sich das wie Sternverdrahtung mit 32x2m Leitungslaenge. Olaf
Karl schrieb: > Ach Leute, nun kackt euch mal nicht ein. Es geht hier um 2m > Leitungslänge... Die Länge ist hier auch gar nicht das Problem. Die ganze Aufgabenstellung ist für I2C einfach ungeeignet.
Karl schrieb: > Ach Leute, nun kackt euch mal nicht ein. Es geht hier um 2m > Leitungslänge... Es geht aber auch um 32 Geräte. Wenn ein einzelnes Gerät SCL blockiert, steht alles still. RS232/RS485 mit asynchroner Übertragung würde ich auch bevorzugen. Wenn man kein eigenes Protokoll in der Schublade hat, findet man sicherlich ein geeignetes im Netz.
Dave schrieb: > die Länge der Datenleitungen von jedem Prüfstand beträgt ca. 2m Ich bestreite nicht, dass es mit I2C nicht geht, jedoch ist I2C für die Interboardkommunikation konzipiert und optimiert. Wenn Du von Prüfständen sprichst die mit Kabeln verbunden sind und örtlich auseinanderliegen, dann würde ich ebenfalls wie andere hier raten, auf einen dafür ausgelegten Bus oder Schnittstellensystem setzen wie z.B. CAN, RS485 oder wenn die Prüfstände noch an unterschiedlichen Steckdosen hängen, dann auf etwas von Haus aus galvanisch getrenntes wie Ethernet, etc. Ein Prüfstand sollte wesentlich zuverlässiger funktionieren als der Prüfling, daher wäre es am falschen Ort gespart, wenn man da was mit I2C zusammenfrickelt.
:
Bearbeitet durch User
Ich würde einen zusätzlichen Arduino spendieren, der auf einer Seite mit deiner NI Kiste kommuniziert und auf der anderen Seite als Master für ein RS485 Bus funktioniert. Protokoll ist auch recht einfach die Slaves werden über das 9. Bit der UART addressiert und bekommen dann einen Befehl und Zeit zum Antworten, dann kommt der nächste. Einen Ausfall erkennst du an der Zeitüberschreitung der Antwort und nichts wird blockiert.
:
Bearbeitet durch User
Wie muss man sich das praktisch vorstellen: 32 Tische haben jeweils ein 2 Meter kurzes Kabel zu EINER zentralen Box. Das müssen aber winzig kleine Tische sein.
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.