'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
|