TODOPIC

Microcontroladores PIC => Lenguaje C para microcontroladores PIC => Mensaje iniciado por: claudiovega en 07 de Julio de 2014, 22:06:15

Título: Comunicación serial entre PIC 16F873A y Modem Xbee XBP09-XSC
Publicado por: claudiovega en 07 de Julio de 2014, 22:06:15
Hola amigos, soy nuevo en el foro, soy nuevo también en la programación de PICs y espero que puedan ayudarme.
Tengo un sistema que hace lo siguiente:
a) Se envía una orden desde un módem xbee xbp09-xsc a otro ubicado en una tarjeta (no se usa comandos at), uno envía y todos los otros reciben.
b) Los xbee ubicados en la tarjeta reciben la comunicación y pasan lo recibido por la puerta serial a un chip 16f873a
c) El chip, según el contenido del mensaje decide si es para el o no. Si es para el activa ciertos pines, también según el mensaje.
d) El chip responde al modem por la puerta serial que realizó el trabajo exitosamente o no.
El programa tiene ciertas restricciones que se desean quitar pero no se cuenta con el código fuente (sólo el hex), por tanto he tomado un breve curso de programación de PICs para entender y luego tratar de programar el PIC usando C.
He hecho un programa de prueba que activa pines en el portb y funciona bien.
Luego pasé a hacer un programa que lea el puerto serial, reciba un comando y encienda algo en el portb. Este programa no funciona, nunca se ejecuta la interrupción (#INT_RDA).
Por favor indicar que puede estar fallando. Adjunto el programa en C y un diagrama de la tarjeta.
Aqui está el código:

Código: [Seleccionar]
#include <16F873A.h>
#include <stdlib.h>
#use delay(clock=4000000)
#fuses HS,NOWDT,PUT,BROWNOUT,NOLVP,PROTECT,NOCPD,
#use rs232(baud=9600,xmit=PIN_C6,rcv=PIN_C7,STREAM=COM_A,parity=N,bits=8)
#zero_ram

char *p;
char *p1;
char *p2;
char buffer_COM_A[40] = "";
short flag_rx1 = 0;

/* Estas son las cadenas válidas */
char on__cam1[9] = "ON__CAM1";
char off_cam1[9] = "OFF_CAM1";
char on__cam2[9] = "ON__CAM2";
char off_cam2[9] = "OFF_CAM2";
char on__cam3[9] = "ON__CAM3";
char off_cam3[9] = "OFF_CAM3";
char on__cam4[9] = "ON__CAM4";
char off_cam4[9] = "OFF_CAM4";

#INT_RDA
void usart_modem(void)

int32 timeout = 0;
flag_rx1 = 0;
p = buffer_COM_A;
if (kbhit(COM_A))
{
//para 9600 timeout=4000, para 115200 timeout=3500 
while (timeout<4000)
{
if (kbhit(COM_A))
{
*p = fgetc(COM_A);
                p++;
timeout = 0;
}
timeout++;
}
*p = NULL;
flag_rx1=true;
}
}

int validar(char *p1, char *p2)
{
int *p3;
p3 = strstr(p1,p2);
return (p3);
}

/* Programa principal */
void main(void)
{
set_tris_b(0b00000000);
set_tris_c(0b10000000);
enable_interrupts(INT_RDA);
enable_interrupts(GLOBAL);

while(1)
{
if(flag_rx1){
flag_rx1 = 0;
if(validar(buffer_COM_A, on__cam1)){
output_bit(PIN_B5, 1);
}
if(validar(buffer_COM_A, off_cam1)){
output_bit(PIN_B5, 0);
}

if(validar(buffer_COM_A, on__cam2)){
output_bit(PIN_B4, 1);
}
if(validar(buffer_COM_A, off_cam2)){
output_bit(PIN_B4, 0);
}

if(validar(buffer_COM_A, on__cam3)){
output_bit(PIN_B1, 1);
}
if(validar(buffer_COM_A, off_cam3)){
output_bit(PIN_B1, 0);
}

if(validar(buffer_COM_A, on__cam4)){
output_bit(PIN_B2, 1);
}
if(validar(buffer_COM_A, off_cam4)){
output_bit(PIN_B2, 0);
}
}
}
}
Título: Re: Comunicación serial entre PIC 16F873A y Modem Xbee XBP09-XSC
Publicado por: claudiovega en 11 de Julio de 2014, 12:05:17
¿Alguna idea?
La puerta serial está en los pines C6 y C7, según eso ¿Está bien la instrucción set_tris_c(0b10000000);?
¿Está bien definida la interrupción?