Ich habe mehrere Module (max 10 Stk.) welche ca. 0,5m voneinander
entfernt sind. Sie sollen nun miteinander eine langsame Kommunikation im
Multimaster-Betrieb bekommen. Sie sind teilweise Sternförmig, teilweise
in Reihe verbunden. Die Anzahl der gleichzeitig aktiven Module kann von
1 bis 10 variieren. Die Datenübertragung erfolgt über NICHTgeschirmtes
Kabel.
Wichtig wäre mir, dass der Bus nicht mehr als 2 Datenleitungen benötigt
und geringen Aufbauaufwand erfordert. Zeitgesteuerte Datenübertragung
wie CAN, RS232 oder 1wire möchte ich gerne meiden.
Dazu hätte ich nun 2 Fragen.
1. Mir erscheint hierfür das I2C am sinnvollsten. Wie verhält es sich
das dann aber mit den nötigen pull-ups? Da jedes Modul unabhängig
voneinander Master sein soll, bräuchte jedes einnen pull-up. Würde das
bei max. 10 parallelen pull-ups Probleme für (z.B.) einen AVR geben,
wenn er die Leitung ziehen muss?
2. Würde jemand einen anderen Bus verwenden?
Lass die Sache mit I²C am besten gleich sein. Es gibt zwar einen I²C
Multi Master Modus, aber das ist wirklich nichts richtig tolles.
Für deine Verwendung sollte sicher auch ein einfacher RS485 Bus reichen.
Protokoll kannst du dir ein eigenes Ausdenken oder du benutzt etwas wie
Modbus etc..
Für die Realisierung von Multi-Master könnte ein Token-Passing Verfahren
vielleicht ganz gut passen.
Grüße
Dennis
Genau für solche Fälle gibt es Sachen wie CAN.
Mit "zeitgesteuert" meinst du wohl sowas wie eine vereinbarte Bitrate?
Ok, das ist eine Einschränkung. Aber damit kann man prima leben. Die
wirklich freilaufenden (im Sinne von ziemlich undefinierter
Taktfrequenz) MC-Systeme sind doch wirklich nicht das Argument bei
Bus-Systemen. Ein Quarz/Resonator kostet nur wenige Cent. Im Gegenzug
kannst du dir massiv Gedanken machen, wie du ein Multimaster-System
wirklich perfekt (CAN ist nahe dran an "perfekt") ans Laufen bringst.
Entweder machst du da Abstriche oder an der Gesamtperformance (beliebig
langsam kann man sich was gutes Ausknobeln). Es gibt nicht umsonst
Sachen, die sich durchgesetzt haben. Das Rad immer wieder neu erfinden
war/ist auch keine gute Strategie.
Soll jetzt nicht heissen, dass da kein Platz für Neues wäre. Aber wenn
du so fragst, wie du fragst, bist du eher auf der Suche nach einer
Sache, die es so nicht geben kann.
Dennis X. schrieb:> Für deine Verwendung sollte sicher auch ein einfacher RS485 Bus reichen.
ja, das würde ich auch sagen.
> Protokoll kannst du dir ein eigenes Ausdenken oder du benutzt etwas wie> Modbus etc..> Für die Realisierung von Multi-Master könnte ein Token-Passing Verfahren> vielleicht ganz gut passen.
andere Idee wenn auf dem Bus nicht so viel los ist:
du verwendest bei allen Teilnehmern Fault-protected Treiber (z.B.
SN65HVD1781). Denen macht ein Kurzschluss nichts aus. Jetzt können die
Teilnehmer lauschen was auf der Leitung los ist. Wenn nichts los ist und
sie senden wollen fangen sie einfach an. Wenn ein anderer Teilnehmer im
selben Moment anfängt zu senden gibts den Kurzschluss, den halten die
Treiber aber aus.
Natürlich muss das Protokoll vom Empfänger eine Empfangsbestätigung
fordern damit Du erkennen kannst daß was nicht sauber angekommen ist. Du
sparst Dir so aber alle Mechanismen mit Token, festen Zeitschlitzen etc.
Das macht das ganze wesentlich einfacher.
Du kannst so auch einfach IP-Pakete auf die Leitung geben. Musst halt
eine Escape-Sequenz definieren. Aber das hat den Vorteil daß es für IP
schon jede Menge fertige Stacks, Hilfsprogramme etc. gibt und Du kannst
es von einem sehr einfachen Gateway aus auch sofort übers Internet
weiter routen.
Gerd E. schrieb:> Dennis X. schrieb:>> Für deine Verwendung sollte sicher auch ein einfacher RS485 Bus reichen.>> ja, das würde ich auch sagen.
Ich habe bis jetzt noch keinen einfachen und funktionierenden
RS485-Multimaster-Bus gesehen.
Versuche gabs viele. Und es gibt auch unter Extrembedingungen
funktionierende (im Sinne von Kollisionen erkennende und sich wieder
fangende) Lösungen. Einfach sind die nicht gerade...
Genial einfach/einfach genial sind RS485-Lösungen für single-master. Da
kommt auch nichts anderes so schnell ran. Billig, schnell, universell.
Multimaster ist anstrengend.
Eine witzige Idee gabs dazu im englischen Picaxe-Forum. Da hatte einer
ungefähr 50m dreiadriges Kabel im Haus veteilt und hat darüber so 12-15
uC's versorgt und mit 2400 baud kommunizieren lassen. TxD -> open
collector mit hochohmigem pullup auf jedem Board an die Datenleitung.
Diese über Schmitt-Trigger an RxD zurückgeführt. Kollision wird erkannt,
wenn was anderes als das gesendete Byte zurückkommt.
data schrieb:> Wichtig wäre mir, dass der Bus nicht mehr als 2 Datenleitungen benötigt> und geringen Aufbauaufwand erfordert. Zeitgesteuerte Datenübertragung> wie CAN, RS232 oder 1wire möchte ich gerne meiden.
Viele Funkdatenprotokolle mit Taktrückgewinnung und Kollisionserkennung
(CSMA/CD) sind dafür geeignet und kommen sogar mit einer "Leitung" aus,
wenn man die Bezugsmasse mal nicht mitzählt.
https://de.wikipedia.org/wiki/Carrier_Sense_Multiple_Access/Collision_Detection
H.Joachim Seifert schrieb:> Ich habe bis jetzt noch keinen einfachen und funktionierenden> RS485-Multimaster-Bus gesehen.> Versuche gabs viele. Und es gibt auch unter Extrembedingungen> funktionierende (im Sinne von Kollisionen erkennende und sich wieder> fangende) Lösungen. Einfach sind die nicht gerade...
Meine Lösung für genau dieses Problem habe ich oben vorgestellt. Die
eigentlichen Daten werden per TCP übertragen und wenn es zu einer
Kollision kam gibt es vom TCP aus einen Retransmit.
Bei dieser Lösung hast Du natürlich keine Priorisierung zwischen den
Hosts oder Nachrichtentypen wie bei CAN. Und wenn alle auf einmal senden
wollen gibt es eine Verstopfung des Bus, dem kann man dann z.B. mit
exponential Backoff mit etwas Beigabe von Zufallszeit beim Senden Herr
werden.
Ein paar Sensoren und Aktoren ohne großartige Latenzgarantien kann man
auf diese Weise sehr elegant und einfach verbinden, da die ganzen
Bausteine der Lösung weit verbreitet, gut verfügbar und leicht zu
handhaben sind.
Die Idee stammt übrigens nicht von mir, sondern von hier:
http://www.ethersex.de/index.php/ZBus_(Deutsch)http://old.ethersex.de/index.php/ZBus_Protocol
Gerd E. schrieb:> Dennis X. schrieb:>> Für deine Verwendung sollte sicher auch ein einfacher RS485 Bus reichen.>> ja, das würde ich auch sagen.
Allerdings wird im Artikel RS-485 extra darauf hingewiesen, dass
Stern nicht gut ist. Trotzdem noch ok?
Es geht dabei um Reflexionen und die sind von der
Signalanstiegsgeschwindigkeit und Laufzeit auf dem Medium abhängig. So
generell ist Aussage RS485 nur als ein Strang, falsch!
Bei deiner Topologie sollte das funzen. Die anderen übrigens auch, also
i2c, CAN, usw.
Darfst halt nicht zu schnell takten. Bei 0,5m gehen locker 100kbit/sec.