Forum: Mikrocontroller und Digitale Elektronik Kollisionserkennung bei RS485


von stepp64 (Gast)


Lesenswert?

Hallo,

ich beabsichtige mehrere µC über UART -> RS485 an einen ca. 30m langen 
Bus zu hängen. Als RS485 Treiber möchte ich den SN75176 einsetzen. Nun 
möchte ich in meinem Protokoll eine Kollisionserkennung einbauen, da 
thoretisch die Möglichkeit besteht, dass mehrere Geräte gleichzeitig 
senden.

Nun habe ich folgende Idee: Wenn ich Daten über TX versende müssten 
diese Daten doch gleichzeitig auf dem RX-Pin wieder eintreffen sofern 
der Bus nicht durch einen anderen µC belegt ist. Wenn ich also nach dem 
Senden eines Bytes das empfangene Byte mit dem gesendeten vergleiche 
sollte doch keine Kollision aufgetreten sein, oder? Sind sie 
unterschiedlich gab es ein Problem und ich muss neu senden. Kann das 
prinzipiel funktionieren oder macht man das in der Praxis anders?

Sven

von Andreas K. (a-k)


Lesenswert?

Eine sichere Kollisionserkennung gibt es, wenn du CAN-Transceiver an 
Stelle der RS485-Transceiver einsetzt. Nur die Transceiver wohlgemerkt 
(z.B. 82C250 statt 75176), weiterhin mit UART. Die haben im Gegensatz zu 
RS485-Transceivern ein sauber definiertes Kollisionsverhalten. Bei 
RS485-Transceivern ist eine Kollision ein Kurzschluss zwischen 2 
Treibern mit hohem Strom und wenig definiertem Pegel als Ergebnis. Bei 
CAN-Transceivern entsteht kein Kurzschluss und es dominiert die "0".

von stepp64 (Gast)


Lesenswert?

Ich habe zwar die 75176 schon hier rum liegen, aber CAN-Bus ist sicher 
auch noch eine Option. Ich habe mir gerade mal das Datenblatt des 
PCA82C250 angeschaut und mich im WIKI über den CAN BUS informiert. Nun 
stellt sich für mich die Frage, was ich mit den Anschlüssen Vref und Rs 
machen muss. In den Applications wird der Baustein ja immer an einen 
CAN-Controller angeschlossen. Könnte dieser Controller dann nicht auch 
mein µC sein? Oder wird der CAN-Controller wegen der Kollisionserkennung 
benötigt?

Sven

von Andreas K. (a-k)


Lesenswert?

Die kannst den PCA82C250 grad so wie den 75176 an die UART anschliessen. 
Tx-Enable ist dann unnötig. Aber aus UART mit CAN Transceivern wird kein 
CAN Bus. Die CAN Transceiver bauen dir einen auch bei Kollisionen 
sauberen Bus, aber der Inhalt ist dann immer noch UART, kein CAN, und 
die Kollisionen musst du wie beschrieben erkennen und reparieren. Das 
ist ähnlich wie RS485 mit etwas anderen Pegeln.

Einfacher es es natürlich, gleich CAN mitsamt CAN-Controller (z.B. 
MCP2515) zu verwenden. Erspart dir manche grauen Haare, die du dir mit 
Multimaster-RS485 leicht einhandeln kannst. Weil der CAN Controller den 
ganzen Kollisionskram in Hardware erledigt.

von Andreas K. (a-k)


Lesenswert?

Was die Transceiver angeht: Rs bestimmt die Flankensteilheit. Die hängt 
von der Bitrate ab. Beispielsweise Rs=20-30K für 125KBps, Rs=0 für 
1Mbps. Geringere Flankensteilheit ist bei ungeschirmten Kabeln ganz 
nützlich aber nicht zwingend, weil weniger Abstrahlung. Vref offen 
lassem.

von stepp64 (Gast)


Lesenswert?

Also mir würde 9600 bps völlig reichen, da ich nur alle paar Sekunden 8 
Bytes übertragen will. Wie groß sollte der Widerstand dann sein und wie 
erkenne ich eine Kollision oder muß ich das so verstehen, dass bei 
Kollision immer eine Null empfangen wird? Dann empfange ich doch aber 
falsche Daten ohne es zu merken. Irgendwie stehe ich mal wieder auf dem 
Schlauch (wie immer bei für mich neuen Themen).

Sven

von Stefan E. (sternst)


Lesenswert?

Zur Dimensionierung des Widerstandes siehe am besten in die App-Note:
http://www.nxp.com/acrobat_download/applicationnotes/AN96116.pdf

Die Kollisionserkennung ist recht einfach. Du musst nur beim Schreiben 
"mitlesen". Wenn der geschriebene nicht mit dem zurück gelesenen Wert 
übereinstimmt, dann hattest du eine Kollision.

von Andreas K. (a-k)


Lesenswert?

stepp64 wrote:

> Wie groß sollte der Widerstand dann sein

47K ist ok, bei 9600bps dürfen es auch 100K sein.

> wie erkenne ich eine Kollision oder muß ich das so verstehen, dass bei
> Kollision immer eine Null empfangen wird?

Auf Rx kriegst du immer den Zustand vom Bus. Kollision heisst also, du 
empfängst auf Rx nicht das, was du auf Tx rausgesendet hast. 
Sinnvollerweise sendest du zudem eine 16-Bit CRC am Ende eines solchen 
Pakets.

von Andreas K. (a-k)


Lesenswert?

Ach ja: Busabschluss nicht vergessen. Bei kurzer Leitung reicht einer, 
bei langer Leitung sollten es 2 sein, und zwar an den Enden. 9600bps bei 
30m wird wohl auch mit einem Abschluss funktionieren, aber jeweils 120 
Ohm an den beiden Enden ist ja auch kein Aufwand. Ohne Abschluss sind 
CAN Transceiver nicht zuverlässig einsetzbar.

von stepp64 (Gast)


Lesenswert?

Also vom Prinzip so, wie ich mir das für RS485 auch überlegt hab, halt 
nur sicherer. Na ich geh da noch mal in den Denkteich. Noch hab ich 
meine Platine ja nicht geätzt und kann noch Änderungen einbauen. Danke 
erst mal für die guten Tips.

Sven

von Trusti (Gast)


Lesenswert?

Hallo,

ich habe diesen Beitrag eben voller Interesse gelesen, da ich gerade vor 
einem ähnlichen Problem stehe. Ich habe an der Stelle mal ein paar 
Fragen:

Wie wird die Synchronisation der Busteilnehmer ralisiert?

Also was passiert, wenn eventuell ein Teilnehmer anfängt zu senden, 
während ein anderer gerade ein halbes Bit gesendet hat?

Bei Kollision ist doch im Normalfall das Datenpaket defekt und muss 
wiederholt werden, oder?
Wie realisiert man das das Wiederholen des Senden, denn es müssen ja 
dann im Prinzip beide Teilnehmer (der schon am Senden war und der mit 
Senden beginnen wollte) ihre Datenpakete wiederholen? Es wird ja dann 
voraussichtlich wieder ein Kollision geben, oder?

Wäre super, wenn Ihr vielleicht eure Gedanken dazu mit mir teilt.

MFG,
Trusti

von ?? (Gast)


Lesenswert?

Ein CAN Bus ist automobillastig und nicht zwingend brauchbar in einer 
anderen Anwendung. Ein CAN Meldung kann zb nur 6 byte lang sein. Wenn 
man da einen Datentransfer druber machen will sieht man alt aus. Ich 
wuerd'n in die Tonne treten und bei RS485 bleiben. Wie waer's mit einem 
Busmaster ?

von (prx) A. K. (prx)


Lesenswert?

?? schrieb:

> Ein CAN Bus ist automobillastig und nicht zwingend brauchbar in einer
> anderen Anwendung. Ein CAN Meldung kann zb nur 6 byte lang sein. Wenn
> man da einen Datentransfer druber machen will sieht man alt aus.

Genauer gesagt 8 Bytes. Wenn's sein muss kann man auch 16-20 Bits der 
29bit Adresse dafür nutzen, da sind es schon 10 Bytes.

Und natürlich kann man grössere Datentransfer damit machen. Problemlos. 
Freilich kommt man bei der effektiven Bitrate nicht in die Nähe der 
Leitungsrate, erreicht vielleicht die Hälfte oder so. Aber das muss ja 
nicht unbedingt stören.

Ich übertrage damit u.A. ein 4Mbit Datalog.

von STK500-Besitzer (Gast)


Lesenswert?

>Wie wird die Synchronisation der Busteilnehmer ralisiert?

>Also was passiert, wenn eventuell ein Teilnehmer anfängt zu senden,
>während ein anderer gerade ein halbes Bit gesendet hat?

Ich habe mir nicht den ganzen Thread durchgelesen (ist ja auch schon 
"gebraucht"..).

Wenn man einen Bus mit mehrern Mastern aufbauen will, bietet es sich an 
statt eines "Standard-RS485"-Transceivers einen CAN-Transceiver zu 
benutzen.
Bei den RS485-Transceivern sind die Endstufen meist so niederohmig in 
Verbindung mit dem Leitungswiderstand, dass man gar nicht merkt, dass es 
zu einer Kollision kommt.
I.d.R. erkennt man Kollisionen dadurch, dass man das, was man sendet 
gleichzeitig empfängt. Gibt es zwischen den beiden Daten einen 
Unterschied, dann nimmt der Master mit dem "niederwertigeren" Bit (CAN 
unterscheidet da bei der Bit-Dominanz) die Füße vom Bus und lässt den 
anderen Senden.
CAN-Transceiver haben dann noch den Vorteil, dass man die Sendestufe 
explizit ein- und ausschalten muss.
Wenn auf dem Bus nicht viel los ist, das Verhältnis Datenübertragung zu 
Pause klein ist, dann braucht man sich nicht unbedingt um Kollisionen 
kümmern.
Ansonsten bietet sich der Single-Master-Betrieb an, bei dem ein Master 
die Slaves explizit auffordert, Daten auf den Bus zu geben.

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.