Hola a todos,
Tengo un problema que me tiene bastante perplejo y despues de darle muchas vueltas y probar de todo ya no se por donde pillarlo. A ver si alguien podria decirme donde tengo el fallo.
Lo que intento hacer es comunicar un 18f4550 con un pc via rs232 de forma inalámbrica a traves de 2 módulos xbee pro. El software del pc funciona perfectamente comunicándolo con el pic mediante usb y rs232 emulado con las funciones cdc y por cable físico. Estas son las pruebas que he ido haciendo hasta llegar a los xbee.
De entrada, al hacer la comunicación con los xbee veo que no siempre llega todo al pic. Para probar mando 3 bytes al pic y los devuelvo directamente al pc a ver que se esta mandando y en el pc no siempre recibo todo lo que envio. Esto es un tema.
Pero lo que me tiene deshubicado es que si la comunicacion la gestiono dentro del bucle infinito del main, funciona (a medias pero funciona). En cambio si intento detectar la entrada de datos mediante interrupción, no va nada de nada.
El código resumido es el siguente:
#fuses HSPLL,NOWDT,NOPROTECT,NOLVP,NODEBUG,USBDIV,PLL3,CPUDIV1,VREGEN
#use delay(clock=48000000)
#use rs232(baud=115200, xmit=PIN_C6, rcv=PIN_C7)
#use fast_io(A)
#use fast_io(B)
#use fast_io(C)
#use fast_io(D)
#use fast_io(E)
int8 ordre;
#int_rda
void serial_isr(void)
{
if(kbhit()) //Si lo pongo aquí es cuando no recibo nada
{
ordre=getc(); //Hago eco como prueba a ver que es lo que le llega al pic
putc(ordre);
ordre=getc();
putc(ordre);
ordre=getc();
putc(ordre);
}
}
#int_RTCC
void RTCC_isr()
{
(...)
}
#int_timer1
void timer1_isr(void)
{
(...)
}
#int_timer2
void timer2_isr(void)
{
(...)
}
#int_timer3
void timer3_isr(void)
{
(...)
}
void main() {
delay_ms(300);
setup_counters(RTCC_INTERNAL,RTCC_DIV_4);//RTCC_8_BIT|RTCC_DIV_4);
setup_timer_1(T1_INTERNAL | T1_DIV_BY_4);
setup_timer_2(T2_DIV_BY_4,255,1);
setup_timer_3(T3_INTERNAL | T3_DIV_BY_4);
enable_interrupts(INT_RTCC);
enable_interrupts(INT_timer1);
enable_interrupts(INT_timer2);
enable_interrupts(INT_timer3);
enable_interrupts(INT_rda);
enable_interrupts(global);
set_tris_a(0b00000000);
set_tris_b(0b00000000);
set_tris_c(0b10000000);
set_tris_d(0b00000000);
set_tris_e(0b00000000);
output_a(0x00);
output_b(0x00);
output_c(0x00);
output_d(0x00);
output_e(0x00);
do {
/*if(kbhit()) //Si lo pongo aquí si que recivo datos
{
ordre=getch();
putc(ordre);
ordre=getch();
putc(ordre);
ordre=getch();
putc(ordre);
}*/
} while (TRUE);
}
Tengo que decir que las velocidades las he comprobado el todos los puntos (xbee, pic y puerto pc).
Cualquier ayuda o sugerencia me será de gran ayuda.
Muchas gracias.
Saludos