Atmega48 Uart endlosschleife

Gast #3650316
Lesenswert?

Hallo,
ich habe einen Atmega48 und ich möchte erstmal über den USART etwas mit 
der Interrupt "USART_RX_vect" empfangen und dann einfach ein Zeichen 
zurücksenden. Das Problem ist, dass das Interrupt scheinbar endlos oft 
aufgerufen wird, nachdem ich 1 einziges Zeichen vom PC zum µC gesendet 
habe.
Hier ist der Quellcode vom Programm:
1
#include <avr/io.h>
2
#include <avr/interrupt.h>
3

4
#ifndef F_CPU
5
  #define F_CPU 8000000UL 
6
#endif
7
 
8
#define BAUD 9600UL
9
 
10
// Berechnungen
11
#define UBRR_VAL ((F_CPU+BAUD*8)/(BAUD*16)-1)   // clever runden
12
#define BAUD_REAL (F_CPU/(16*(UBRR_VAL+1)))     // Reale Baudrate
13
#define BAUD_ERROR ((BAUD_REAL*1000)/BAUD) // Fehler in Promille, 1000 = kein Fehler.
14
 
15
#if ((BAUD_ERROR<990) || (BAUD_ERROR>1010))
16
  #error Systematischer Fehler der Baudrate grösser 1% und damit zu hoch! 
17
#endif
18

19
void uart_init ( unsigned int ubrr)
20
{
21
  UBRR0H = (unsigned char) (ubrr>>8);
22
  UBRR0L = (unsigned char) ubrr;
23
  UCSR0B = (1<<RXCIE0) | (1<<RXEN0) | (1<<TXEN0);
24
  
25
  UCSR0C = (1<<USBS0) | (3<<UCSZ00);
26
}
27

28
void uart_putc (char c)
29
{
30
  while (!(UCSR0A & (1<<UDRE0)))
31
    ;
32
  UDR0 = c;
33
}
34

35
ISR(USART_RX_vect)
36
{
37
  uart_putc ('a');
38
}
39

40
int main(){
41
  uart_init (UBRR_VAL);
42
  
43
  sei();
44
  while (1)
45
  {
46
    
47
  }
48
  return 0;
49
}
Ich sende das Zeichen zum Mikrocontroller mit dem Programm HTerm. Da 
habe ich 9600 Baud, 8 Data- und 2 Stopbits eingestellt.
Ich hoffe ihr könnt mir helfen.
Viele Grüße
Simon

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