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.
Hab ich im Quelltext:
Serial.flush() //Warten bis Daten raus sind
digitialWrite(RS485,LOW) //Transmitter abschalten
Oder muss ich das anders formulieren?
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?
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?
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.
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
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.
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.
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.
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?
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.
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!
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.
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...
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?
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