Problema con Atmega 168 USART recibe interrupción, mientras se comunica con Xbee

Antes de disminuir mi reputación, hágame saber qué he hecho mal. Ten paciencia conmigo porque soy un novato.

He escrito un programa para que un módulo de radio receptor envíe 1 cuando recibe un 1 de un módulo emisor. Estoy usando XCTU con un Xbee como emisor. Aquí está el código.

#include<avr/io.h>
#include<avr/interrupt.h>
#include<util/delay.h>

unsigned char data; //to store received data from UDR0



//Function To Initialize UART0
// desired baud rate:9600
// actual baud rate:
// char size: 8 bit
// parity: Disabled
void uart0_init(void)
{
 UCSR0B = 0x00; //disable while setting baud rate
 UCSR0A = 0x00;
 UCSR0C = 0x06;
 UBRR0L = 0x06; //set baud rate lo
 UBRR0H = 0x00; //set baud rate hi
 UCSR0B = 0x98;
}


SIGNAL(SIG_USART0_RECV)         // ISR for receive complete interrupt
{
    data = UDR0;  //making copy of data from UDR0 in 'data' variable 
    if(data == 0x31)
    UDR0 = data;                //echo data back to PC

}


//Function To Initialize all The Devices
void init_devices()
{
 cli(); //Clears the global interrupts
 uart0_init(); //Initailize UART1 for serial communiaction
 sei();   //Enables the global interrupts
}

//Main Function
int main(void)
{
init_devices();
    while(1);
}

Ahora el problema es que cuando envío un 1 no obtenemos ninguna respuesta del receptor. Probamos lo mismo con un devboard basado en Atmega 2560 como receptor y el programa funcionó a la perfección. Pero cuando lo probamos con Atmega 168 no pasa nada. Bueno, con Atmega 168 usamos un cristal interno de 8 MHz con 8 prescaler, es decir, un reloj del sistema de 1 MHz, así que he usado

 UBRR0L = 0x06; //set baud rate lo

Utilizado para placa de desarrollo

 UBRR0L = 0x5F; //set baud rate lo

para obtener 9600 baudios. Pero no importa lo que haga, la interrupción simplemente no funciona. Intentamos ejecutar un ciclo de alternancia en el programa principal para ver si funciona o no y eso también funcionó. Pero cada vez que transmito una señal a través de XCTU (software de terminal), el receptor no va a ISR como se supone que debe hacerlo.

Por favor ayuda. Pregúntame si hay algo que necesite aclarar.

Respuestas (2)

Está utilizando el formato anterior para las interrupciones, me pregunto si esta es la causa del problema.

Consulte avr/interrupt.h

El controlador de interrupción debe ser como

ISR(USART0_RX_vect)
{

}

Para Atmega 168 tuvimos que usar

ISR(USART_RX_vect)
{

}