Hallo zusammen, hat jemand ein beispiel wie mann über usart bei XMEGA-A1 eine char kette empfängt?? Ich will einen GPS sensor auslesen. Der schickt die daten so: $GPVTG,0.0,T,359.6,M,0.0,N,0.0,K*47 Besten dank Gruss Milan
Siehe dort: Beitrag "Re: Xmega 256a3b Usart sendet immer ASCII 255" Und dann einfach die empfangenen Zeichen in einem String/char[]-Array ablegen.
Hallo ich benutze volgende funktionen: #define USARTF1_BSEL 1605 #define USARTF1_SCALE 0b1101 // -7 void USART_F1_Init(void) { char data; // configuration of portpins PORTF.DIRCLR = 1<<PIN6; // Pin6 input (RXD1) PORTF.OUTSET = 1<<PIN7; PORTF.DIRSET = 1<<PIN7; // Pin7 output high (TXD1) // USARTF1, 8 Data bits, No Parity, 1 Stop bit. USARTF1.CTRLC = USART_CHSIZE_8BIT_gc | USART_PMODE_DISABLED_gc; USARTF1.CTRLA = 0; USARTF1.BAUDCTRLA = 0x33; USARTF1_BAUDCTRLB = 0x00; USARTF1.CTRLB = USART_RXEN_bm | USART_TXEN_bm; // enable receiver and transmitter data = (char)(USARTF1.DATA); // Flush buffer } void USART_F1_Send(uint8_t data) { while ((USARTF1.STATUS & USART_DREIF_bm) == 0) {}; USARTF1.DATA = data; } char USART_F1_Receive(void) { while ((USARTF1.STATUS & USART_RXCIF_bm) == 0) {}; return USARTF1.DATA; } aber aus unbekanten gründen empfange ich nix!! Kann mir bitte jemand helfen??? Gruss Milan
Schau Dir mal Deine und meine Initialisierung (im o.a. Beitrag) an. Du definierst zwar am Anfang Werte mit #define, verwendest sie aber später nicht. Die einzustellende Baudrate ist auch abhängig vom eingestellten CPU-Takt. Hast Du das berücksichtigt? Aus Deinem Code-Auszug geht das nicht hervor. Carsten
Hallo, mit welcher Geschwindigkeit läuft dein Atxmega128a1? GPS liefert 9600 Baut als Defaultwert. Gruß xmega
Hallo zusammen, das ist der xmega http://mikrocontroller-praxis.de/de/Development-Tools/MC-Module/XMEGA-A1-USB.html Das Modul ist mit einem 16MHz SMD-Quarz (XTAL1/2) und einem 32,768kHz SMD-Quarz (TOSC1/2) bestückt. Welche werde muss ich für die Baudrate nehmen?? DAnke im Voraus Gruss Milan
Hallo zusammen, gefunden. es war die Baudrate!! So sieht es jetzt aus: #define USARTF1_BSEL 207 #define USARTF1_SCALE 0 void USART_F1_Init(void) { char data; // configuration of portpins PORTF.DIRCLR = 1<<PIN6; // Pin6 input (RXD1) PORTF.OUTSET = 1<<PIN7; PORTF.DIRSET = 1<<PIN7; // Pin7 output high (TXD1) // USARTF1, 8 Data bits, No Parity, 1 Stop bit. USARTF1.CTRLC = USART_CHSIZE_8BIT_gc | USART_PMODE_DISABLED_gc; USARTF1.CTRLA = 0; USARTF1.BAUDCTRLA = (uint8_t)(USARTF1_BSEL); // BSEL USARTF1_BAUDCTRLB = (USARTF1_SCALE<<4) | (uint8_t)(USARTF1_BSEL>>8); // SCALE, BSEL USARTF1.CTRLB = USART_RXEN_bm | USART_TXEN_bm; // enable receiver and data = USARTF1.DATA; // Flush buffer } Besten dank für Eure hilfe. Gruss Milan
Hallo nochmahls, das habe ich geendert: USARTF1.CTRLA = USART_RXCINTLVL_HI_gc; // enable Empfangsinterrupt (auf HI Level) PMIC.CTRL |= PMIC_HILVLEN_bm | PMIC_MEDLVLEN_bm | PMIC_LOLVLEN_bm; //Interrupts (high-, medium- und lowlevel freigeben) sei(); // allegemeine interruptfreigabe //-------------------------------------------------------------- und das habe ich hinzugefügt: char rxbuffer[150]; /* Puffer für Empfang */ int rxpos = 0; /* Zeiger auf nächstes Zeichen im Puffer */ bool rxvalid = 0; /* 1= String vollständig */ ISR(USARTF1_RXC_vect)//Empfangen mit Interrupt { int c=0; c = USARTF1.DATA; if (c=='\r') { c = 0x00; rxvalid = 1; rxbuffer[rxpos] = c; rxpos = 0; } if (c=='\n') { /* Windows Kompatibilität: c Verwerfen. */ } else { /* Zeichen speichern */ rxbuffer[rxpos++] = c; } } wenn ich rxbuffer am display ausgeben will kommt nichts. kann mir jemand sagen warum??? oder muss ich die funktion ISR im main aufrufen??? Danke im voraus. Gruss Milan
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.