Hallo miteinander,
habe einen Atmel XMEGA32A4 und möchte nun per UART Daten senden (mit
einer ISR verarbeiten) und empfangen.
Das Ganze ist per USB (FTDI232BL Chip) an einen WindowsXP PC
angeschlossen.
Zum überprüfen nutze ich hTerm in Version 0.8.1b.
Die Daten werden korrekt empfangen, mein senden in der Endlosschleife
funktioniert gut.
Das Problem ist nun, dass ich die gesendeten Zeichen nicht richtig
empfange.
In meiner ISR werden die gelesenen Daten einmal verarbeitet zu einer
Operation und zur Kontrolle ebenfalls zurück geschrieben.
Als Beispiel, sende ich 0x19 bekomme ich 0xC6 und 0x00 zurück.
Deshalb auch gleich das zweite Problem, die ISR wird immer 2mal
durchlaufen, selbst wenn ich nur 1 Zeichen sende.
Grüße
p2k
1 | int main (void)
|
2 | {
|
3 | // Control-LEDs
|
4 | PORTB.DIRSET = 0xFF;
|
5 | PORTB.OUTSET = 0xFF;
|
6 |
|
7 | // UART Init, see Datasheet
|
8 | PORTE.DIRSET = PIN3_bm;
|
9 | PORTE.OUTSET = PIN3_bm;
|
10 | PORTE.DIRCLR = PIN2_bm;
|
11 |
|
12 |
|
13 | // 2MHz Standard CLK --- should be 9600 baud
|
14 | USARTE0.BAUDCTRLA = (uint8_t)(12);
|
15 | USARTE0.BAUDCTRLB = (0 << USART_BSCALE0_bp) | (12 >> 8);
|
16 | USARTE0.CTRLB |= USART_TXEN_bm | USART_RXEN_bm;
|
17 | USARTE0.CTRLA |= USART_RXCINTLVL_MED_gc;
|
18 | USARTE0.CTRLC |= USART_CHSIZE_8BIT_gc;
|
19 |
|
20 | PMIC.CTRL = PMIC_MEDLVLEX_bm;
|
21 | sei();
|
22 |
|
23 | while(1){
|
24 |
|
25 | do{
|
26 | }while( !((USARTE0.STATUS & USART_DREIF_bm) != 0) );
|
27 | USARTE0.DATA = 0x46;
|
28 |
|
29 | _delay_ms(500);
|
30 | PORTB.OUTCLR = 0x04;
|
31 | _delay_ms(500);
|
32 | PORTB.OUTSET = 0x04;
|
33 | }
|
34 |
|
35 | return(0);
|
36 | }
|
37 |
|
38 |
|
39 | ISR(USARTE0_RXC_vect)
|
40 | {
|
41 |
|
42 | volatile uint8_t temp8;
|
43 |
|
44 | temp8 = USARTE0.DATA;
|
45 |
|
46 | if(temp8 == 0xC6){
|
47 | USARTE0.DATA = 0x33;
|
48 | }
|
49 | else{
|
50 | PORTB.OUTTGL =0x08;
|
51 | }
|
52 |
|
53 | do{
|
54 | }while( !((USARTE0.STATUS & USART_DREIF_bm) != 0) );
|
55 | USARTE0.DATA = temp8;
|
56 |
|
57 | return;
|
58 | }
|