He preparado un programa de instalación para 2 Xbees uno conectado a la PC a través de XCTU y el otro interconectado con el Atmega 168. El software del terminal pondrá a " 1 " y el xbee con Atmega 168 devolverá 1.
El código es como sigue.
#include<avr/io.h>
#include<avr/interrupt.h>
#include<util/delay.h>
unsigned char data; //to store received data from UDR1
//Function To Initialize UART0
// desired baud rate:9600
// 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;
}
ISR(USART_RX_vect) // 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 UART0 for serial communiaction
sei(); //Enables the global interrupts
}
//Main Function
int main(void)
{
init_devices();
while(1);
}
Este código funciona bien, y la siguiente es la deseada y la obtenida a la salida...
Ahora, el problema es cuando quiero obtener respuesta 3 para una transmisión de 3 desde la PC. Yo estoy usando el avr studio 4 (sí, yo sé que yo estoy con efecto retroactivo) y Atmega 168PA-PU. La configuración para ambos casos es como se muestra en la imagen...
Así que he copiado el programa anterior totalmente y sólo cambió la línea de
ISR(USART_RX_vect) // 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
}
para el siguiente
ISR(USART_RX_vect) // ISR for receive complete interrupt
{
data = UDR0; //making copy of data from UDR0 in 'data' variable
if(data == 0x33)
UDR0 = data; //echo data back to PC
}
Pero el obtenido de salida está en ninguna parte cerca de lo que su supone que debe ser. En la siguiente imagen se debe aclarar.
PS: Hemos utilizado separado (Atmega 168-PU & Atmega 168PA-PU) para los dos programas. Puede ocurrir que hay una cierta discrepancia en el oscilador interno. En algún sitio he leído que puede ser un +/-10% de la imprecisión.