Datensalat bei RS 485

OP #7667933
Lesenswert?

Moin @ll,

vorweg wünsche ich allen ein entspanntes Pfingstwochenende.

Ich weiß nicht, ob ich gerade nur einen Denkfehler habe oder wo der Hase im Pfeffer begraben liegt.

Vorweg. Ich betreibe einen ATMega328P/ATMega16 erfolgreich mit der UART (RS232 ähnlich) Daten werden auch Sauber in PicoCom dagestellt. Da ich bei meinem nächsten Projekt jedoch nicht abschätzen kann, wieviel MCUs benödigt werden, will ich via RS485 in ein Netzwerk gehen.

Soweit von der Praxis und Theorie ja alles klar. Ergo Testschaltung mit einem SN 75176 ausgerüstet und diesen

https://www.reichelt.de/raspberry-pi-usb-rs485-schnittstelle-ch340c-rpi-usb-rs485-p242783.html?&nbc=1&trstct=lsbght_sldr::368554 als umsetzer verwendet.

Im Ergebnis erhalte ich jedoch nur folgenden Datensalat:

1
-#
2
                                                                        5'#������������y��{535/'y�
3
                  5���Q=)5U�����������������W#AY=�����������}75�75�{%^U����+뿿��}''5������������}�뿿��u-#
4
                         5'#������������y�35/'y�5���Q=)5U�����������������W#AY=�����������}75�75�{%^U����+뿿��}''5������������}�뿿��u-#
5
                                                       5'#������������y��{535/'y�
6
 5���Q=)5U�����������������W#AY=�����������}75�75�{%^U����+뿿��}''5������������}�뿿��u-#
7
        5'#������������y�{535/'y�
8
                                 5���Q=)5U�����������������W#AY=�����������}75�75�{%^U����+뿿��}''5������������}�뿿��u-#
9
                                        5'#������������y��{535/'y�5���Q=)5U�����������������W#AY=�����������}75�75�{%^U����+뿿��}''5������������}�뿿��u-#
10
                                                                         5'#������������y�{535/'y�
11
                  5���Q=)5U�����������������W#AY=�����������}75�75�{%^U����+뿿��}''5������������}�뿿��u-#
12
                         5'#������������y�{535/'y�5���Q=)5U�����������������W#AY=�����������}75�75�{%^U����+뿿��}''5������������}�뿿��u-#
13
                                                         5'#������������y�{535/'y�
14
  5���Q=)5U�����������������W#AY=�����������}75�75�{%^U����+뿿��}''5������������}�뿿��u-#
15
         5'#������������y�35/'y�5���Q=)5U�����������������W#AY=�����������}75�75�{%^U����+뿿��}''5������������}�뿿��u-#
16
                                       5'#������������y��{535/'y�
17
                                                                 5���Q=)5U�����������������W#AY=�����������}75�75�{%^U����+뿿��}''5�������������

Selbiger Output auf der RS232 ebene liefert mir meine Testdaten, welche ich ausgeben lasse.

1
Befehlstätze:
2
WakeUp:             $
3
Trans_Start:        <
4
Adresse des µCU:    
5
    Alle:           A
6
    Einzeln:        5

Als Randinfo. Terminal = Picocom v3.1

Settings:

1
picocom --b 19200 /dev/ttyUSB0
2
picocom v3.1
3

4
port is        : /dev/ttyUSB0
5
flowcontrol    : none
6
baudrate is    : 19200
7
parity is      : none
8
databits are   : 8
9
stopbits are   : 1
10
escape is      : C-a
11
local echo is  : no
12
noinit is      : no
13
noreset is     : no
14
hangup is      : no
15
nolock is      : no
16
send_cmd is    : sz -vv
17
receive_cmd is : rz -vv -E
18
imap is        : 
19
omap is        : 
20
emap is        : crcrlf,delbs,
21
logfile is     : none
22
initstring     : none
23
exit_after is  : not set
24
exit is        : no

Was ich mir ggf noch gut vorstellen könnte, hoffe aber nicht, das es genau dies ist. Das von dem Umsetzer zum TestPort der GND fehlt. Die Leitungslänge beträgt unter 10cm.

Für jene, welche es interessiert. Hier auch der Code für meine UART inkl RS485_Control (Nur Ansteuerung)

1
{$ifdef RS485}
2
procedure RS_Control(Value: Boolean);
3
begin
4
  DDRB                       := DDRB or (1 shl RS_485_IO);
5
  if Value then
6
    // True = Data Send
7
    PORTB                    := PORTB or (1 shl RS_485_IO)
8
  else
9
    // False = Data Read
10
    PORTB                    := PORTB or (0 shl RS_485_IO);
11
end;
12

13
{$endif}
14

15
procedure UARTInit(_U2X: boolean);
16
// _U2X -> True = einfache Baudrate
17
//         False = Doppelte Baudrate
18
begin
19
  {$ifdef M16p}
20
    if _U2X then begin
21
      UBRRL                  := (F_CPU div (16 * Baud)) - 1;
22
      UBRRH                  := 0;
23
      UCSRA                  := UCSRA or (1 shl U2X);
24
    end else begin
25
        UBRRL                := (F_CPU div ( 8 * Baud)) - 1;
26
        UBRRH                := 0;
27
        UCSRA                := UCSRA or (0 shl U2X);
28
        end;
29
    UCSRB                    := (1 shl TXEN) or (1 shl RXEN);
30
    UCSRC                    := (1 shl URSEL) or (%011 shl UCSZ);
31
  {$else ifdef M328p}
32
    if _U2X then begin
33
      UBRR0L                 := (F_CPU div (16 * Baud)) - 1;
34
      UBRR0H                 := 0;
35
      UCSR0A                 := UCSR0A or (1 shl U2X0);
36
    end else begin
37
        UBRR0L               := (F_CPU div ( 8 * Baud)) - 1;
38
        UBRR0H               := 0;
39
        UCSR0A               := UCSR0A or (0 shl U2X0);
40
        end;
41
    UCSR0B                   := UCSR0B or (1 shl TXEN0) or (1 shl RXEN0) or     // Empfangen und Senden
42
                                          (1 shl RXCIE0);                       // RX Interrupt aktivieren
43
    UCSR0C                   := UCSR0C or (%011 shl UCSZ0)                      // 8 - Bit übertragung, 1 Stop-Bits
44
  {$endif}
45
end;
Moderator (Firma: Titel) Persönliche Seite #7667936
Lesenswert?

Maik G. schrieb:

Im Ergebnis erhalte ich jedoch nur folgenden Datensalat

Was zeigt die Messung mit dem Oszilloskop an? Brauchbare Pegel? Stetige Flanken? Passendes Timing?

Oder versuchst du tatsächlich, einen seriellen (und zudem bidirektionalen) Bus ohne Oszi in Betrieb zu nehmen? Falls ja: das wird üblicherweise eine vogelwilde Ratestunde.

Das von dem Umsetzer zum TestPort der GND fehlt. Die Leitungslänge beträgt unter 10cm.

Die Leitungslänge ist in erster Näherung irrelevant. Nur die Potentialverhältnisse interessieren. Und für definierte Potentiale muss auch beim RS485 die Masse aller Teilnehmer verbunden sein.

OP #7668343
Lesenswert?

Lothar M. schrieb:

Was zeigt die Messung mit dem Oszilloskop an? Brauchbare Pegel? Stetige Flanken? Passendes Timing?

Da muß ich leider zu meiner Schande gerade mal passen, da mein Mini-Oszi das Zeitliche gesegnet hat.

Lothar M. schrieb:

auch beim RS485 die Masse aller Teilnehmer verbunden sein.

Da werd ich wohl einen anderen USB-RS485-Umsetzers suchen müssen, da meiner nur A und B als Output hat.

Harry L. schrieb:

Daten invertiert?

??? Damit erwischst du mich gerade auf den Falschen FUß, Aber NEIN.

N. M. schrieb:

Einfachste Idee: A und B vertauscht?

Dies kann ich glücklicherweise ausschießen

S. L. schrieb:

PORTB := PORTB or (0 shl RS_485_IO);

Soll dies Pin RS_485_IO auf Null setzen?

Ja, dies ist unter FreePascal der Grundsyntax, falls dies deine Frage im Kontext sein sollte.

Klaus S. schrieb:

Und zwei Bias-Widerstände sowie mindestens ein Abschlußwiderstand verbaut sein. Es soll Intelligenzler geben, die das nicht auf dem Schirm haben.

Der Umsetzer aus dem Link hat zumindest diese, aber ich hab vorsorglich noch mal welche Spendiert.

Nach Reduzierung der Baudrate auf 9600 konnte ich erst mal den Datensalat um 90% reduzieren. Nochmal 0K120 suchen und schauen, wie es dann ausschaut.

Auch die SUART werd ich nochmal testen, Vielleicht kann ich damit den RS485 sparen.

#7668348
Lesenswert?

Ja, dies ist unter FreePascal der Grundsyntax, falls dies deine Frage im Kontext sein sollte.

"Die Syntax war dem Sterben nah ..." - auch unter Pascal ist Ihre Antwort wohl nicht richtig.

PS: ... was nichts mit der Syntax zu tun hat.

Aber ein Gedicht, an diesem Pfingstmontagmorgen ...

PPS: Und falls sich jemand für KLENs Vorlage interessiert: https://www.signaturen-magazin.de/christian-morgenstern--die-luft.html

Angehängte Dateien:
Moderator (Firma: Titel) Persönliche Seite #7668393
Lesenswert?

Maik G. schrieb:

S. L. schrieb:

PORTB := PORTB or (0 shl RS_485_IO);

Soll dies Pin RS_485_IO auf Null setzen?

Ja, dies ist unter FreePascal der Grundsyntax

Ich meine, dass ein verodern mit 0 unabhängig von der Programmiersprache genau gar nichts bewirken sollte.

werd ich wohl einen anderen USB-RS485-Umsetzers suchen müssen, da meiner nur A und B als Output hat.

Ja, diese Mistdinger musst du aufmachen und den GND extra anlöten. Denn auch wenn manche den RS485 auch ohne GND irgendwie zum Laufen bekommen: prinzipiell braucht der den GND, denn die Einzelsignale A und B sind auf GND bezogen. Lediglich die zu übertragende Information steckt in der Differenz zwischen A und B.

#7668402
Lesenswert?

Maik G. schrieb:

PORTB := PORTB or (0 shl RS_485_IO);

Soll dies Pin RS_485_IO auf Null setzen?

Ja, dies ist unter FreePascal der Grundsyntax, falls dies deine Frage im Kontext sein sollte.

Oje.

Ja, Masse muss verbunden sein, damit die Pegel auf den Leitungen im Toleranzbereich liegen.

Es muss nicht die perfekte Masse sein, Spannungsabfall auf Grund Leitungslänge ist also erlaubt, auch Sender und Empfänger jeweils mit Masse an PE Schutzleiter ist ausreichend um sich das dritte Kabel sparen zu können.

Maik G. schrieb:

Da werd ich wohl einen anderen USB-RS485-Umsetzers suchen müssen, da meiner nur A und B als Output hat.

Auch dein Chip bzw. Board hat GND.

#7668429
Lesenswert?

den PE als Signal-Gnd zu verwenden ist das dümmste was man machen kann : PE ist PE. Signal-Gnd ist Signal-Gnd.

ich durfte jährlich eine Handvoll Treiber wechseln, weil der Server und die Terminals GND mäßig auf PE lagen. War RS422, aber das ist ja das Gleiche.

Ludger

#7668472
Lesenswert?

Ludger schrieb:

den PE als Signal-Gnd zu verwenden ist das dümmste was man machen kann

+1.

Hilft halt nix, wenn man so einen 1,50€ RS485-USB-Stöpsel von Aliexpress hat der nur A+B rausführt, und Signal-GND indirekt über USB->PC-Netzteil auf PE liegen hat...

Die andere Seite hat dann am Ende ein Steckernetzteil ohne PE, mit Signal-GND schön auf 120V Wechselspannung... Gut, die sind nicht Belastbar, die Bias-Widerstände ziehen das schon passend zurecht...

Funktionieren tut vieles was außerhalb der Spec ist, aber wenn's dann klemmt hat man viel Spaß mit der Fehlersuche... Klassiker: Mit Oszi dran klappt es plötzlich. Ja. Das stellt nochmal eine GND-PE Verbindung her.

Moderator (Firma: Titel) Persönliche Seite #7670665
Lesenswert?

Anselm 6. schrieb:

RS485 ist ein Differenzieller Bus ohne GND Bezug. Du brauchst nur A/B

Das ist leider nur die Theorie. Die Praxis sieht so aus, dass jeder Empfänger und jeder Sender sein Datenblatt auf seinen GND bezieht. Und deshalb muss man natürlich den GND mit verbinden. Nur Hasardeure tun das nicht.

dass RS485 kein Bidirektionaler Bus ist

Doch, natürlich, und genau deshalb muss man die Richtung umschalten. Nur bei einem unidirektionalen (RS232, RS422, SPI) oder einem passiven Bus (I2C oder CAN) muss man die Richtung nicht umschalten.

Was du eigentlich meinst, nennt sich Full- bzw. Halfduplex. Und da ist RS232 Fullduplex (beide Teilnehmer können gleichzeitig in beide Richtungen übertragen) und RS458 Halfduplex (nur 1 Teilnehmer darf senden).

Bitte keine halbgaren Halbwahrheiten verbreiten. Einfach mal lesen, was die Hersteller in ihren Appnotes zu dem Thema so schreiben. Und wie die Schaltpläne und Spezifikationen in den Datenblättern aussehen.

Dort haben wir das mal wieder (zum wiederholten Mal) ausgekaspert:

Und speziell dort habe ich die chinesischen USB-RS485-Wandler noch angesprochen:

#7670673
Lesenswert?

Lothar M. schrieb:

Doch, natürlich, und genau deshalb muss man die Richtung umschalten. Nur bei einem unidirektionalen (RS232, RS422, SPI) oder einem passiven Bus (I2C oder CAN) muss man die Richtung nicht umschalten.

Jein, RS485 gibt es als Halb- und Vollduplex-Bus. Die Vollduplex-Version hat aber vier Datenleitung und nur einen Master; der Balbduplex-Bus ist mulitmasterfähig und braucht nur zwei Leitungen. Den Vollduplexbus habe ich aber noch nie in Betrieb gesehen.

Anselm 6. schrieb:

RS485 ist ein Differenzieller Bus ohne GND Bezug. Du brauchst nur A/B

Das kommt wohl aus der (professionellen, analogen) Audio-Technik, wo asymetrische Signale in symmetrische mit Hilfe von Audioübertragern gewandelt werden. Da braucht man man GND nicht unbedingt, weil es dadurch auch zu Brummschleifen kommen kann. Umgekehrt kann man die Signale auch so umwandeln.

#7670726
Lesenswert?

Anselm 6. schrieb:

RS485 ist ein Differenzieller Bus ohne GND Bezug. Du brauchst nur A/B

Nein, du musst zusätzlich sicher stellen, dass A und B innerhalb des zulässigen Bereichs liegen. Beim MAX485 ist unter Absolute Maximum Ratings z.B. nachzulesen: "Receiver Input Voltage (A, B).......-8V to +12.5V"

Alleine schon, damit diese Spannung überhaupt definiert ist, ist ein Gnd-Bezug zwischen Sender und Empfänger erforderlich, den man besser nicht dem Zufall überlässt.

#7670753
Lesenswert?

Harald K. schrieb:

Rahul D. schrieb:

Jein, RS485 gibt es als Halb- und Vollduplex-Bus. Die Vollduplex-Version hat aber vier Datenleitung und nur einen Master;

Die heißt dann aber nicht RS485, sondern RS422.

Nein, RS422 ist symmetrisches RS232: Für jede Richtung ein Leitungspaar. Vollduplex RS485 hat einen Master, der von allen Slaves empfangen wird. De Antwort erfolgt auf einem weiteren Leiterpaar, das an den Ausgängen aller Slaves hängt: https://knowledge.ni.com/KnowledgeArticleDetails?id=kA00Z0000019M21SAE&l=ja-JP

Dieser Bus ist extrem selten.

(Firma: 1984now) #7670908
Lesenswert?

Rahul D. schrieb:

Nein, RS422 ist symmetrisches RS232: Für jede Richtung ein Leitungspaar. Vollduplex RS485 hat einen Master, der von allen Slaves empfangen wird. De Antwort erfolgt auf einem weiteren Leiterpaar, das an den Ausgängen aller Slaves hängt

Unsinn.

Was du da beschreibst, IST RS422. Signalmäßig (pro Richtung) identisch mit RS485. Der Unterschied halt einzig, dass es für die Richtung Slave->Master ein zusätzliches Leitungspaar gibt und damit die Richtungsumschaltung für das eine Leitungspaar von RS485 für alle Peers am Bus entfallen kann.

https://knowledge.ni.com/KnowledgeArticleDetails?id=kA00Z0000019M21SAE&l=ja-JP

Dieser Bus ist extrem selten.

Was da steht, beschreibt auch nur RS422. Wenn auch stark verkürzt. sieht irgendwie nicht nach einem Standard aus, sondern nach einer Art Gedächtnisstütze für unfähige Programmierer. Und zwar nach einer sehr schlecht geschriebenen. Dagegen sind ja sogar die Standards wirklich gut verständlich. Du solltest die Quellen für deine eigene Aufschlauung weiser wählen...

#7671052
Lesenswert?

Ob S. schrieb:

Du solltest die Quellen für deine eigene Aufschlauung weiser wählen...

Wozu? Wenn das Bild schon alles aussagt?

RS422: https://de.wikipedia.org/wiki/EIA-422 Nur zwei "Peers" (Nix multimasaterfähig).

RS485-2-Wire: Mehrere gleichberechtigtigte "Peers" / Master. RS485-4-Wire: Ein Master, viele Slaves. https://de.wikipedia.org/wiki/EIA-485

RS422 hat doch gar nicht die Möglichkeit eines Busses, da die Ausgänge der Transceiver nicht hochohmig schaltbar sind.

Moderator (Firma: Titel) Persönliche Seite #7671127
Lesenswert?

Rahul D. schrieb:

Vollduplex RS485 hat einen Master, der von allen Slaves empfangen wird. De Antwort erfolgt auf einem weiteren Leiterpaar, das an den Ausgängen aller Slaves hängt

Ist das eine Art "Zweidrittelduplex" oder "Einundfünzighundertstelduplex"? Denn bei 100 Teilnehmern kann ja auch nur jeweils 1 der Teilnehmer auf jeweils 1 der 2 RS485-Adrenpaare senden. Also ist es garantiert nicht Vollduplex im Sinne von "jeder kann jederzeit an den anderen was senden".

https://knowledge.ni.com/KnowledgeArticleDetails?id=kA00Z0000019M21SAE&l=ja-JP

Das, was da im Bild https://knowledge.ni.com/servlet/rtaImage?eid=ka03q0000012koN&feoid=00N0Z00000HEWRt&refid=0EM3q0000030QRj zu sehen ist, sind im Grunde 2 Interfaces:

  1. oben: vom Master zu den Slaves besteht eine RS422 Multidrop Verbindung.
  2. unten: der Rückweg von den Slaves zum Master ist ein üblicher RS485 Bus.

Dieser Bus ist extrem selten.

Ja, sieht wie eine kundesspezifische Fehlgeburt oder ein Workaround für ein spezielles Problem aus.

#7671132
Lesenswert?

Lothar M. schrieb:

Ist das eine Art "Zweidrittelduplex" oder "Einundfünzighundertstelduplex"? Denn bei 100 Teilnehmern kann ja auch nur jeweils 1 der Teilnehmer auf jeweils 1 der 2 RS485-Adrenpaare senden. Also ist es garantiert nicht Vollduplex im Sinne von "jeder kann jederzeit an den anderen was senden".

Vollduplex im Sinne, dass Master und Slave gleichzeitig senden können.

Langsam bereue ich, dass ich das Thema angeschnitten habe. Bei den vielen Besserwisser hier...

Moderator (Firma: Titel) Persönliche Seite #7671147
Lesenswert?

Rahul D. schrieb:

Vollduplex im Sinne, dass Master und Slave gleichzeitig senden können.

... ein Slave ...

Der Witz ist eben, dass es ein "Master" und "Slave" beim RS485 eigentlich nicht gibt:

Das "Master-Slave-Konzept" ist erst dann nötig, wenn Software ins Spiel kommt und mehrere Teilnehmer auf den Bus zugreifen wollen. Und auch dann muss es beim RS485 keinen "Master" im Sinne von "das hier ist die Baugruppe, die den Zugriff auf den Bus regelt" geben. Es kann z.B. auch ein Token-basierter Bus sein. Dann ist immer das Gerät der "Master", das gerade den Token hat.

Langsam bereue ich, dass ich das Thema angeschnitten habe.

Richtig, diese "Nebendiskussion" ist für das Problem des TO eigentlich nicht relevant. Aber der scheint sowieso anderweitig beschäftigt zu sein.

Bei den vielen Besserwisser hier...

Ach geh, so dünnhäutig?

Antwort schreiben

Bitte melde dich an, um einen Beitrag zu schreiben.

oder

Mit Google-Account einloggen

Die Registrierung ist kostenlos und dauert nur eine Minute.

Jetzt registrieren