mikrocontroller.net

Forum: Mikrocontroller und Digitale Elektronik RS485 Bus


Autor: Thorsten (Gast)
Datum:
Angehängte Dateien:

Bewertung
0 lesenswert
nicht 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

Autor: Rahul (Gast)
Datum:

Bewertung
0 lesenswert
nicht 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...

Autor: Marko (Gast)
Datum:

Bewertung
0 lesenswert
nicht 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.

Autor: Rahul (Gast)
Datum:

Bewertung
0 lesenswert
nicht 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...

Autor: A.K. (Gast)
Datum:

Bewertung
0 lesenswert
nicht 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.

Autor: Rahul (Gast)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
Auf diese Aussage deinerseits bezog ich mich.

Autor: Detlev Tietjen (Gast)
Datum:

Bewertung
0 lesenswert
nicht 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

Autor: Marko (Gast)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
schonmal das Oszi auf den Bus gehängt?

Autor: A.K. (Gast)
Datum:

Bewertung
0 lesenswert
nicht 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.

Autor: Detlev Tietjen (Gast)
Datum:

Bewertung
0 lesenswert
nicht 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

Autor: Rahul (Gast)
Datum:

Bewertung
0 lesenswert
nicht 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...

Autor: Thorsten Fritzke (thorsten)
Datum:

Bewertung
0 lesenswert
nicht 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

Autor: Thorsten Fritzke (thorsten)
Datum:

Bewertung
0 lesenswert
nicht 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

Antwort schreiben

Die Angabe einer E-Mail-Adresse ist freiwillig. Wenn Sie automatisch per E-Mail über Antworten auf Ihren Beitrag informiert werden möchten, melden Sie sich bitte an.

Wichtige Regeln - erst lesen, dann posten!

  • Groß- und Kleinschreibung verwenden
  • Längeren Sourcecode nicht im Text einfügen, sondern als Dateianhang

Formatierung (mehr Informationen...)

  • [c]C-Code[/c]
  • [avrasm]AVR-Assembler-Code[/avrasm]
  • [code]Code in anderen Sprachen, ASCII-Zeichnungen[/code]
  • [math]Formel in LaTeX-Syntax[/math]
  • [[Titel]] - Link zu Artikel
  • Verweis auf anderen Beitrag einfügen: Rechtsklick auf Beitragstitel,
    "Adresse kopieren", und in den Text einfügen




Bild automatisch verkleinern, falls nötig
Bitte das JPG-Format nur für Fotos und Scans verwenden!
Zeichnungen und Screenshots im PNG- oder
GIF-Format hochladen. Siehe Bildformate.
Hinweis: der ursprüngliche Beitrag ist mehr als 6 Monate alt.
Bitte hier nur auf die ursprüngliche Frage antworten,
für neue Fragen einen neuen Beitrag erstellen.

Mit dem Abschicken bestätigst du, die Nutzungsbedingungen anzuerkennen.