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