mikrocontroller.net

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


Autor: P2K (Gast)
Datum:

Bewertung
0 lesenswert
nicht 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
int main (void)
{
  // Control-LEDs
  PORTB.DIRSET = 0xFF;
  PORTB.OUTSET = 0xFF;

  // UART Init, see Datasheet
  PORTE.DIRSET = PIN3_bm;
  PORTE.OUTSET = PIN3_bm; 
  PORTE.DIRCLR = PIN2_bm;


  // 2MHz Standard CLK --- should be 9600 baud
  USARTE0.BAUDCTRLA = (uint8_t)(12);
  USARTE0.BAUDCTRLB = (0 << USART_BSCALE0_bp) | (12 >> 8);
  USARTE0.CTRLB |= USART_TXEN_bm | USART_RXEN_bm;
  USARTE0.CTRLA |= USART_RXCINTLVL_MED_gc;
  USARTE0.CTRLC |= USART_CHSIZE_8BIT_gc;

  PMIC.CTRL = PMIC_MEDLVLEX_bm;
  sei();

  while(1){

    do{
    }while( !((USARTE0.STATUS & USART_DREIF_bm) != 0) );
    USARTE0.DATA = 0x46;

    _delay_ms(500);
    PORTB.OUTCLR = 0x04;
    _delay_ms(500);
    PORTB.OUTSET = 0x04;
  }

  return(0);
}


ISR(USARTE0_RXC_vect)
{

  volatile uint8_t temp8;

  temp8 = USARTE0.DATA;

  if(temp8 == 0xC6){
    USARTE0.DATA = 0x33;
  }
  else{
    PORTB.OUTTGL =0x08;
  }

  do{
  }while( !((USARTE0.STATUS & USART_DREIF_bm) != 0) );
  USARTE0.DATA = temp8;

  return;
}

Antwort schreiben

Die Angabe einer E-Mail-Adresse ist freiwillig. Wenn Sie automatisch per E-Mail über Antworten auf Ihren Beitrag informiert werden möchten, melden Sie sich bitte an.

Wichtige Regeln - erst lesen, dann posten!

  • Groß- und Kleinschreibung verwenden
  • Längeren Sourcecode nicht im Text einfügen, sondern als Dateianhang

Formatierung (mehr Informationen...)

  • [c]C-Code[/c]
  • [avrasm]AVR-Assembler-Code[/avrasm]
  • [code]Code in anderen Sprachen, ASCII-Zeichnungen[/code]
  • [math]Formel in LaTeX-Syntax[/math]
  • [[Titel]] - Link zu Artikel
  • Verweis auf anderen Beitrag einfügen: Rechtsklick auf Beitragstitel,
    "Adresse kopieren", und in den Text einfügen




Bild automatisch verkleinern, falls nötig
Bitte das JPG-Format nur für Fotos und Scans verwenden!
Zeichnungen und Screenshots im PNG- oder
GIF-Format hochladen. Siehe Bildformate.
Hinweis: der ursprüngliche Beitrag ist mehr als 6 Monate alt.
Bitte hier nur auf die ursprüngliche Frage antworten,
für neue Fragen einen neuen Beitrag erstellen.

Mit dem Abschicken bestätigst du, die Nutzungsbedingungen anzuerkennen.