Forum: Mikrocontroller und Digitale Elektronik Welches Bussystem?


von Alex E. (alex_e)


Lesenswert?

Hallo,

hab bis zu 30 Platinen ca. 200mm lang mit je einem Controller drauf.
Die sollten alle Slaves sein, und über ein Busssystem mit dem Master 
kommunizieren.

Welches Bussystem würdet Ihr bevorzugen?
Braucht der Bus eine Verstärkung auf jeder Platine?

Es sind schon mehrere Meter, die das ganze Konstrukt dann hat.

Gruß
Tweaker

von schonk (Gast)


Lesenswert?

RS485

von Peter K. (peterka2000)


Lesenswert?

Kommt drauf an, wenn es schnell sein soll und du genügend Platz hast ist 
ein 8/16/32 Bit parallel-Bus immer gut :). Wenn es nicht so schnell sein 
soll kann es auch RS232 auf niedriger Baudrate bzw. SPI mit niedrigen 
Takt verwendet werden.

von Alex E. (alex_e)


Lesenswert?

Bisher hatte ich I2C bzw. TWI im Kopf, würde aber etwas Aufwand mit 
Autoadressierung und Verstärkung bedeuten.
Grundsätzlich bin ich mir bei der Auswahl nicht so sicher. Je weniger 
Verkabelung desto besser...

Hab 24V und 5V PWM auf der Platine mit drauf...

von Alex E. (alex_e)


Lesenswert?

Peter K. schrieb:
> Kommt drauf an, wenn es schnell sein soll und du genügend Platz hast ist
> ein 8/16/32 Bit parallel-Bus immer gut :). Wenn es nicht so schnell sein
> soll kann es auch RS232 auf niedriger Baudrate bzw. SPI mit niedrigen
> Takt verwendet werden.

Was heißt niedriger Takt?

von Christian (Gast)


Lesenswert?

Wenn CAN vorhanden ist würde ich CANopen empfehlen. Ist zwar etwas 
aufwändiger aber ich werde immer mehr und mehr ein Freund davon.
Ansonsten würde ich dir auch RS485 oder RS232 raten.

von Alex E. (alex_e)


Lesenswert?

Hab mal kurz gerechnet, bräuchte für jede Platine so 48kbit/s..
Das gibt etwa 1,4Mbit/s bei 30 Platinen.

Autoadressierung sollte auch möglich sein...

von Peter K. (peterka2000)


Lesenswert?

Naja, das die Daten halt nicht mit xxx kHz/MHz übertragen werden. Bei 
RS232 wäre villeicht 9600 Baud sinnvol

von schonk (Gast)


Lesenswert?

Alex E. schrieb:
> Hab mal kurz gerechnet, bräuchte für jede Platine so 48kbit/s..
> Das gibt etwa 1,4Mbit/s bei 30 Platinen.
>
> Autoadressierung sollte auch möglich sein...

also doch RS485

von Marcus (Gast)


Lesenswert?

RS485 ist an sich zwar sehr gut geeignet, aber bei der Datenrate ist das 
auf Controller-Seite nicht mehr trivial.

Bei niedrigeren Datenraten lässt sich per UART und RS485-Transceiver 
ganz simpel und sehr zuverlässig ein MODBUS RTU aufbauen.

Was darf es denn kosten?
Welcher Controller steht zur Verfügung?
Darf/soll für die Bus-Anbindung ein zusätzlicher Controller verwendet 
werden?

von Peter (Gast)


Lesenswert?

Möchtest Du den Bus sternförmig oder linear aufbauen?

von Alex E. (alex_e)


Lesenswert?

Als Master soll ein Raspberry oder ähnliches dienen.
Der dann die Slaves mit Daten versorgt.
Der Bus ist von der Topologie auf jeden Fall Linear, also kein Stern...
Die Platinen sollen vorne ein Stecker und hinten eine Buchse haben, 
womit das Busssignal sowie Versorgung an die nächste Platine 
weitergegeben wird.

Die Kosten sollen, wie immer, möglichst niedrig ausfallen.
Hab auf der Platine/slave an einen Atmega88 oder so gedacht.
Der Muss auch sonst relativ wenig machen außer die Daten zu 
kommunizieren und diese umsetzten. -> Also nur ein 
Controller/Slaveplatine.
Kann aber Ressourcennotwenigkeit für die Datenrate schlecht einschätzen.
Sollte ja eigentlich von der HW-Uart im Controller abgedeckt sein.

Es ist vermutlich eher ein Problem auf der Masterseite. und diese 
Datenrate ist auch nur bei Vollauslast notwendig. Aber wäre halt super 
wenn ich das schaffe. Hier bin ich halt von 30mal/s alle Slaves mit 
Daten versorgen, ausgegangen. 5mal/s würde im Grenzfall auch 
reichen(240kbit/s).

@Markus: Denkst du an einen anderen Bus?

von Marcus (Gast)


Lesenswert?

Naturgemäß sehen an einem (linearen) bus alle Teilnehmer die gleiche 
Datenrate. Also haben alle "ein Problem". Sobald Du in Geschwindigkeiten 
kommst, bei denen der UART noch mitmacht, kannst Du RS485 verwenden. Den 
kannst Du "einfach so" mit einem möglichst einfachen Protokoll oder mit 
etwas mehr Overhead mit einem Standard-Protokoll wie MODBUS RTU 
verwenden. Was davon sinnvoll ist, musst Du selbst beurteilen.

Bei Datenraten, die die Leistungsfähigkeit eines UARTs übersteigen, 
würde ich immer auf ein Ethernet-basiertes Protokoll gehen. Bei einer 
linearen Verbindung lässt sich das aber leider nicht umsetzen.

von Alex E. (alex_e)


Lesenswert?

Stimmt hast recht, lesen und Auswerten müssen das alle.
Also werde ich bei RS485 bleiben und schauen, wie hoch ich mit der 
Datenrate gehen kann.

Wie würdet Ihr das auf der Platine machen? Einfach ein MAX485 zum 
umsetzten auf Uart nehmen und den Bus ohne Verstärkung an die Nächste 
Platine weitergeben? Oder soll ich da Verstärken? Werden ja bis zu 8 
meter im Grenzfall...

von Marcus (Gast)


Lesenswert?

Den Bus einfach die ganzen 8m durchziehen und über ST485x (Maxim kommt 
mir nicht über die Türschwelle ;-) ) an den μC anschließen. 
Abschlusswiderstände an den Enden nicht vergessen.

von Alex E. (alex_e)


Lesenswert?

wieso kein maxim?

von Jens (Gast)


Lesenswert?

Moin,

nur mal so als Denkanstoß: Die Datenrate würde sich halbieren, wenn der 
Master zwei Schnittstellen hätte und z.B. in der Mitte einspeisen würde.
Oder, vielleicht mit den Steckern einfacher zu realisieren, immer eine 
Platine überspringen würde.

Also als Beispiel: Bei einem 10pol. Stecker auf jeder Seite geht es bei 
1 und 2 rein und am anderen Stecker bei 3 und 4 raus - dieser Bus wird 
benutzt.
Der zweite geht auf 3 und 4 rein und auf 1 und 2 raus - dieser wird nur 
durchgeleitet.

Je nachdem natürlich auch mit 3 oder mehr Bussen realisierbar.

Bei der Länge würde ich auch auf einen Bus ohne Zwischenverstärker 
setzen.

Gruß
Jens

von Jens (Gast)


Lesenswert?

Noch einmal moin,

ich vermute ja mal fast, Du willst LEDs ansteuern. Über den Strom, der 
vorne rein geht, hast Du Dir vermutlich Gedanken gemacht. Und den 
Spannungsabfall, bis Du mal hinten bist.

Schaltregler je Platine, die mit z.B. 24V arbeiten, könnten da Sinn 
machen.

Für die Autoaddressierung ein DaisyChain-Signal vorsehen, oder? Denn die 
Reihenfolge sollte vermutlich passen... Und vielleicht noch ein 
gemeinsames Reset- und/oder Sync-Signal.

Gruß
Jens

von Alex E. (alex_e)


Lesenswert?

hi jens,
wie kommst du dem auf die Idee?
wozu ein reset oder sync?

welchen schaltregler haste denn im sinn?
hab grade den tps545360 rausgesucht...
soll moeglischst klein sein

von Jens (Gast)


Lesenswert?

Aeh, 3. moin,

wie wäre es mit einer schlichten TTL-Seriell-Verbindung, die aber nur 
von einer Platine zur nächsten geht? Spart die vielen Treiber und 
erlaubt das Festlegen der Reihenfolge ohne zusätzliche Leitung.

Bei Bedarf eine Rückleitung durch alle Platinen wieder hin zum Master. 
Ok, hier sind die 8m ein Wort für TTL.

Ach, wäre doch schön, etwas mehr über die Applikation zu wissen...

Jens

von Alex E. (alex_e)


Lesenswert?

würde das mit ttl un evtl. Impedanzwandler je platine gehen? bei der 
länge?

von Jens (Gast)


Lesenswert?

Die Idee beim dritten moin war, jeden Platine das Signal empfangen und 
erneut aktiv aussenden zu lassen. Es entstehen also nur kurze, 
wohldefinierte Datenstrecken von 20cm.

Du tauscht den Hardware-Aufwand gegen die Software, die die Daten 
weiterleiten muss.

von Alex E. (alex_e)


Lesenswert?

das wurde aber auf kosten der datenrate gehen oder? und ich kann keine 
broadcast nachrichten mehr verschicken...

von Marcus (Gast)


Lesenswert?

Alex E. schrieb:
> wieso kein maxim?

Schlechte Erfahrungen mit Preisen, Lieferfähigkeit, Abkündigung, usw.

von chris (Gast)


Lesenswert?

Habe viele solcher Systeme mit I2C Bus gesehen, die meisten mit 4066 ,
dies schließt aber 3.3V Systeme aus. Wenn die Verkabelung in den Preis
reingeht, hat sich auch LIN durchgesetzt, mit den Lin Tranceivern welche
5V PSU drin haben. 1Wire CAN habe ich auch gesehen, sind aber 
Nischenlösungen.

von c-hater (Gast)


Lesenswert?

Jens schrieb:

> Die Idee beim dritten moin war, jeden Platine das Signal empfangen und
> erneut aktiv aussenden zu lassen. Es entstehen also nur kurze,
> wohldefinierte Datenstrecken von 20cm.

So habe ich das auch verstanden und halte die Idee für gut. Allerdings 
muß man sich im Klaren darüber sein, daß so eine Kette eine nicht zu 
unterschätzende Verzögerung erzeugt und das Protokoll so gestalten, daß 
möglichst wenige Frage-Antwort-Wechselspiele vorkommen, denn dabei geht 
die Verzögerung gleich doppelt ein und belegt den Bus, ohne daß 
irgendwelche Daten dabei transportiert würden. Sprich: Man sollte 
möglichst große Datenblöcke verwenden.

> Du tauscht den Hardware-Aufwand gegen die Software, die die Daten
> weiterleiten muss.

Nö, man kann auch einfach ein paar Logik-Gatter zur Weiterleitung und 
Auskopplung verwenden. Softwarehilfe braucht man dann bloß für die 
Autoadressierung. Da wird einfach die Weiterleitung zur nächsten Platine 
blockiert, bis man eine Adresse bekommen hat, danach wird sie 
freigeschaltet.

Da Logik-ICs spottbillig sind, würde ich vorschlagen, die Sache gleich 
doppelt vorzusehen und dann mit differentiellen Signalen zu arbeiten.

von Alex E. (alex_e)


Lesenswert?

c-hater schrieb:
> Allerdings
> muß man sich im Klaren darüber sein, daß so eine Kette eine nicht zu
> unterschätzende Verzögerung erzeugt und das Protokoll so gestalten, daß
> möglichst wenige Frage-Antwort-Wechselspiele vorkommen, denn dabei geht
> die Verzögerung gleich doppelt ein und belegt den Bus, ohne daß
> irgendwelche Daten dabei transportiert würden. Sprich: Man sollte
> möglichst große Datenblöcke verwenden.
>
angenommen ich nehme RS232 TTL pegel und schiebe das immer durch den 
Atmega88 durch. Von welcher verzögerung kann ich bei dem einen 
Controller ausgehen?

>
> Nö, man kann auch einfach ein paar Logik-Gatter zur Weiterleitung und
> Auskopplung verwenden. Softwarehilfe braucht man dann bloß für die
> Autoadressierung. Da wird einfach die Weiterleitung zur nächsten Platine
> blockiert, bis man eine Adresse bekommen hat, danach wird sie
> freigeschaltet.
>
> Da Logik-ICs spottbillig sind, würde ich vorschlagen, die Sache gleich
> doppelt vorzusehen und dann mit differentiellen Signalen zu arbeiten.

Das habe ich auch so in etwa vorgestellt, dass ich dafür Logik-ICs 
einsetzten kann nicht. Danke!

von Markus M. (Firma: EleLa - www.elela.de) (mmvisual)


Lesenswert?

Alex E. schrieb:
> Hab mal kurz gerechnet, bräuchte für jede Platine so 48kbit/s..
> Das gibt etwa 1,4Mbit/s bei 30 Platinen.
>
> Autoadressierung sollte auch möglich sein...

Soll das irgend was mit Audiodaten werden?

Wäre es dann nicht besser der Arduion würde 30 Kanäle bereit stellen?

von Christian (Gast)


Lesenswert?

Hast du das mit dem CAN denn mal in betracht gezogen?
Wie sind die äußeren Bedingungen?
Ist viel EMV im Umfeld?

Natürlich wirds mit CAN aufwändiger und auch vermutlich teurer aber du 
hast gerade Vorteile in Sachen Störfestigkeit.

von Reinhard Kern (Gast)


Lesenswert?

Jens schrieb:
> Die Idee beim dritten moin war, jeden Platine das Signal empfangen und
> erneut aktiv aussenden zu lassen.

Das hat aber auch Nachteile: fällt eine Platine aus, so auch alle 
dahinterliegenden. Bei einem echten Bus funktioniert nur die eine nicht 
mehr.

Kommt auf die Anwendung an, ob das was ausmacht.

Gruss Reinhard

von schonk (Gast)


Lesenswert?

> Natürlich wirds mit CAN aufwändiger und auch vermutlich teurer aber du
> hast gerade Vorteile in Sachen Störfestigkeit.

Wieso soll CAN störfester sein als eine RS485-Verbindung? Ich kenne 
Beispiele, die das Gegenteil belegen.
Die geforderte Datenrate und Topologie dürfte mit RS485 ohne große 
Probleme (vorausgesetzt, die richtigen µCs werden verwendet) und recht 
störfest zu realisieren sein.


> angenommen ich nehme RS232 TTL Pegel

Warum? RS485-Treiber kosten ähnlich viel wie RS485-Treiber, sind 
deutlich störanfälliger und erlauben nur Punkt- zu Punkt-Verbindungen.


> Von welcher verzögerung kann ich bei dem einen Controller ausgehen?

Je nachdem, was Du alles vorhast, liegt die Verzögerung etwa zwischen 
1,5 Bytelängen bis mehreren Sendungslängen.


> würde das mit ttl un evtl. Impedanzwandler je platine gehen? bei der
länge?

Ja, ist aber störanfälliger als RS485.

von moeb (Gast)


Lesenswert?


von H.Joachim S. (crazyhorse)


Lesenswert?

CAN ist nach aussen hin störfester als RS485, weil Übertragungsfehler 
automatisch erkannt werden. Physikalisch ist RS485 besser (es gibt den 
schlappen rezessiven Pegel nicht).
CAN hat in deinem Fall auch den Nachteil, dass ne Menge Bits übertragen 
werden, die nichts zur eigentlichen Sache tun. Üblicherweise arbeitet 
CAN mit max. 1Mbit, was einer Nettodatenrate von etwa 500kbit 
entspricht, fällt also auch von daher schon aus.
RS485 ist die ideale Lösung für Single-Master wie in deinem Fall. 
Einfach, billig, zuverlässig, schnell. Alles andere wäre meiner Meinung 
nach die falsche Lösung.

von Alex E. (alex_e)


Lesenswert?

momentan ergibt aus der diskussion für mich rs485 am meisten Sinn.

Welche vorschläge gibt es zur Auto adressierung?
Ich würde gerne zusätzliche Signale auf dem Stecker vermeiden...
Logik IC würde hier ja nicht mehr gehen!?

von H.Joachim S. (crazyhorse)


Lesenswert?

Zumindest ein zusätzliche Leitung wirst du dafür brauchen.

von c-hater (Gast)


Lesenswert?

Alex E. schrieb:

> angenommen ich nehme RS232 TTL pegel und schiebe das immer durch den
> Atmega88 durch. Von welcher verzögerung kann ich bei dem einen
> Controller ausgehen?

Na mindestens eine Wortlänge zzgl. der Interrupt-Responsezeit.

von Marcus (Gast)


Lesenswert?

Alex E. schrieb:
> Welche vorschläge gibt es zur Auto adressierung?

Du ziehst eine weitere Leitung auf dem Bus als daisy chain: Der erste 
Slave hängt schon beim Einschalten am Bus und bekommt vom Master eine 
Adresse zugewiesen. Danach schaltet er den receiver enable des nächsten 
Slaves ein, dann bekommt dieser eine Adresse vom Master zugewiesen, usw.

von Alex E. (alex_e)


Lesenswert?

Bei den RS485 werden DE & RE immer an einen Pin vom µC angehängt.

Was genau mach das Signal? Wozu brauche ich das?

von H.Joachim S. (crazyhorse)


Lesenswert?

Sende/Empfangsumschaltung.

von Alex E. (alex_e)


Lesenswert?

soviel hab ich kapiert, aber was ist LOW was ist HI.
Wie schaue ich ob nicht gerade jemand anders sendet?

von Bastler (Gast)


Lesenswert?

Low = Empfang / High = Senden

Bei einem Single-Master-System ist es einfach.
Du weißt ja ob du gerade sendest bzw. wann eine Antwort von einem Slave 
komplett ist.
Ansonsten musst du immer auf Empfang sein (müsste eh immer so sein) und 
nur senden wenn du nichts empfängst.


P.S.: Darf man noch ein Master-Slave System beschreiben oder ist das 
mittlerweile "politisch Inkorrekt"???

von H.Joachim S. (crazyhorse)


Lesenswert?

Alex E. schrieb:
> Wie schaue ich ob nicht gerade jemand anders sendet?

Genau das ist das grundlegende Problem bei RS485-Multimastersystemen. 
Prinzipiell: ja, es geht. Aber es ist mit einem erheblichen 
Softwareaufwand verbunden.
Ich persönlich setze RS485 nur in single-master-Systemen ein.

von Alex E. (alex_e)


Lesenswert?

H.Joachim Seifert schrieb:
> Alex E. schrieb:
>> Wie schaue ich ob nicht gerade jemand anders sendet?
>
> Genau das ist das grundlegende Problem bei RS485-Multimastersystemen.
> Prinzipiell: ja, es geht. Aber es ist mit einem erheblichen
> Softwareaufwand verbunden.
> Ich persönlich setze RS485 nur in single-master-Systemen ein.

Sorry, hab auch nur einen Master. Von dem her passt das.
Danke...

von H.Joachim S. (crazyhorse)


Lesenswert?

Eben. Und deswegen musst du nicht wissen, ob gerade jemand sendet. D.h. 
alle slaves sind auf Empfang. Es sei denn, sie werden vom master 
aufgefordert, ihren Datensalat loszulassen.
Da lauert übrigens noch ein kleines timing-Problem. Je nach UART gibt es 
verschiedene Statusbits. Z.B. eines, das anzeigt, dass das Byte ins 
Senderegister geschrieben wurde. Das darf man natürlich nicht benutzen, 
um auf Empfang umzuschalten. Sondern erst dann, wenn das Datenbyte incl. 
parity/stopbit(s) tatsächlich raus sind.

von Peter D. (peda)


Lesenswert?

Alex E. schrieb:
> Wie schaue ich ob nicht gerade jemand anders sendet?

Das ist genau das Problem am RS-485.
RS-485 ist daher zeitgesteuert:
Der Master muß zuerst an den Slave eine Nachricht senden, in welchem 
Zeitfenster dieser auf Senden umschalten darf, sobald er zum Senden 
adressiert wurde.
Die minimale Wartezeit gibt an, wann der Master zuverlässig auf Empfang 
umgeschaltet hat. Und die maximale Zeit gibt an, wie lange der Master 
auf Empfang bleibt, ehe er ein Timeout annimmt und z.B. die Nachricht 
wiederholt.

von René B. (reneb)


Lesenswert?

Im 9Bit-Modus (9tes signalisiert Slave-Adresse) über UART auf RS485 bei 
250k und einem miesen protokoll mit 12 Nutzbytes und 15 "Byte" (sind ja 
eigentlich 9 Bit) Rahmen dauert mit zwei zusätzlichen Bytes wg. 
Frame-Error Vorbeugung etwa:
Start+9+Stop (keine Parity, das kann man Bitweise machen) => 11*4µS=44µS
jetzt noch 12Nutzbytes+Adresse+Cmd+Parity+2*Frame-Sync => 17*44µS=748µS

Mal den worst-case Überschlag angenommen der Master will 12 Nutzbyte 
senden und der Slave mit 12Nutzbyte antworten, dann kommt man bei 
2*0,75=1,5ms raus!

Wenn das ganze über 30 slaves geht, bist du nach spätestens 45ms einmal 
rum, wenn du die 12Byte ausnutzt.

DMX ist ja auch 250k-UART-basiert und da hängen auch mehr als 30 slaves 
dran und trotzdem geht es irgendwie.

Bei den RS485-Bausteinen gibt es tolle 5V-supply und gleichzeitig 
3,3V-kompatible ICs von Maxim die auch 1/8 unit load haben, sprich von 
denen kannst du auch 8*32 an den Bus hängen und die Kommunikation läuft 
noch sauber über "mehrere meter".

von Alex E. (alex_e)


Lesenswert?

René B. schrieb:
> Bei den RS485-Bausteinen gibt es tolle 5V-supply und gleichzeitig
> 3,3V-kompatible ICs von Maxim die auch 1/8 unit load haben, sprich von
> denen kannst du auch 8*32 an den Bus hängen und die Kommunikation läuft
> noch sauber über "mehrere meter".

Kannst du das nochmal genau erklären? Was meinst du mit 8*32? 8/32/256 
Busteilnehmer?

von René B. (reneb)


Lesenswert?

Ein RS485 transciever mit unit-load==1 belastet die Leitungen so, dass 
genau 32 Teilnehmer zuverlässig daran angeschlossen werden können.
Wenn ein transciever in der Spec aber so beschrieben wird, dass er die 
Leitung mit 1/8 unit-load belastet, so kann man 8mal mehr Teilnehmer 
diesen Typs an den Bus hängen. Daher 8*32 Teilnehmer, wenn alle 
transciever vom typ (1/8-unit-load) haben.

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
Noch kein Account? Hier anmelden.