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?
Und was soll das hier?
>USART_PORT_485.DIRSET = PIN1_bm; // Pin 1 (CLK) as output
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
Setzt du PE1 gemäß dem Schaltplan auf Hi-Pegel, um den Sender einzuschalten?
Auf dem Board fehlt der 120 Ohm Abschlusswiderstand. Da du scheinbar mit 2MBit fährst, könnte das eine Ursache sein
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?
Der Empfangsmodus ist ja deaktiviert, ich möchte lediglich senden. Somit sollte die UART ja keine Daten in dieses Register schreiben, oder ?
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?
Ist sichergestellt, dass "USART_PORT_485" PORT E ist? Entspricht "USART_485" dem USARTE0?
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.
Danke für die Antwort, werds gleich mal probieren. kannst du mir kurz erklären warum ich diese Werte so setzen muss ?
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.
Also dieses Excel-File berechnet bei mir leider gar nichts. Kann eingeben was ich möchte, an den berechneten Werden ändert sich nichts.
Das muss funktionieren. Ist aber egal, ich hab grad gesehen, dass es mit deinen Einstellungen auch funktionieren müsste.
Und du bist sicher dass du 2 MHz CPU Frequenz hast. Du gehst nicht über die PLL!?
Ich betreibe ja auch die USART zum PC, und diese funktioniert einwandfrei. Nur die E0 zum RS485 macht Probleme.
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...
verbinde mal GND noch zusätzlich zu A und B mit deinem Wandler. Die Jumper sind gesetzt?
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/
Leider auch ohne Erfolg. Ich gehe ausserdem davon aus, dass in meinem ADAM 4561 ein Endwiderstand verbaut ist.
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.
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
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.
Um dies zu testen bekomme ich morgen mein Oszi wieder zurück ... Mittlerweile befürchte ich auch, dass es am Wandler liegt. Wer weiß!
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.
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
Mit Google-Account einloggen
Noch kein Account? Hier anmelden.