Forum: Mikrocontroller und Digitale Elektronik RS-485-Bus produziert bei Leitungsverlängerung nur noch Datenmüll


von Michael M. (mima)


Lesenswert?

'zusammen,
ich habe Probleme bei folgendem Szenario: Ein Atmega 8 soll als 
"Außeneinheit" Daten sammeln und auf Abfrage (die Inneneinheit sendet 
ein "w", dann Antwort) über einen RS-485-Bus (auf beiden Seiten 
MAX485ECPA, 9600 Baud) an eine Inneneinheit (Atmega 644) liefern. Der 
Bus ist an beiden Seiten mit je 120 Ohm terminiert (direkt am MAX485), 
weitere Verbindungen der beiden Busleitungen (Pull-Ups/-Downs o.Ä.) 
bestehen nicht. Auf meinem Schreibtisch liegend mit ca. 25 cm Litze 
zwischen beiden Einheiten funktionierte soweit alles problemlos und 
stabil über mehrere Tage. Dann habe ich die Außeneinheit an ihren 
Bestimmungsort verbracht, nun sind aus den 25 cm Testlitze ca. 60m 
Twisted-Pair-Adern geworden (die ersten ca. 40m in Cat7-Leitung, dann 
20m Cat5E). In diesem Kabel läuft nur die Versorgungsspannung für die 
Außeneinheit (12 Volt DC auf der orange/weißen) und die RS-485-Leitung 
halt (auf blau/weiß), sonst nichts. Ab diesem Moment jedenfalls 
funktioniert es nicht mehr, ich habe mir testweise (Bascom-Code siehe 
unten) das, was über den Bus ankommt, auf dem LC-Display visualisieren 
lassen bzw. den Bus mit dem Oszi (kein Speicheroszilloskop leider) 
überwacht.
Es sieht so aus, dass das "Abfrage-w" von der Außeneinheit erkannt wird, 
diese dann auch auf Sendung geht und ihre Daten sendet, diese kommen 
innen aber als relativer Datenmüll an. Es handelt sich um 
Semikolon-separierte Zahlenwerte, zwischendrin lassen sich einige 
Ziffern und auch mal Semikolon erkennen, ansonsten so ziemlich alles, 
was der Zeichensatz zu bieten hat. Sende ich kein w, bleibt alles stumm, 
ich denke also, lediglich beim Empfangen oder Senden der Rückantwort von 
der Außeneinheit besteht ein Problem.

Any ideas? ;-)
Ich hatte mal testweise versucht (weil ich es an einigen Stellen im 
Internet gesehen habe, nicht im Datenblatt des Max485 allerdings), eine 
Ader des Busses über 1kOhm an Plus und die andere über 1 kOhm an Minus 
zu legen, bringt aber keine Besserung.



Hier noch zweimal der Programmcode:


Außeneinheit:
1
$regfile = "m8def.dat"
2
3
$crystal = 8000000
4
5
Config 1wire = Portb.1
6
7
8
$baud = 9600
9
$hwstack = 32
10
$swstack = 10
11
12
$framesize = 40
13
14
15
16
On Urxc Rx_cmd
17
18
Enable Urxc
19
20
Enable Interrupts
21
22
23
Dim Readbus As String * 1
24
25
Readbus = ""
26
27
Bus_tx Alias Portb.2
28
29
Config Bus_tx = Output
30
31
Bus_tx = 0
32
33
34
Dim Ausgabe As String * 100
35
36
Ausgabe = ""
37
38
39
40
Do
41
42
43
'...weiterer, als funktionell getesteter Programmcode, der u.A. den String Ausgabe zusammensetzt
44
45
46
   While Readbus = "" And Laeufe < 200
47
48
      Laeufe = Laeufe + 1
49
50
      Waitms 10
51
52
   Wend
53
54
   Laeufe = 0  'so etwas wie Wait 2, allerdings wird kürzer gewartet wenn über den Bus der Befehl, etwas zu senden ("w") kam
55
56
57
58
   If Readbus = "w" Then
59
60
      Disable Urxc
61
62
      Bus_tx = 1
63
64
      Waitus 40
65
66
      Print Ausgabe
67
68
      Bus_tx = 0
69
70
      Readbus = ""
71
72
      Enable Urxc
73
74
   End If
75
76
   Readbus = ""
77
78
79
Loop
80
81
82
End
83
84
85
86
Rx_cmd:
87
88
   If Usr.rxc = 1 And Udr = 119 Then Readbus = "w"
89
90
Return



Inneneinheit:
1
$regfile = "m644def.dat"
2
3
$baud = 9600
4
5
$crystal = 16000000
6
7
$hwstack = 300
8
9
$swstack = 400
10
11
$framesize = 400
12
13
14
15
On Urxc Serrut
16
17
Enable Urxc
18
19
Enable Interrupts
20
21
22
23
Bus_tx Alias Portd.2
24
25
Config Bus_tx = Output
26
27
Bus_tx = 0
28
29
30
Dim Readbus As String * 30
31
32
Readbus = ""
33
34
35
Dim Lauf As Word
36
37
Lauf = 0
38
39
40
Dim Rxbs As Word
41
42
Rxbs = 0
43
44
45
Config Lcdpin = Pin , Db4 = Portb.3 , Db5 = Portb.4 , Db6 = Porta.0 , Db7 = Porta.1 , E = Portb.2 , Rs = Portb.1
46
47
Config Lcd = 20 * 2
48
49
Cursor Off
50
51
Cls
52
53
54
55
Do
56
57
   Readbus = ""
58
59
   Bus_tx = 1
60
61
   Waitus 40
62
63
   Print "w"
64
65
   Bus_tx = 0
66
67
   Wait 5 'zum Testen willkürlich 5 Sekunden, vollkommen egal ;-)
68
69
   Locate 1, 1
70
   Lcd Readbus
71
72
73
Loop
74
75
76
77
Serrut:
78
79
   Dim Rxb As Byte
80
81
   Rxb = Inkey()
82
83
   Readbus = Readbus + Chr(rxb)
84
85
   Rxbs = Rxbs + 1
86
87
Return

von Purzel H. (hacky)


Lesenswert?

Der zu den Signalen gehoerende GND wurde auch durchgezogen und verbunden 
? Denn je nach Treiber ist der zulaessige Gleichtaktberein +-7V oder so. 
Wenn der velassen wird, ist Schluss mit richtigen Daten.

Also mach das mal.

von Michael M. (mima)


Lesenswert?

Hallo,

jop, Außen- und Inneneinheit hängen an denselben 12 VDC (jeweils über 
nen 7805, aber da sind die GND ja trotzdem alle durchverbunden).

von Purzel H. (hacky)


Lesenswert?

Dann muesste man mal mit einem Scope die Signale nachmessen.

von hans (Gast)


Lesenswert?

Hast du direkt an deine MAX Kondensatoren an der Versorgung?
Wenn nein dann nachrüsten.
Ein eigener 100 nF Keramik ist muß,
ein kleiner Tantal oder Elko (z.B. 2µ2) zusätzlich kann helfen.

Aber wirklich direkt am MAX, nicht irgendwo am Stabi im anderen
Leiterplatteneck.

hans

PS: Du hast doch hoffentlich Quarze als Taktgeber?

von Patrick (Gast)


Lesenswert?

Sollte bei 9600 Baud eigentlich unkritisch sein, aber: Wie ist die 
Verbindung zwischen Cat.5E und Cat.7 ausgefuehrt? (Stichwort: 
Reflexionen)

von Alexander S. (esko) Benutzerseite


Lesenswert?

Spendier dem Datenbus einen eigenen GND. Genug Adern hast du ja.
Ein Schaltplan wäre gut wenn man helfen soll.

von Michael M. (mima)


Lesenswert?

Danke erstmal für den vielen Input.

Um mal ein paar Sachen zu erschlagen: Ja, es werden Quarze benutzt (8 
MHz außen, 16 MHz innen)

Kondensatoren sind auch da, ich beschalte eigentlich immer wie in den 
Datenblättern empfohlen und sowohl am Atmega als auch am Max sitzen 
direkt an den Pinnen entsprechende 100nF nach GND zur Entstörung.

Ich habe das Netzwerkkabel nicht hf-mäßig bzgl. Reflektionen gemessen, 
erschien mir bislang etwas nach Overkill. Vielleicht geht es auch ohne 
;-)

Ich werde nochmal versuchen, die GNDs der MAX485 außen und innen direkt 
mit einer zusätzlichen Ader zu verbinden, kann aber noch etwas dauern, 
werde dann nachberichten.

Schaltplan liefer ich nach, existiert nur handgezeichnet und gerade kein 
Scanner da.

von Andreas V. (tico)


Lesenswert?

Prüf doch mal, ob beim Senden die Spannung am MAX485 der Außeneinheit 
einbricht. Eine kalte Lötstelle oder Kontaktprobleme beim Transport der 
Versorgungsspannung über das lange Kabel zur Außeneinheit könnten dafür 
die Ursache sein.

von MAX321 (Gast)


Lesenswert?

Ich hab' zwar keine konkrete Idee zur Fehlerursache, aber ich kann 
bestätigen, dass grundsätzlich Dein Aufbau funktionieren sollte. Ich 
habe hier problemlos Ähnliches im Einsatz: 2 bequarzte Mega32 bei 9k6 
und MAX485, Bus terminiert mit 120. Daten auf einem Aderpaar und ein 
Paar mit 9V, die vor Ort 78L05 werden. Hier liegen ca. 50m J-Y(ST)Y, die 
über eine CAT5- UP-Dose dann in ein CAT7-Patchkabel von nochmal 30m 
übergehen.
No Problems...

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.