Interfaz del módulo XBee con ATMEGA 168

He configurado 2 módulos xbee serie 1 de modo que uno recibirá datos en serie de cualquier otro módulo del mismo ID de pan y el otro enviará datos al mencionado anteriormente.

Ahora, cuando uso un software de terminal (XCTU) para verificar la transmisión de datos, está bien. Quiero enviar datos en serie usando un ATMEGA 168 usando xbee como transmisor. Y otro xbee recibirá los datos y los enviará a una plataforma basada en ATMEGA 2560. No tengo ninguna plataforma para atmega 168, así que construí un quemador (circuito de cargador de arranque). El gestor de arranque funciona. He conectado el pin 3 (TXD de USART0) de atmega 168 con datos en (pin 3) del módulo xbee. También hice las conexiones de alimentación necesarias (Vcc = 3.3V y GND). Pero el xbee no parece enviar nada. Hay algo que este olvidando ? Por favor, ayuda, como ya te habrás dado cuenta de que soy un completo novato.

PD: antes de reducir mi reputación, hágame saber qué estoy haciendo mal para que pueda corregirlo.

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

void uart0_init(void)
{
 UCSR0B = 0x00; //disable while setting baud rate
 UCSR0A = 0x00;
 UCSR0C = 0x06;
 UBRR0L = 0x5F; //set baud rate lo
 UBRR0H = 0x00; //set baud rate hi
 UCSR0B = 0x98;
}

void init_devices()
{
 cli();              
 uart0_init();  
 sei();              
}


 int main(void)
{
 unsigned char data; 
 init_devices();
 data =1;  

 while(1)
 {
     data =0x21;
     UDR0 = data;
    _delay_ms(2000);
    data =0x55;
     UDR0 = data;
    _delay_ms(2000);


 }

}
}

Este es el código que usé.

tal vez publicar su código también? podría estar comunicándose a una velocidad de transmisión incorrecta
@geometrikal gracias por responder. He adjuntado el código también.
Parece que no está llamando init_devices()desde su mainrutina, por lo que el UART no se está configurando. Encontré esto en la web que podría ser útil www2.ee.ic.ac.uk/t.clarke/projects/Resources/zigbee/AVR/… ... tiene un código de ejemplo para un puerto serie. Además, ¿ha pensado en grabar el cargador de arranque de Arduino y luego usar el IDE/bibliotecas de Arduino, etc.?
Voy a probar y ejecutar el programa en otro dispositivo hoy. He escrito programas similares antes y han funcionado en otras plataformas. ¿Puede haber alguna falla con los niveles de voltaje o las configuraciones de hardware?
XBee requiere señales de nivel 3.3V y UART. PD: ¿intentaste agregar init_devicesen main?
Intenté hacer eso pero con el mismo resultado. El programa tampoco se estaba ejecutando en la plataforma 2560, así que miré la tasa de baudios y la cambié. Después de eso, funcionó, pero la interfaz 168 no funciona sin importar qué. En XCTU, solo se ven puntos que no coinciden con la tasa de baudios, pero en este caso no aparece nada en el software del terminal. Entonces, supongo que hay algo mal con la configuración del hardware. @geometrikal

Respuestas (2)

El problema estaba en la programación. A menos que se cambien los ajustes del fusible, el microcontrolador utiliza su oscilador predeterminado de 8 MHz con un preescalador de 8. De modo que debería tener una frecuencia de sistema de 1 MHz en lugar de 12 MHz. Entonces para 9600 baudios tienes que poner:

UBRR0L = 0x06; //set baud rate lo

en lugar de

UBRR0L = 0x5F; //set baud rate lo

Esto debería solucionar el problema. Aunque no se como configurar los fusibles o lo que sea.

Algunos problemas:

  • init_devices() debe llamarse desde adentro, main()de lo contrario no se ejecutará

  • data = 0;y data = 1;no envíe los caracteres '0' y '1' respectivamente. Envían NUL y SOH: consulte http://www.asciitable.com , y estos caracteres se mostrarán como nada en un emulador de terminal. En su lugar, encierre los valores entre comillas, por ejemplo data = '0';, para enviar los caracteres '0' y '1' respectivamente.

  • Compruebe la tasa de baudios. Con UCSR0A = 0x00;UBRR0 debe configurarse en: (F_CPU / 8 / baud - 1) / 2;(fuente: biblioteca serial Arduino) ¿dónde F_CPUestá la frecuencia de su CPU en Hertz? Con eso en mente, 005Fparece un valor divertido. Compruebe la frecuencia de la MCU y calcule en consecuencia.

Algunas sugerencias:

  • Los caracteres divertidos en la salida en serie sugieren una tasa de baudios incorrecta, sin embargo, no siempre aparecen.

  • Descargue el IDE de Arduino y eche un vistazo / tome prestado su código de serie.

Supongo que hay algo mal con la configuración del hardware.

  • No se adelante a la resolución de problemas, sino que decida cuál es el problema antes de tiempo, o podría perderse el problema real. ¡Todavía cometo este error! :)
¡Gracias de nuevo, volveré a consultar siguiendo tus sugerencias!
Bien, por favor háganos saber si no funciona. Tengo una configuración muy similar en ejecución pero con atmega328p. Además, para verificar la velocidad en baudios, ¿podría conectar el atmega168 a una PC?
@Geometrical. Gracias por todas sus respuestas. He revisado el programa como dijiste (verifica arriba) y cometí un error muy tonto. Pero todavía no obtengo ningún resultado. Tengo un oscilador de cristal de 12 MHz y tengo mi xbees configurado para una velocidad de 9600 baudios. Ahora desde el enlace debajo de wormfood.net/… he comprobado que con UBRR = 77 (es decir, 4D en hexadecimal) puedo obtener 9600 baudios con un cristal de 11,98 MHz. ¿Estará bien o la ligera falta de coincidencia es suficiente para arruinar mi conexión?
Creo que está bien, olvidé las tolerancias de tiempo de UART, pero menos del 1% debería estar bien. Intente conectar el UART 168 directamente al UART 2560 (tx a rx, rx a tx, gnd a gnd), omitiendo el XBee por completo y solo verifique eso. ¿Tienes un osciloscopio? También puede verificar la salida tx con eso.
Eso hare gracias. Intenté simular con Proteus pero fallé allí también. ¡Lo intentaré con un osciloscopio real en el nuevo año!
@Geometrical He intentado poner la salida de MC en un osciloscopio. Hemos observado algunas formas de onda de forma cuadrada con un voltaje pico a pico casi igual a +Vcc pero las señales no son continuas y no son lo que deberían ser. La mayoría de las veces el valor es solo +Vcc sin ninguna variación.