AVR XMEGA UART Interrupt liest Daten falsch

Gast #1878528
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
}

Antwort schreiben

Bitte melde dich an, um einen Beitrag zu schreiben.

oder

Mit Google-Account einloggen

Die Registrierung ist kostenlos und dauert nur eine Minute.

Jetzt registrieren