Rs485 reagiert nicht auf Daten

Gast #2133961
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
Gast #2133970
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?
Gast #2134046
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
Persönliche Seite #2134167
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.
Gast #2134192
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.
Gast #2134268
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.
Gast #2134289
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.
Gast #2134381
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.
Gast #2134581
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?
Gast #2134616
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!
Gast #2134651
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.
Gast #2135558
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 ?
Gast #2136053
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.

Antwort schreiben

Bitte melde dich an, um einen Beitrag zu schreiben.

oder

Mit Google-Account einloggen

Die Registrierung ist kostenlos und dauert nur eine Minute.

Jetzt registrieren