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
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...
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.
@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...
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.
@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
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.
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
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...
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
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
Mit Google-Account einloggen
Noch kein Account? Hier anmelden.