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
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".
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
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.
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.
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
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.
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.
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.
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
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
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 ?
?? 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.
>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.