Buenos días,
Estoy trabajando con dos módulos Xbee con una configuración punto a punto (Serie 1) entre dos uC (AT89C51RE2). Para ello uso la UART0 y el Timer 2 del microcontraldor (Timer0 y 1 ya los tengo ocupados). Por toda la información que he recaptado, entiendo que el Xbee únicamente hace de "cable" de comunicación pero inalámbricamente así que no parece muy complicado.
Después de poner el programa para simplemente encender un LED, me he encontrado en que el éxito de comunicación es muy bajo y para nada constante. A veces recibe a la primera, otras después de 10 resets o más o menos…. Ya he cambiado canales para evitar interferencias de todo tipo, asi que no se si estoy programando algo mal o que está pasando. Baudrate casi seguro que lo tengo correcto (comprobado tanto en el Xbee con X-CTU, como en el programa). Esta todo en dos PCB distintas (són dos robots) y tuve algún problema con la distribución de massas, no sé si influiría en la señal...
Os adjunto la configuración de cada Xbee asi como el programa que estoy usando (plantilla sacada de Keil). El programa esta probado conectando las UARTS de los dos micros directamente con cable, y dio un éxito de comunciación del 100%.
Modulo 1, emisor:
CH: B
ID:ABCD
DH:0
DL: 1
MY: 2
Modulo 2, receptor:
CH: B
ID:ABCD
DH:0
DL: 2
MY: 1
Y aqui los programas(C):
Envío:
El de recepción:
Bueno creo que doy bastante información... Muchisimas gracias de antemano
Victor
Estoy trabajando con dos módulos Xbee con una configuración punto a punto (Serie 1) entre dos uC (AT89C51RE2). Para ello uso la UART0 y el Timer 2 del microcontraldor (Timer0 y 1 ya los tengo ocupados). Por toda la información que he recaptado, entiendo que el Xbee únicamente hace de "cable" de comunicación pero inalámbricamente así que no parece muy complicado.
Después de poner el programa para simplemente encender un LED, me he encontrado en que el éxito de comunicación es muy bajo y para nada constante. A veces recibe a la primera, otras después de 10 resets o más o menos…. Ya he cambiado canales para evitar interferencias de todo tipo, asi que no se si estoy programando algo mal o que está pasando. Baudrate casi seguro que lo tengo correcto (comprobado tanto en el Xbee con X-CTU, como en el programa). Esta todo en dos PCB distintas (són dos robots) y tuve algún problema con la distribución de massas, no sé si influiría en la señal...
Os adjunto la configuración de cada Xbee asi como el programa que estoy usando (plantilla sacada de Keil). El programa esta probado conectando las UARTS de los dos micros directamente con cable, y dio un éxito de comunciación del 100%.
Modulo 1, emisor:
CH: B
ID:ABCD
DH:0
DL: 1
MY: 2
Modulo 2, receptor:
CH: B
ID:ABCD
DH:0
DL: 2
MY: 1
Y aqui los programas(C):
Envío:
Código:
#include <at89c51xD2.H>
unsigned int i,j;
void enviar ( unsigned char x);
void main (void)
{
P3_5=0; // LED VERDE
P3_3=0; //LED ROJO
SCON = 0x50; /* uart in mode 1 (8 bit), REN=1 */
T2CON &= 0xF0; /* EXEN2=0; TR2=0; C/T2#=0; CP/RL2#=0; */
T2CON |= 0x30; /* RCLK = 1; TCLK=1; */
TH2=0xFF; /* init value */
TL2=0xD9; /* init value */
RCAP2H=0xFF; /* reload value, 9600 Baud at 12 MHz */
RCAP2L=0xD9; /* reload value, 9600 Baud at 12 MHz */
ES = 1; /* Enable serial interrupt */
EA = 1; /* Enable global interrupt */
TR2 = 1; /* Timer 2 run */
enviar(0x01);
while(1)
{
for (i=0; i<100; i++)
{
for (j=0; j<100; j++);
}
P3_3=1;
for (i=0; i<100; i++)
{
for (j=0; j<100; j++);
}
P3_3=0;
}/* endless */
}
void enviar (unsigned char x)
{
SBUF=x;
//Transmit byte
while(TI==0); //Wait for byte to be transmitted
TI=0; //Clear transmit interrupt flag
P3_5=1;
}
El de recepción:
Código:
#include <at89c51xD2.H>
unsigned char q;
unsigned int i,j;
void main (void)
{
P0=0x00;
P3_5=0; //LED VERDE
P3_3=0; //LED ROJO
SCON = 0x50; /* uart in mode 1 (8 bit), REN=1 */
T2CON &= 0xF0; /* EXEN2=0; TR2=0; C/T2#=0; CP/RL2#=0; */
T2CON |= 0x30; /* RCLK = 1; TCLK=1; */
TH2=0xFF; /* init value */
TL2=0xD9; /* init value */
RCAP2H=0xFF; /* reload value, 9600 Baud at 12 MHz */
RCAP2L=0xD9; /* reload value, 9600 Baud at 12 MHz */
ES = 1; /* Enable serial interrupt */
EA = 1; /* Enable global interrupt */
TR2 = 1; /* Timer 2 run */
while(1)
{
if (q==0x01)
{
P3_5=1;
}
} /* endless */
}
/**
* FUNCTION_PURPOSE: serial interrupt, echo received data.
* FUNCTION_INPUTS: P3.0(RXD) serial input
* FUNCTION_OUTPUTS: P3.1(TXD) serial output
*/
void serial_IT(void) interrupt 4
{
if (RI == 1)
{
/* if reception occur */
RI = 0;
q = SBUF;
}
else TI = 0; /* if emission occur */
} /* clear emission flag for next emission*/
Bueno creo que doy bastante información... Muchisimas gracias de antemano
Victor