Antes de disminuir mi reputación, hágame saber qué he hecho mal. Tengan paciencia ya que soy un novato.
He escrito un programa para que un módulo de radio receptor envíe 1 cuando reciba un 1 de un módulo de emisora. Estoy usando XCTU con un Xbee como emisora. 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 recibimos ninguna respuesta del receptor. Intentamos lo mismo con un devboard basado en Atmega 2560 como receptor y el programa funcionó a la perfección. Pero cuando lo intentamos con Atmega 168 no pasa nada. Bueno, con Atmega 168 usamos un cristal interno de 8MHz con 8 prescaler, es decir, un reloj del sistema de 1MHz, así que lo he usado
UBRR0L = 0x06; //set baud rate lo
Se utiliza para dev-board
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 conmutación en el programa principal para ver si está funcionando o no y que también funcionó. Pero cuando transmito una señal a través de XCTU (software de terminal), el receptor no va a ISR como se supone.
Por favor ayuda. Pregúntame si hay algo que necesite aclarar.