Forum: Mikrocontroller und Digitale Elektronik RS485 nicht symmetrisch!


von Hannes (Gast)


Angehängte Dateien:

Lesenswert?

Hallo!

Ich habe ein Problem mit der Datenübertragung zwischen 2 Arduinos:
Die Zwei sind mittels RS485 Transceiver verbunden, im Anhang der 
Screenshot vom LogicAnalyzer.
Wie man sehen kann sind die zwei RS485 Signale nicht symmetrisch!
Das Gelbe startet mit High, das Grüne mit Low. Soweit so gut!
Nach der Übertragung ist jedoch das Gelbe noch eine Zeitlang High.

Wie kann sowas sein?

Das Rote Signal ist der RXD-Pin vom Arduino, der natürlich eine 
Übertragung feststellt und die RXD-LED ständig leuchtet.

Sollte nicht der Transceiver das Signal automatisch symmetrieren?

Gruss aus Österreich, Hannes Schiller.

PS: Transceiver ist ein 65176B.

von (prx) A. K. (prx)


Lesenswert?

Transmitter erst abschalten wenn die Daten alle raus sind. Nicht schon, 
wenn der Sendepuffer noch Luft hat.

von Hannes (Gast)


Lesenswert?

Hab ich im Quelltext:

Serial.flush() //Warten bis Daten raus sind
digitialWrite(RS485,LOW) //Transmitter abschalten

Oder muss ich das anders formulieren?

von (prx) A. K. (prx)


Lesenswert?

Zu Arduino-Libs kann ich nicht beitragen.

Wie sieht die Terminierung aus?

Oszi vorhanden?

: Bearbeitet durch User
von (prx) A. K. (prx)


Lesenswert?

Funktioniert die Lib? Hier tat sie es erst nicht:
http://forum.arduino.cc/index.php?topic=151014.msg1134496#msg1134496

: Bearbeitet durch User
von Ruediger A. (Firma: keine) (rac)


Lesenswert?

Sieht fast so aus, als ob Du bei der Richtungsumschaltung nicht beide 
Richtungen abschaltest, sondern nur eine. Jeder "normale" RS485 PHY hat 
je einen Eingang zum Aktivieren von Empfänger und Sender, 
intelligenterweise in der Regel invertiert, so dass Du mit einer Leitung 
zum Umschalten beider Pins auskommst, wenn Du sie zusammenschaltest. 
Manche Leute legen konstant den Receive Enable auf "immer an," manche 
steuern beide getrennt (dann must Du natürlich softwaremäßig beide 
Leitungen parallel runterziehen. Oder Rx immer aktiv lassen, aber die im 
loopback gelesenen eigenen Zeichen auf dem Bus ignorieren, was auch bei 
der "immer an" Variante der Fall ist).

Hast Du einen Schaltplan von der PHY Ansteuerung?

von Hannes (Gast)


Lesenswert?

Ich hab die Daten vom LA decodiert, und gesehen, dass die Daten 
vollständig gesendet wurden.
Das Byte '171' wird übertragen und auch das Stop Signal kann ich sehen, 
wenn ich reinzoome.
Wie kann es überhaupt sein, dass beide RS485 Leitungen high sind?
Das ist doch normalerweise garnicht möglich oder?

von (prx) A. K. (prx)


Lesenswert?

Hannes schrieb:
> Das ist doch normalerweise garnicht möglich oder?

Ohne Terminierung bei abgeschaltetem Transmitter geht das.

von Hannes (Gast)


Lesenswert?

Die Zwei Steuersignale hab ich wie bereits vermutet auf den selben Pin 
verdrahtet.
Laut Datenblatt ist auch eine High-Active und eine Low-Active.

von Hannes (Gast)


Lesenswert?

Terminierung ist beiderseits 150 Ohm

von (prx) A. K. (prx)


Lesenswert?

Ein LA ist nicht geeignet, den Zustand des RS485 bei abgeschaltetem 
Transceiver sinnvoll zu bewerten. Das kann schon ein Multimeter besser.

von (prx) A. K. (prx)


Lesenswert?

Bei abgeschaltetem Transmitter und vorhandenem Abschluss haben beide 
Leitungen den gleichen Pegel. Ein LA wird folglich auf beiden Leitungen 
den gleichen Zustand anzeigen.

Es ist also vielleicht alles in Ordnung und dein LA führt dich an der 
Nase herum.

: Bearbeitet durch User
von Dietrich L. (dietrichl)


Lesenswert?

Hannes schrieb:
> Terminierung ist beiderseits 150 Ohm

Bei abgeschaltetem Sender hast Du dann 0V Differenz zwischen den beiden 
Leitungen. Daraus darf ein Empfänger machen, was er will, denn das ist 
undefiniert.
Eine richtige Terminierung hat an einer Seite noch Ziehwiderstände an 
Vcc und GND. Damit ist der Ruhepegel definiert. Siehe:
https://de.wikipedia.org/wiki/EIA-485#Technik

: Bearbeitet durch User
von (prx) A. K. (prx)


Lesenswert?

Dietrich L. schrieb:
> Daraus darf ein Empfänger machen, was er will, denn das ist
> undefiniert.

Es gibt eine kleine Hysterese. Bei 0V Differenz bleibt er im bisherigen 
Zustand. Failsafe Terminierung ist dem aber vorzuziehen.

: Bearbeitet durch User
von Hannes (Gast)


Lesenswert?

Warum leuchtet dann die RX-LED beim empfangenden Arduino die ganze Zeit?
Das mit den Widerständen hab ich schon versucht, je 470 Ohm nach VCC bei 
A und nach GND bei B, hat nix gebracht!
Problem bei der Sache ist, dass der Arduino nicht antworten kann, weil 
er die ganze Zeit empfängt.
Das mit den Ruhepegeln stimmt natürlich, habe mit dem Oszi nachgemessen.

von Dietrich L. (dietrichl)


Lesenswert?

A. K. schrieb:
> Dietrich L. schrieb:
>> Daraus darf ein Empfänger machen, was er will, denn das ist
>> undefiniert.
>
> Nicht ganz. Es gibt eine kleine Hysterese. Bei 0V Differenz bleibt er im
> bisherigen Zustand.

Da hast Du völlig recht.
Aber jede kleine Störung/Reflektion kann den Zustand ändern und zu 
Fehlern des Auswertung führen. Daher ist der "Abschlusswiderstand mit 
Bias-Netzwerk" ja so wichtig und wird Hannes bei der Suche helfen, falls 
es eine andere Ursache für das beobachtete Verhalten gibt.

von Dietrich L. (dietrichl)


Lesenswert?

Hannes schrieb:
> Problem bei der Sache ist, dass der Arduino nicht antworten kann, weil
> er die ganze Zeit empfängt.

Da Du ja ein Oszi hast: hast Du auch das Timing zum Umschalten des 
RS485-Treibers nachgemessen?

von (prx) A. K. (prx)


Lesenswert?

Dietrich L. schrieb:
> Da Du ja ein Oszi hast: hast Du auch das Timing zum Umschalten des
> RS485-Treibers nachgemessen?

Das kann er auch mit den LA anzeigen.

von Hannes (Gast)


Lesenswert?

Fehler liegt nicht beim RS485, sondern beim Arduino!
Hab gerade das Oszi an den RX-Pin angeschlossen, da is keine Spannung im 
Ruhezustand!
Keine Ahnung wieso die blöde LED leuchtet, aber am Bus liegts nicht!

von (prx) A. K. (prx)


Lesenswert?

Rx offen => Leitung floatet => Zufall. Pullup 10K.

Alternativ den Receiver eingeschaltet lassen und nur den Transmitter 
schalten. Dann kriegt die Software alles was gesendet wird retour, was 
man dann eben ignoriert.

: Bearbeitet durch User
von Dietrich L. (dietrichl)


Lesenswert?

A. K. schrieb:
> Rx offen => Leitung floatet => Zufall. Pullup 10K.

Das erklärt aber nicht, warum die LED leuchtet.
Dabei gehe ich allerdings davon ausgehe, dass sie an dieser Leitung 
angeschlossen ist...

von (prx) A. K. (prx)


Lesenswert?

Dietrich L. schrieb:
> Dabei gehe ich allerdings davon ausgehe, dass sie an dieser Leitung
> angeschlossen ist...

Was zu klären wäre. Und wenn: wie, direkt oder über Treiber-IC?

: Bearbeitet durch User
von Klaus (Gast)


Lesenswert?

A. K. schrieb:
> Es ist also vielleicht alles in Ordnung und dein LA führt dich an der
> Nase herum.

Der RS485 Pegel ist die Differenz zwischen den beiden Signalen, der LA 
misst aber die Signale gegen GND. Er zeigt daher etwas Falsches an. Wenn 
das eine RS485 Signal 4,5V und das andere 5,5V hat, ist das für das 
differentielle Signal OK (> 200mV), für den LA sind beide High. Der LA 
ist ungeeignet, er müsste einen Differenzeingang haben.

MfG Klaus

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.