Forum: Mikrocontroller und Digitale Elektronik AVR XMEGA UART Interrupt liest Daten falsch


von P2K (Gast)


Lesenswert?

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
}

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
Noch kein Account? Hier anmelden.