Xbee Punto-Punto

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:

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
 
Yo comenzaría por conectar tus dos micro controladores directamente entre si, sin usar los módulos xbee, para estar 100% seguro de que tu programación es correcta y la comunicación cumple con lo que buscas.

Por otro lado, para verificar la distancia, en mi caso particular un modulo xbee lo conecto a mi pc (con su debido adaptador) y el software de configuración/pruebas del propio xbee, mientras que el otro modulo xbee, lo alimento o energizo y puenteo los pines XT y RX, con esta acción hago un loop o un eco de tal suerte que todo lo que reciba el segundo modulo lo regresa al primero y así verifico la distancia efectiva entre los módulos.

Espero te sirva como diagnostico.
 
Atrás
Arriba