Forum: Mikrocontroller und Digitale Elektronik Störungen auf einer RS485 Übertragung


von Markus B. (up_marki)


Angehängte Dateien:

Lesenswert?

Hallo zusammen

Ich habe ein xmega-board von Atmel. Dies liest mir 1-Wire 
Temperatursensoren aus und gibt sie dann über RS485 (LTC1480) an eine 
SPS weiter. Siehe Schaltplan.

Nun mein Problem:
Die Daten in der SPS kommen nur teilweise korrekt an. Falsche Zeichen.

Das interessante daran, ich habe zwei Atmel-boards (Probe mit nur einem, 
nicht gleichzeitig beide), beim einen kommen die Daten richtig an. Beim 
anderen nur teilweise und weiter komisch - wenn ich bei dem "Nicht 
korrekten Board" mit dem Multimeter über den RS485 zwischen A und B 
Spannung messe, dann kommen die Daten richtig. Multimeter weg --> Daten 
wieder falsch.

Ich vermute mein Problem mit nicht korrekter Hardware, vorallem auf der 
RS485 Leitung. Entstörung notwendig ???
Oder Board defekt, oder die FUSE-Bits nicht korrekt Taktfrequenz? (habe 
ich zwar verlichen) oder habe ich welche übersehen?


Ein paar hoffentlich wichtige Infos:
- das ganze läuft mit einer Baudrate von 9600 (sollte doch nicht heikel 
sein?)
- RS485 -  als Subprint auf Atmelboard mit gelöteter Lochkarte gesteckt
- Leitungen RS485 wie im Schema beidseitig mit 120 Ohm abgeschlossen 
(auch schon verschiedenes probiert)
- Leitungen kürzer als 2 Meter

Was ich schon gesehen habe, dass zwischen VCC und A und B und GND je ein 
560 Ohm Widerstand drin ist. Macht das Sinn?
Habe ich auch probiert, hat mal bisschen besser funktioniert aber nicht 
wirklich die Lösung.

Vielen Dank für Euere Tips und Hinweise.

Viele Grüsse

Marki

: Bearbeitet durch User
von Lothar M. (Firma: Titel) (lkmiller) (Moderator) Benutzerseite


Lesenswert?

Markus B. schrieb:
> Siehe Schaltplan.
Wie sind die "Massen" der Teilnehmer miteinander verbunden? So wie es 
gezeichnet ist, ist das Ganze irgendwie potentialfrei...

Und wenn die "Massen" miteinander verbunden sind: gibt es da irgenwelche 
Ausgleichströme?

: Bearbeitet durch Moderator
von Volker B. (Firma: L-E-A) (vobs)


Lesenswert?

Masseverbindung zwischen SPS und Controller existiert?

Grüßle,
Volker.

von Jim M. (turboj)


Lesenswert?

Masseverbindung? Busvorspannung beim RS485 vorhanden?

von Markus B. (up_marki)


Lesenswert?

Lothar M. schrieb:
> Und wenn die "Massen" miteinander verbunden sind: gibt es da irgenwelche
> Ausgleichströme?

Hallo
Habe mal die Massen verbunden. Keine Besserung.
Ausgleichströme? Wenn ich ein Multimeter in die Ausgleichsleitung hänge, 
messe ich 115uA DC, und 25uA AC (True RMS). Das sagt mir jetzt gar 
nichts aus. Dir/Euch schon?

Danke und Gruss
Marki

von A. S. (Gast)


Lesenswert?

Wenn ein Board funktioniert, dann kannst Du doch
- beide vergleichen
- kreuztesten
- die Reserven des guten herausfinden (z.B. a) 120R entfernen, b) auf 
50R absenken, sollte trotzdem funktionieren, ebenso bei 100m Leitung)

Wenn der eine satt funktioniert, der andere nicht, dann ist einer 
defekt. Wenn der gute bei leichten Störungen auch nicht läuft, gibt es 
einen gravierenden Fehler, z.B. die Baudrate (falscher Teiler und 
dadurch 3% Versatz).

Oder einfach irgendwo ein Oszi ausleihen, dann hat alle Spekulation ein 
Ende

von Markus B. (up_marki)


Lesenswert?

Hallo
Danke noch mal allen schreibern.

Habe noch mal einiges probiert vor allem mit GND-Verbindung und 
korrektes Erden der SPS (da Testaufbau war das nicht richtig) Aber alles 
hilft nichts.

In etwa so sieht ein fehlerhafter String in der SPS aus:
'I$02’8 ²E $02‚0 ‚ 0$02D 0L‚$02= $0217I$02’8 (

... und so ein Korrekter.
'ID: 28 56 6E 29 00 00 00 D2 T: 0112 =   17.1C;'

Folgende Sachen verstehe ich nicht:
Bei zwei verschiedenen uC Boards funktioniert es beim einen einwandfrei 
beim anderen nicht. (SPS und Tochterplatine auf uP mit RS485-Komponenten 
immer die selbe).
Wenn ich beim nicht funktionierenden mit einem RS485-USB-Konveter 
parallel die Daten abgreife, zeigt der USB-Konverter die Daten korrekt 
an, während in der SPS die falschen ankommen.

Der eine oder andere denkt jetzt vielleicht, nimm doch das Board welches 
funktioniert und gut.
Ja - aber da habe ich ein schlechtes Gewissen, dass das Funktionierende 
plötzlich auf Grund von Störungen auch nicht mehr geht.

Der ganze Aufbau soll mir schon dauerhaft zuverlässige Temperaturen für 
Raumklimasteuerung liefern.

Die Signale auf dem Bus A/B habe ich mal mit Oszi angesehen. Könnte 
nichts negatives feststellen und auch keine Unterschied zwischen den 
beiden Boards.

Vielleicht habt ihr noch weiter gute Ideen was ich testen kann.

Meine Frage weiter oben bleibt offen. Was meint Jim Meba mit 
"Busvorspannung"?

Wünsche ein frohes Wochenende!

Gruss Marki

von Frank (Gast)


Lesenswert?

Markus B. schrieb:
> Meine Frage weiter oben bleibt offen. Was meint Jim Meba mit
> "Busvorspannung"?

Er meint wahrscheinlich die Fail-Safe Schaltung die du selbst weiter 
oben beschrieben hast mit den 560 Ohm Widerständen.

Was für RS485 Tranceiver haben denn beide Boards? Mit was für Spannungen 
werden die betrieben? 3V3 oder 5V?

Masse wurde ja schon ausreichend erwähnt.

Twisted Pair Leitungen verwendet?
Schirmung ordentlich aufgelegt?

Stimmt bei beiden Boards die Baudrate korrekt!?

von Andi B. (andi_b2)


Lesenswert?

Ungenaue Baudrate ev. vom internen RC Oszillator erzeugt? Oder nimmst du 
den Takt vom Quarz? Und hast du das Timing auch exakt nachgemessen? 
Teiler falsch?

von Ruediger A. (Firma: keine) (rac)


Lesenswert?

Kannst Du ein Oszillogramm auf dem Bus vergleichend aufnehmen?

von Forist (Gast)


Lesenswert?

Frank schrieb:
> Mit was für Spannungen werden die betrieben? 3V3 oder 5V?

Guckst du hier:

Markus B. schrieb:
> RS485_1.png

von Markus B. (up_marki)


Lesenswert?

Forist schrieb:
> Frank schrieb:
>> Mit was für Spannungen werden die betrieben? 3V3 oder 5V?
>
> Guckst du hier:
>
> Markus B. schrieb:
>> RS485_1.png

:-) jaa - genau guckst Du in meine Schema, am Anfang des Beitrages, da 
steht drin, dass es sich um den LTC1480 handelt welcher mit 3,3 Volt 
betrieben wird.

Was ich ergänzt habe ist der Common, sprich GND - GND Verbindung SPS - 
uP

Grüsse
Marki

: Bearbeitet durch User
von Markus B. (up_marki)


Lesenswert?

Hallo an alle Helfer, Danke!

Dieser Meinung bin ich auch langsam, dass was mit dem Timing nicht 
stimmt. Unterschied zwischen den beiden Boards.

Leider hatte ich fast keine Zeit mehr um weiter zu suchen.

Was ich gemacht habe: in der main_loop alles auskommentiert und nur ein 
Pin welcher somit mit maximaler Frequenz toggelt. Dabei habe ich einen 
Unterschied von Board 1 zu Board 2 von etwa 0.2us gemessen, dass sollte 
nicht das Problem sein? Oder?

Weiss aber grade nicht wie meine Baudrate gemacht wird. Habe da "alten 
Code" verwendet.

Denke mir, dass ich ein Register welches in diesem Zusammenhang relevant 
ist nicht schreibe. So dass es beim einen Board passt bei anderen nicht.

Oder eben der Oszillator.


Hier mal die Initialisierungsroutine des USART, vielleicht erkennt hier 
jemand gerade ein Fehler.

Sollbaudrate: 9600, Prozessortakt 2MHz, ein Quarz auf dem Board 32768??? 
Wohl für Uhrfunktionen gedacht.

1
void usart_init(void)
2
{
3
  /* This PORT setting is only valid to USARTC0 if other USARTs is used a
4
   * different PORT and/or pins is used. */
5
  /* PIN3 (TXD0) as output. */
6
  USART_IO_PORT.DIRSET = USART_TxD_PIN_m;
7
8
  /* PC2 (RXD0) as input. */
9
  USART_IO_PORT.DIRCLR = USART_RxD_PIN_m;
10
11
  /* USARTC0, 8 Data bits, No Parity, 1 Stop bit. */
12
  USART_Format_Set(&USART, USART_CHSIZE_8BIT_gc, USART_PMODE_DISABLED_gc, false);
13
14
  /* Set Baudrate to 9600 bps:
15
   * Use the default I/O clock fequency that is 2 MHz.
16
   * Do not use the baudrate scale factor
17
   *
18
   * Baudrate select = (1/(16*(((I/O clock frequency)/Baudrate)-1)
19
   *                 = 12
20
   */
21
  USART_Baudrate_Set(&USART, 12 , 0);

Muss mal die Datenblätter des Bord's und Prozessors studieren.
(Bord: Atmel XMEGA-A3BU-XPlained)

Wünsche euch viel frohes
up_Marki

: Bearbeitet durch User
von Markus B. (up_marki)


Lesenswert?

Ruediger A. schrieb:
> Kannst Du ein Oszillogramm auf dem Bus vergleichend aufnehmen?

Hallo Ruediger

Habs schon mal angeschaut, aber habe mit dem Triggern Probleme, und die 
Daten sind auch immer unterschiedlich.

Werd wohl mal immer den selben String/Char schicken und dann probieren 
zu Oszilloskopieren.

Gruss
Markus

von Cyborg (Gast)


Lesenswert?

Markus B. schrieb:
> Die Daten in der SPS kommen nur teilweise korrekt an. Falsche Zeichen.

Ich würde mal die Forensuche benutzen, denn das Problem gabs schon
öfters. Was deiner Schaltung leider nicht zu entnehmen ist, ist
die Versorgung. Die muss erst mal vervollständigt werden und zwar
ALLES.

von Markus B. (up_marki)


Lesenswert?

... sorry hier noch weiterer Code der Schnittstelle:
1
#define USART_Format_Set(_usart, _charSize, _parityMode, _twoStopBits)(_usart)->CTRLC = (uint8_t) _charSize | _parityMode | (_twoStopBits ? USART_SBMODE_bm : 0)
2
#define USART_Baudrate_Set(_usart, _bselValue, _bScaleFactor)(_usart)->BAUDCTRLA =(uint8_t)_bselValue; (_usart)->BAUDCTRLB =(_bScaleFactor << USART_BSCALE0_bp)|(_bselValue >> 8)

und diesen hier...

1
* usart_func.h
2
3
4
#ifndef USART_FUNC_H_
5
#define USART_FUNC_H_
6
7
#include "avr_compiler.h"
8
9
#define USART      USARTC0    // USART PORT number
10
#define USART_IO_PORT    PORTC    // USART PORT
11
#define USART_RxD_PIN_m    PIN2_bm    // USART RxD PIN mask
12
#define USART_TxD_PIN_m    PIN3_bm    // USART TxD PIN mask
13
14
void usart_init(void);
15
void usart_enab(void);
16
void usart_disab(void);
17
void usart_send_byte(int8_t b);
18
void usart_send_string(char *s);
19
20
#endif /* USART_FUNC_H_ */

von Cyborg (Gast)


Lesenswert?

Mir ist an deiner Schaltung aufgefallen, dass du direkt auf eine SPS
gehst. Hat die denn einen Empfängerbaustein für RS485? Schon mal
die Typical Applikation vom LTC 1480 Datenblatt angeschaut, wie
so eine Datenschnittstelle aussehen muss?

von Markus B. (up_marki)


Lesenswert?

Cyborg schrieb:
> Mir ist an deiner Schaltung aufgefallen, dass du direkt auf eine SPS
> gehst. Hat die denn einen Empfängerbaustein für RS485? Schon mal
> die Typical Applikation vom LTC 1480 Datenblatt angeschaut, wie
> so eine Datenschnittstelle aussehen muss?

Hallo Cyborg

Danke für die Info.
Genau - mein Schema entstand aus der "Typical Application" aus dem 
Datenblatt. Wobei mein Slave eben die SPS ist und nicht ein zweiter 
LTC1480. Die SPS ist eine WAGO mit extra RS232/RS485 Karte Art.Nr. 
750-653/003

Was ich nicht habe, ist Datenflusscontrolle und Adressierung. Der 
uController "blappert" einfach vor sich hin und die SPS hört zu.

Denke wenn ich hier ein Problem hätte, würde es nicht bei einem 
Controllerboard gehen und beim anderen nicht.
Auch mal erwähnt, bei dem Board bei welchem es nicht geht, ist Nagelneu 
aus Verpackung. Das welches geht, hat schon einige Tests hinter sich. 
Also müsste quasi ein Produktionsfehler vorliegen. (Auf ESD achte ich so 
gut als möglich.) Da ich schon mal deswegen ein uP-Board in den Himmel 
gejagt habe...

Allen einen guten Tag.

Marki

: Bearbeitet durch User
von Ruediger A. (Firma: keine) (rac)


Lesenswert?

Hallo,

der typische Ausschlusstest (wenn möglich) besteht darin, stückweise 
Komponenten gegeneinander auszuwechseln und zu gucken, mit welchem Teil 
das Problem wandert, ist das von den boards her möglich?

von Marco H. (damarco)


Lesenswert?

Wirklich sicher das die SPS die Datenrichtung nicht plötzlich umdreht ? 
Durch Ungereimtheiten wer wann senden darf entsteht der meiste Quark.

von Markus B. (up_marki)


Lesenswert?

Marco H. schrieb:
> Wirklich sicher das die SPS die Datenrichtung nicht plötzlich umdreht ?
> Durch Ungereimtheiten wer wann senden darf entsteht der meiste Quark.

Hhmm sicher ist nur der Tod ;-)
Aber die SPS Karte ist eine Vollduplex RS485 und ich habe nur RX 
angeschlossen, des weiteren sendet mein SPS-Programm auch keine Daten...

Darum denke ich nicht, dass das ein Problem ist. Aber werd das nochmal 
checken...

Vielen Dank für den Hinweis!

Gruss
Marki

von Markus B. (up_marki)


Lesenswert?

Hallo zusammen

Irgend etwas ist hier im Thread komisch...

Sven K. hat eine Antwort geschrieben, welche hier nicht angezeigt wird. 
Trotzdem konnte ich sie einmal lesen. Ist da eine Verzögerung oder hat 
er sie gelöscht???

Auf jedenfall...

> USART_Baudrate_Set(&USART, 12 , 0);

Sven meinte für 9600 Baud muss ich anstatt 12 die 13 einsetzen. Gesagt, 
getan und siehe da, es sieht ganz gut aus.

Jedenfalls hat Sven wohl den Fehler gefunden. Ich werd's nochmal mit 
Datenblätter prüfen. Und falls korrekt überdenken, wieso ich auf 12 
gekommen bin.

Es funktioniert jetzt bei beiden Board's war wohl beim einen knapp an 
der Funktionsgrenze und beim anderen daneben.

Melde mich dann nochmal...

Danke schon mal an alle.

Marki

von Sven K. (svenk)


Lesenswert?

Hallo Markus,

ja ich hatte es berechnet - aber wieder verworfen - weil ich dachte Du 
hast das bestimmt schon 10mal geprüft und ich mich verrechnet.

Wenn man auf die schnelle hier die Werte eingibt - solltest Du 
vielleicht besser den Error näher an 0% bringen ;-)
Das wird wahrscheinlich für zu viel Abweichung sorgen und dann kommt 
Müll an.

http://www.dolman-wim.nl/xmega/tools/baudratecalculator/index.php

Gruß Sven

: Bearbeitet durch User
von Markus B. (up_marki)


Lesenswert?

Hallo Sven

Sven K. schrieb:
> ja ich hatte es berechnet - aber wieder verworfen - weil ich dachte Du
> hast das bestimmt schon 10mal geprüft und ich mich verrechnet.
...das hatte ich als letztes vermutet, weil ich eine andere Anwendung 
habe mit dem es so lief. Und diese habe ich vor fast zwei Jahren 
erstellt. War wohl auch an der Grenze.

> Wenn man auf die schnelle hier die Werte eingibt - solltest Du
> vielleicht besser den Error näher an 0% bringen ;-)
> Das wird wahrscheinlich für zu viel Abweichung sorgen und dann kommt
> Müll an.
Da wirst Du recht haben. Gehe dem nochmal nach, sobald ich etwas Zeit 
habe.


> http://www.dolman-wim.nl/xmega/tools/baudratecalculator/index.php
Schönes Tool, rechnet es auch richtig? Wenn ich mich richtig Erinnere 
habe ich das vor zwei Jahren auch mit so einem Tool berechnet. War wohl 
falsch?!

Ziehe mir dann noch die Datenblätter rein. Die sollten nicht lügen...

Danke und Viel Frohes

Marki

von Markus B. (up_marki)


Lesenswert?

Hallo nochmal an alle.

Habe nochmal geprüft, experimentiert, gerechnet und Datenblätter 
studiert. Durch eine bessere Wahl der USART-Parameter BSEL= 1539 und 
BSCALE=-7 habe ich den kleinsten Fehler, das funktioniert dann auch bei 
beiden Boards prima.

Vielleicht noch für jemanden der die Schaltung nachbaut diese 
funktioniert bei mir einwandfrei. (Nur kurze Leitungen). Habe aber noch 
den GND des uC mit der SPS verbunden.

Habe über GND-Verbindung gerade in einen anderen Beitrag gelesen. Der 
hat mich eher verwirrte als er mich schlau machte. Die Meinungen gehen 
auseinander ob GND-Verbindung ja od. nein. Mir gefallen die Argumente 
für eine Verbindung, deshalb ist sie bei mir jetzt drin.

War auch immer davon ausgegangen, dass es keine GND-Verbindung braucht. 
Hat in der Praxis funktioniert. Aber vielleicht war da trotzdem eine 
"unbewusste" Masse vorhanden.

Viele Grüsse
Marki

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.