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
>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?
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.
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
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?
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.
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.
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.
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?
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.
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.
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.
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...
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.
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/
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.
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?
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!
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.
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 ?
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.
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.