Forum: Mikrocontroller und Digitale Elektronik RS485 Bus


von Thorsten (Gast)


Angehängte Dateien:

Lesenswert?

Hallo Forum,

ich versuche hier seit geraumer Zeit recht erfolglos 2 kleine Boards
mittels RS485 dazu zu bewegen miteinander zu reden.

Ich verwende 2 AVR's, deren RS232 an jeweils einen SN76176 gebunden
ist.
Beide Richtungspins am Bustreiber sind zusammen an einem anderen
Portpin.
Der Bus ist an beiden Enden mit jeweils 120R zwischen den Busleitungen
terminiert.

Ich versuche einfach ein Byte vom Master vom Slave zurücksenden zu
lassen. Ein simples Echo. Baudrate: 9600

Prinzip:
Master bekommt ein Byte über USB (funktioniert)
Master sendet das Byte auf den Bus
Slave empfängt das Byte
Slave sendet das Byte zurück auf den Bus
Master empfängt das Byte und sendet es zurück über USB

Passieren tut auf den Controllern überhauptnichts. Wenn ich das
Bussystem duch ein Kabel ersetze, welches einfach nur die RS232's der
Controller brückt, funktioniert das Echo wie gewünscht.

Hat evtl. jemand einen Tip oder ein funktionierenden Code oder nen
Schaltplan, der funktioniert?

Gruß
Thorsten

von Rahul (Gast)


Lesenswert?

Testen könntest du es dadurch, dass du den RE-Pin des Master konstant
auf Masse (?) legst (war imho lowactive; sonst halt gegen Vcc).
Dann würdest du alles, was der Master sendet auch als Echo erhalten und
einen Fehler bei der Verdrahtung ausschliessen können...

von Marko (Gast)


Lesenswert?

Das Timing vom RS485 ist recht wichtig.
Der Mega hat nen Sendepuffer, in den Du das
zu sendende Byte reinschreibst.
Die Uart sendet dann harwaremäßig selbständig.
Wenn Du die Datenrichtung des RS485 Busbausteins
änderst bevor das zu sendente Byte raus ist
geht das Byte verloren, sprich du sendest NIX.
Zu dem Zweck hat der Mega aber n Flagbit, das gesetzt
ist wenn der Sendepuffer leer ist.
Es gibt also zwei varianten ... entweder du hältst
den µC per NOPs solange an, bis in etwa das Byte raus ist
oder du hältst ihn solange an, bis das Flag gesetzt ist.
Erst dann kannst Du die Datenrichtung ändern auf lesen.

von Rahul (Gast)


Lesenswert?

@Marko: Dafür ist das TXC-Interruptflag da, das Thorsten schon
auswertet. Es könnte vielleicht noch sein, dass nach Auftreten des
TXC-Interrupts noch eine kleine Pause gemacht werden muss...

von A.K. (Gast)


Lesenswert?

Yep, ich hatte nämlich auch schon mal den Eindruck gewonnen, dass dieses
Flags schon zur Halbzeit vom Stopbit kommt. Weshalb es etwas knapp
werden könnte.

von Rahul (Gast)


Lesenswert?

Auf diese Aussage deinerseits bezog ich mich.

von Detlev Tietjen (Gast)


Lesenswert?

@Thorsten
1) Ich verstehe deine Terminierung nicht ganz. Hast du keine Pull-Up
bzw. -Down Widerstände vorgesehen, die den Bus auf einem definierten
Pegel halten wenn keiner sendet?
2) 2x 120R parallel sind IMO generell ein bisschen wenig. Der 75176
kann maximal 60mA wenn ich mich nicht irre. Da ist die Spannung
wahrscheinlich aber schon zusammengebrochen. Ich habe auf jeder Seite
je einen 2k2 an +5V bzw. an GND für Terminierung und Pegeldefinition,
das funktioniert.

Gruß, Detlev

von Marko (Gast)


Lesenswert?

schonmal das Oszi auf den Bus gehängt?

von A.K. (Gast)


Lesenswert?

120 Ohm pro Seite ist die übliche RS485-Terminierung. Mit oder ohne
Bias-Widerstände, bei denen gehen die Ansichten etwas auseinander.
Deine zugegebenermassen stromsparende Version bei begrenzter Länge und
Bitrate mag funktionieren, hat aber wenig mit RS485 zu tun.

von Detlev Tietjen (Gast)


Lesenswert?

PS:
Noch ein Tip: Um Synchronisationsproblemen aus dem Weg zu gehen lasse
ich den Empfänger am 75176 immer eingeschaltet (also /RE auf GND) und
schalte stattdessen am AVR (bei mir tiny2313) jeweils Sender oder
Empfänger ein.

Noch ein Tip: Wenn du /RE doch benutzen willst: Nicht vergessen, dass
der 75176 bei DE=H hochohmig wird, also Pullup-Widerstand einschalten!

Gruß, Detlev

von Rahul (Gast)


Lesenswert?

Sinnvoller ist es, einen pull-down-Widerstand zu benutzen. Dann kann der
Controller den ansteuernden Pin auch hochohmig haben, ohne dass es zu
Störungen auf der Busleitung kommt.

>2x 120R parallel sind IMO generell ein bisschen wenig.

ist aber Standard...

von Thorsten F. (thorsten)


Lesenswert?

Hallo Forum,

danke erstmal für die vielen Antworten.

@Marko
Den Fehler hatte ich vorher schon selber bemerkt. Daher die Auswertung
des TXC Flags, wie Rahul schon erwähnte.
Ich könnte es nocheinmal probieren indem ich nach dem TXC noch etwas
warte. Werde ich gleich mal testen.

@Detlef
Die Terminierung habe ich aus dem Datenblatt vom Bustreiber. Mangels
praktischer Erfahrung mit RS485 habe ich mich einfach mal dran
gehalten. Zusätzliche Pullup/down Widerständ kann ich natürlich
testweise nochmal einlöten.

An ein Oszilloskop komme ich frühestens nächste Woche ran. Daher ->
Nein, ich hab noch keines rangehängt.

Zu der Sache den /RE ständig aktiv zu lassen muss ich mich nochmal ein
wenig im Datenblatt zurechtlesen.

Weiter Vorschläge sind gern gesehen. Insbesondere ein paar Zeilen Code
würden mich interessieren.

Gruß
Thorsten

von Thorsten F. (thorsten)


Lesenswert?

Hallo Forum,

sorry für Doppelpost.

Das Echo haut mittlerweile hin.
Die Bemerkungen von Rahul und A.K. treffen zu. Ich muss nach auftreten
des TXC Flags eine gewisse Zeit(angepasst an die Baudrate) warten,
damit die Kommunikation vernünftig läuft.

Gruß
Thorsten

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.