Hola amigos, yo soy nuevo en este foro, pero he recurrido a el xq necesito de su ayuda en cuanto a manejar dos módulos XBee usando un microcontrolador PIC17F877A y PIC BASIC para la programación, para cada módulo. Ya he realizado la comunicación unidireccional según como se encuentra el código del ejemplo que facilita Arduino en su pagina
http://www.faludi.com/itp_coursework/meshnetworking/XBee/XBee_example.html y la prueba ha resultado exitosa, pero cuan he intentado hacer la comunicación bidireccional no ha resultado, no se donde esta el problema, según yo el código esta bien, pero necesito de una segunda opinión, para lo cual aquí les adjunto el código con sus respectivos comentarios:
' el portc.6 como salida serial
' el portc.7 como entrada serial
' el portb.0 como entrada digital
‘definición de la constante true9600 = 84 ( baudmode 9600-8-n-1-true (non-inverted)):
true9600 con 84
' definición de la variable thisByte (para salida) de tipo byte (8 bits)
thisByte var byte
' definición de la constante timeout = 2000, para esperar un dato proveniente del pin de entrada serial
timeout CON 2000
'definición de la variable inByte (para guadar datos de entrada serial) de tipo byte
inByte var byte
' el portb.0 como entrada digital:
input portb.0
' el portd.1 como salida para representar un estado (status light):
output portd.1
' label to jump back to if configuration times out
configure:
' el LED de estado colocado en el portd.1 parpadea una vez en el arranque:
High portd.1
pause 200
low portd.1
PAUSE 200
'por alguna razón esto parece ayudar a enviar un carácter arbitrario primero
‘luego una pausa de 200 para el guard time antes de solicitar el modo comando
serout2 portc.6, true9600, ["X"]
pause 1500
'poner el módulo XBee en modo comando:
serout2 portc.6, true9600, ["+++"]
'esperar por una respuesta (OK) desde el XBee por 2000 ms, o empezar de
‘nuevo en la etiqueta de configure, si no hay una respuesta por parte del XBee
SERIN2 portc.7, true9600, 2000, configure, [WAIT ("OK")]
' luego se coloca el ID de la PAN (red de área personal) ID, los dos módulos
‘deben tener el mismo PAN ID
' este ejemplo usa un ID de 0x3332, pero tu puedes elegir un propio
‘entre el rango hexadecimal de 0x0 y 0xFFEE
serout2 portc.6, true9600, ["ATID3332,"]
‘definimos el canal por el cual se van a comunicar los dos módulos XBee
‘en este caso hemos elegido el canal 12 (0x0C), pero tu puedes elegir entre
‘un rango de 11(0x0B) a 26(0X1A) canales permitidos
serout2 portc.6, true9600, ["ATCHC,"]
‘se coloca arbitrariamente la dirección para un módulo en este caso 0x01 entre
‘un rango de 0x0 a 0xFFFE, esta dirección debe corresponder a la dirección de
‘destino (ATDL1) del otro modulo XBee
serout2 portc.6, true9600, ["ATMY1,"]
'para usar el direccionamiento de 16 bits se debe dejar a cero el comando DH=0
‘Esta dirección puede ser asignada y cambiada por comandos de envio desde el
‘microcontrolador.
serout2 portc.6, true9600, ["ATDH0,"]
' se coloca la dirección de destino DL que corresponde a la dirección propia del
‘ otro módulo (ATMY2) con el cual se va comunicar, en este ejemplo es de 0x02
‘ pero tu puedes elegir entre un rango de 0x0 a 0xFFFE
serout2 portc.6, true9600, ["DL2,"]
‘luego aunque no es necesario (puesto que lo hace el microcontrolador) se ajusta
‘la tasa de transmisión entre el módulo y su cliente (micro) conectado a través de
‘interfaz serial. Para ello se usa el comando BDx, donde x puede ser 0 (1200), 1
‘(2400), 2 (4800), 3(9600), 4 (19200), 5 (38400), 6 (57600) y 7(115200).
serout2 portc.6, true9600, ["ATBD3,"]
' para salir del modo comando
serout2 portc.6, true9600, ["CN",13]
' esperar por una respuesta (OK) desde el XBee por 2000 ms o empezar de
‘nuevo en la etiqueta de configure, si no hay una respuesta por parte del XBee
SERIN2 portc.7, true9600, 2000, configure, [WAIT ("OK")]
main:
' obteniendo los datos, desde la entrada serial por 2000 ms o ir a la etiqueta enviar
‘ si no hay datos presentes en la entrada
SERIN2 portc.7, true9600, timeout, enviar, [DEC inByte]
' el LED rojo colocado en el pin portb.1 se ilumina cuando se ha recibido un “1”
‘por la entrada serial, desde el otro modulo XBee
if inByte == 1 THEN
HIGH portb.1
' si un “0” es recibido por la entrada serial el LED rojo se apaga
ELSE
LOW portb.1
ENDIF
enviar:
' leer el estado del switch, colocado en el potb.0:
thisByte = portb.0
'para convertir thisByte a un valor ASCII legible y enviar este dato por el puerto serial:
serout2 portc.6, true9600, [DEC thisByte]
pause 500
' para saltar a la etiqueta main y quedar dentro de en un bucle leyendo y escribiendo datos
goto main
Esperando me se sepan ayudar, me despido.Voy estar esperando por una respuesta, gracias.