Hola,
Tengo un problema con la interrupción USART_RX_vect del ATMega 328p. La recepción funciona bien y puedo evaluar los bits enviados (por lo que no se debe a la velocidad en baudios), pero cada vez que envío un poco, el ISR se ejecuta 4 veces.
Entonces, un ISR como este:
ISR(USART_RX_vect) {
uart_transmit('t');
uart_flush();
}
Transmitirá {'t', 't', 't', 't'}
No tengo ni idea de por qué sucede esto, y espero que puedas ayudarme.
Mi main
es un bucle vacío (por supuesto que ejecuto uart_setup
). Mi ISR es como el de arriba. Estoy usando avr-gcc en linux.
Esta es mi configuración de UART:
void uart_setup() {
UBRR0H = (BAUDRATE >> 8);
UBRR0L = BAUDRATE;
// Set 8-Bit mode
setBit(UCSR0C, UCSZ01);
setBit(UCSR0C, UCSZ00);
setBit(UCSR0B, RXEN0); // Receiver enable
setBit(UCSR0B, TXEN0); // Transmitter enable
setBit(UCSR0B, RXCIE0); // Enable RX Interrupt
sei(); // Enable global interrupts
}
void uart_transmit(unsigned char data)
{
while (!( UCSR0A & (1<<UDRE0))); // wait while register is free
UDR0 = data; // load data in the register
}
void uart_flush( void ) {
unsigned char dummy;
while ( UCSR0A & (1<<RXC0) ) dummy = UDR0;
}