Forum: Mikrocontroller und Digitale Elektronik Rs485 reagiert nicht auf Daten


von wmcneo (Gast)


Lesenswert?

Hallo,

ich versuche eine einfach Übertragung vom MC zum PC zu programmieren. 
Die RS485 auf meinem XMega128A1 wurde folgendermaßen initialisiert:

USART_PORT_485.DIRSET   = PIN3_bm;   // Pin 3 (TXD0) as output.
USART_PORT_485.DIRCLR   = PIN2_bm;   // Pin 2 (RXD0) as input.
USART_PORT_485.DIRSET   = PIN1_bm;   // Pin 1 (CLK) as output

USART_PORT_485.OUTSET = PIN1_bm;

// 8 Data bits, No Parity, 1 Stop bit, Asynchron
USART_485.CTRLC = (uint8_t) USART_CHSIZE_8BIT_gc | 
USART_PMODE_DISABLED_gc;

// f=2MHz
USART_485.BAUDCTRLA = 12;

USART_485.CTRLB |= USART_TXEN_bm;

Danach schreibe ich ein einfaches Zeichen und lese es am PC aus. Ich 
greife dazu direkt die beiden Pins für Rs485_A/B ab und leite sie über 
einen RS487-USB Wandler von Advantech (4561) zum PC weiter.

while( (USARTE0.STATUS & USART_DREIF_bm) == 0 ) {}
USART_485.DATA = 'H';

Es passiert gar nichts. Beim Debuggen sieht man, dass die Register 
gesetzt werden, jedoch wird trotz der Zuweisung zum DATA Register nichts 
in dieses geschrieben - was erklärt warum keine Zeichen am PC ankommen.

Ich weiß leider nicht weiter, bitte um Hilfe ;-)

lg

von ich (Gast)


Lesenswert?

>jedoch wird trotz der Zuweisung zum DATA Register nichts
>in dieses geschrieben

Woher weist du das? Wenn du dieses Register ausliest, liest du den 
Empfangspuffer.
Ein Schaltplan wäre überaus hilfreich.

Schaltest du den RS485 Tranceiver auch auf senden?

von ich (Gast)


Lesenswert?

Und was soll das hier?

>USART_PORT_485.DIRSET   = PIN1_bm;   // Pin 1 (CLK) as output

von Jan S. (jan_s)


Lesenswert?

wmcneo schrieb:
> Die RS485 auf meinem XMega128A1 wurde folgendermaßen initialisiert:
Wie meinst du das? Der XMega128A1 hat USARTs aber keine RS485 Treiber.
Du benötigst ein extra Treiber IC dafür.

von wmcneo (Gast)


Lesenswert?

Habe ein CrumbX256A1 Board mit Rs485 Treiber, auf diesem ist der MC 
verbaut.

Ich sehe mir das DATA Register im Debugger an, wenn ich zu der Zuweisung 
komme und diese ausführe, steht nichts im Register. Daher nehme ich an 
dass hier was nicht funktioniert.

lg

von Jan S. (jan_s)


Lesenswert?

Setzt du PE1 gemäß dem Schaltplan auf Hi-Pegel, um den Sender 
einzuschalten?

von ich (Gast)


Lesenswert?

Auf dem Board fehlt der 120 Ohm Abschlusswiderstand. Da du scheinbar mit 
2MBit fährst, könnte das eine Ursache sein

von Rufus Τ. F. (rufus) Benutzerseite


Lesenswert?

wmcneo schrieb:
> Ich sehe mir das DATA Register im Debugger an, wenn ich zu der Zuweisung
> komme und diese ausführe, steht nichts im Register. Daher nehme ich an
> dass hier was nicht funktioniert.

Hast Du Dir mal angesehen, wo die UART empfangene Daten ablegt?

Na, klingelt's?

von wmcneo (Gast)


Lesenswert?

Der Empfangsmodus ist ja deaktiviert, ich möchte lediglich senden. Somit 
sollte die UART ja keine Daten in dieses Register schreiben, oder ?

von wmcneo (Gast)


Lesenswert?

PE1 setze ich auf High-Pegel, jop.

von wmcneo (Gast)


Lesenswert?

Zur Info: Ich nutze auf den USART-USB um Kommandos vom PC zu schicken. 
Dies funktioniert einwandfrei. Lediglich das Rausschreiben auf den 
anderen USART funktioniert nicht.

von Rufus Τ. F. (rufus) Benutzerseite


Lesenswert?

wmcneo schrieb:
> Der Empfangsmodus ist ja deaktiviert, ich möchte lediglich senden. Somit
> sollte die UART ja keine Daten in dieses Register schreiben, oder ?

Wenn sie nichts empfängt, legt sie nichts dort ab. Richtig. Dennoch aber 
ist der gelesene Inhalt dieses Registers das, was die UART als letztes 
empfangen hat und niemals das, was die UART als letztes gesendet hat.

Mit anderen Worten: Was Du da 'reinschreibst, kannst Du dort nicht 
wieder auslesen.

von wmcneo (Gast)


Lesenswert?

Ok, soweit klar. Somit kanns auch im Debugger nicht angezeigt werden.

Was nichts daran ändert, dass er das reingeschriebene Zeichen nicht 
sendet. Da weiß ich einfach nicht weiter.

von Rufus Τ. F. (rufus) Benutzerseite


Lesenswert?

wmcneo schrieb:
> Was nichts daran ändert, dass er das reingeschriebene Zeichen nicht
> sendet.

Hast Du das mit einem Oszilloskop am TxD-Ausgang der UART überprüft?

von ich (Gast)


Lesenswert?

Ist sichergestellt, dass "USART_PORT_485" PORT E ist?
Entspricht "USART_485" dem USARTE0?

von wmcneo (Gast)


Lesenswert?

Leider hab ich gerade kein Oszi zur Verfügung, erst morgen wieder.

#define USART_485 USARTE0
#define USART_PORT_485 PORTE

ist sichergestellt.

Zur Zeit habe ich lediglich meinen RS485-USB Wandler, mit dem ich die 
A/B Leitung am Board abgreife. Dieser zeigt mir jedoch gar nichts an, 
nicht mal Blödsinn - worüber ich mich ja schon freuen würde.

von ich (Gast)


Lesenswert?

Welche Baudrate verwendest du? 2MBaud?

von wmcneo (Gast)


Lesenswert?

Ich verwende 9600bps ... Somit komme ich auf BSEL = 12

von ich (Gast)


Lesenswert?

OK. Nit welcher Frequenz läuft deine CPU?

von wmcneo (Gast)


Lesenswert?

CPU läuft mit 2MHz interner RC.

von ich (Gast)


Lesenswert?

Aha, da haben wir es doch.

für 9600Baud bei f_CPU=2MHz
musst du das CLK2X Bit im Register USARTE0.CTRLB auf 1 setzen

Außerdem hast du den BSCALE Faktor von 4 komplett unterschlagen. Dieser 
wird in BAUSCTRLA und B eingetragen.

von wmcneo (Gast)


Lesenswert?

Danke für die Antwort, werds gleich mal probieren. kannst du mir kurz 
erklären warum ich diese Werte so setzen muss ?

von ich (Gast)


Lesenswert?

Es gibt von Atmel ein Aplication note zum USART. Wenn du dir 
runterlädst, findest du darin auch eine Exceltabelle. Dort gibst du 
deine Baudrate und deine CPU Frequenz ein, und du erhällst dise Werte 
automatisch berechnet.

von wmcneo (Gast)


Lesenswert?

Also dieses Excel-File berechnet bei mir leider gar nichts. Kann 
eingeben was ich möchte, an den berechneten Werden ändert sich nichts.

von ich (Gast)


Lesenswert?

Das muss funktionieren. Ist aber egal, ich hab grad gesehen, dass es mit 
deinen Einstellungen auch funktionieren müsste.

von ich (Gast)


Lesenswert?

Und du bist sicher dass du 2 MHz CPU Frequenz hast. Du gehst nicht über 
die PLL!?

von wmcneo (Gast)


Lesenswert?

Ja ganz sicher

von wmcneo (Gast)


Lesenswert?

Ich betreibe ja auch die USART zum PC, und diese funktioniert 
einwandfrei. Nur die E0 zum RS485 macht Probleme.

von Jan S. (jan_s)


Lesenswert?

wmcneo schrieb:
> CPU läuft mit 2MHz interner RC.

Evtl ist dein USB UART Wandler ein wenig toleranter wa Abweichungen 
angeht?
Ein RC Oszillator ist jetzt nicht gerade der Stabilste seiner Art.
Wobei bei 9600 Baud dürfte das nicht so kritisch sein.

Da hilft wohl nur noch ein Oszi...

von ich (Gast)


Lesenswert?

verbinde mal GND noch zusätzlich zu A und B mit deinem Wandler.
Die Jumper sind gesetzt?

von wmcneo (Gast)


Lesenswert?

Die Jumper sind alle fix verlötet und GND ist auch mit meinem ADAM 4561 
verbunden.

Habe auch schon andere FTDI Converter verwendet und per Terminalprogramm 
eingelesen - es kommt nichts and.

Weiß wirklich nicht mehr weiter.

von ich (Gast)


Lesenswert?

Was ist mit dem 120 Ohm Abschlußwiderstand?

von Jan S. (jan_s)


Lesenswert?

wmcneo schrieb:
> Weiß wirklich nicht mehr weiter.

Code auf das nötigste reduzieren und den USART ohne Einsatz von Makros 
oder nicht vollständig bekannten Funktionen parametrisieren.
Und dann halt geeignet messen, es kann ja evtl. schon ein günstiger 
Logic Analyzer Aufschluss geben, ich verwende diesen: 
http://www.saleae.com/logic/

von wmcneo (Gast)


Lesenswert?

Wo soll dieser 120Ohm Widerstand eingebaut werden ?

von Jan S. (jan_s)


Lesenswert?

Zwischen A und B, an beiden Enden der Leitung.

von wmcneo (Gast)


Lesenswert?

Leider auch ohne Erfolg. Ich gehe ausserdem davon aus, dass in meinem 
ADAM 4561 ein Endwiderstand verbaut ist.

von Jan S. (jan_s)


Lesenswert?

wmcneo schrieb:
> Ich gehe ausserdem davon aus, dass in meinem
> ADAM 4561 ein Endwiderstand verbaut ist.

Was eine blöde Idee wäre, da man den Widerstand nur am Ende der 
Leitungen benötigt, was nicht zwangsweise die Stelle sein muss, an dem 
der ADAM eingesetzt wird.

von ich (Gast)


Lesenswert?

richtig. Der Abschlußwiderstand ist vermutlich zuschaltbar

von ich (Gast)


Lesenswert?

verbinde doch mal PF2 mit PE3 und sende was über USB. Dann siehst du ob 
dein Wandler funktioniert.
Vorher aber den Tranceiver auf senden stellen

von wmcneo (Gast)


Lesenswert?

Wenn ich die beiden Pins verbinde reagiert der MC auf gar keine Kommando 
mehr das ich ihm schicke ...

Meinst du mit "über USB" auf die USB-UART Schnittstelle, oder die 
RS485-UART die ich auslesen will aber keine Zeichen bekomme?

von ich (Gast)


Lesenswert?

Der serielle Datenausgang deiner USB-USART Bridge, auf den Dateneingang 
deines RS485 Tranceivers. Dann irgendwas über USB senden. Das sollte nun 
am RS485 zurück geschickt werden.

Tranceiver auf senden stellen!

von wmcneo (Gast)


Lesenswert?

Der ganze MC steht wenn ich das probiere.

Hab jetzt ein kleines Bsp.Programm von der Atmel Seite geladen "Task1 - 
Polling".

Das Programm schickt 100 Zeichen über den USART, ich habe dann RX und TX 
Pin miteinander verbunden und es wurden die selben 100 Zeichen wieder 
empfangen. Also die USART auf E0 funktioniert prinzipiell mal.

Nur über den RS485 kommt nichts an. PIN1 von PortE wurde Hi gesetzt um 
den Sendevorgang zu aktivieren.

von ich (Gast)


Lesenswert?

Und dein RS485-USB Wandler funktioniert ganz sicher?

von wmcneo (Gast)


Lesenswert?

Um dies zu testen bekomme ich morgen mein Oszi wieder zurück ... 
Mittlerweile befürchte ich auch, dass es am Wandler liegt. Wer weiß!

von wmcneo (Gast)


Lesenswert?

Noch ist kein Oszi da, aber eine andere Frage taucht auf:

Default mäßig wird der interne RC mit 2 MHz verwendet. Zusätzlich ist 
noch ein 8MHz Quartz oben.

Die USB-UART wurde mit 2MHz konfiguriert und funktioniert einwandfrei. 
Ist es möglich, dass der RS485 Wandler mit 8MHz läuft. Wie kann ich das 
kontrollieren bzw. einstellen ?

von Jan S. (jan_s)


Lesenswert?

wmcneo schrieb:
> Ist es möglich, dass der RS485 Wandler mit 8MHz läuft. Wie kann ich das
> kontrollieren bzw. einstellen ?

Der RS485 Tranceiver benötigt keinen Takt, also nein.

von wmcneo (Gast)


Lesenswert?

Wirklich spannend so ein MC. Nachdem nun alles Stück für Stück nochmal 
in seinen Einzelteilen mit dem Oszi untersucht wurde, habe ich 
festgestellt dass die Daten ganz normal aus dem A/B Ausgang kommen.

Ich habe am Code nichts geändert aber plötzlich funktioniert es.

Lediglich empfangen kann ich noch immer nicht.

von ich (Gast)


Lesenswert?

Zum Empfangen musst du erstal RXEN setzen und deinen Tranceiver auf 
empfangen stellen.

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.