Bueno he seguido trasteando y he conseguido que funcione a medias lo que quiero hacer, pero ahora pasa una vez por la interrupcion y la segunda vez no pasa por tanto es como si ya no la hiciera caso... porque???? he probado a eliminar el error de overrrun pero no parece que funcione:
dejo el codigo por si alguien tiene alguna idea de porque no accede a la segunda vez que le llega el comando a la interrupcion:
#include <16f876a.h>
#include <stdio.h>
#include <string.h>
#fuses HS,NOWDT,NOLVP,NOBROWNOUT // OSCILADOR CRISTAL DE CUARZO Y SIN WD
#use delay(clock=4000000)
#use rs232(baud=9600,parity=N,bits=8,xmit=PIN_C6,rcv=PIN_C7)
#bit RCSTA_cren=0x18.4
#bit RCSTA_over=0x18.1
char recepcion;
short int activado=0;
// funcion de espera
void wait (long int y)
{
long int i,x;
for (x=0;x<y;x++)
for (i=0;i<y;i++);
}
// INTERRUPCION DE LA UART POR RX
#int_RDA
void RDA_isr()
{
//recibimos comando
recepcion=getc();
//hacemos ECO
printf(recepcion);
//Esperamos 30 segundos de llamada, solo recogiendo el primer caracter de llamada
delay_ms(30000);
// comprobamos que es señal de ring
if (recepcion == "R")
{
if (activado == 0) //activamos alarma si es asi
{
printf("Alarma activada!!!"
;
activado = 1;
}
else
{
activado = 0;
printf("Alarma desactivada!!!"
;
}
}
//esperamos 1 segundo para que se termine de transmitir los datos de alarma
delay_ms(1000);
//eliminamos posible error de overrun
if (RCSTA_over&&1) // miramos sihay overrun, si lo hay lo ponemos a 0
{
RCSTA_cren = 0;
printf("RCSTA"
; // comprobacion de paso
}
}
void main (void)
{
activado=0;
set_tris_a(0); // todo el puerto a salida
set_tris_c(0x80);
output_bit (pin_a5,1); // comprobacion de paso
printf("Iniciando el sistema...."
; // comprobacion de paso
delay_ms(1000); // esperamos final de transmision
if (RCSTA_over&&1) // miramos sihay overrun, si lo hay lo ponemos a 0
{
RCSTA_cren = 0;
printf("RCSTA"
; // comprobacion de paso
}
//Habilitacion de interrupciones RS232
enable_interrupts(INT_RDA);
enable_interrupts(GLOBAL);
for(;
// bucle infinito
{
printf(".."
;//comprobacion de paso
if (activado == 1) //verificacion de activacion de alarma
output_bit(pin_a5,1);
if (activado == 0)
output_bit(pin_a5,0);
while ((input(pin_b7)==0)&&(activado==1)) //si la alarma esta activa y el interruptor tambien salta!
{
printf("ATD123456789;"
; //envio de comandos AT
putc(0x0d);
delay_ms(30000);
printf("ATH"
;
putc(0x0d);
delay_ms(5000);
}
}
}
Bueno como no sabeis de que va esta aplicacion os la digo en un plis para que la entendais, en principio es una alarma pero que se activa y desactiva cuando se llama a un numero de telefono movil. El puerto USART esta conectado al movil y el pic transmite comandos AT de llamada y cuelgue (proximamente hasta mensajes jeje SMS), con lo que si se detecta que el pin b7 tiene un estado bajo (dependera del sensor) enviara una llamada al numero que le indiquemos, esperara 30 segundos colgara y a los 5 segundos volvera a marcar si B7 sigue activo. si llamamos desde un telefono al pic, este se activara o se desactivara si es la segunda vez que le llaman.
Entonces aqui viene el problema, no consigo que se desactive la alarma....... no entra en la interrupcion RS232 y no se porque...... y lo que ya no me explico es que despues de toda la tarde, el cuelgue del pic fuera por el while (true) ¿? ademas he notado que el pic tarda en arrancar cerca de 2 minutos (sale el mensaje de inicializacion y pasa como unas 30 veces antes de pararse y estar 2 minutos parado sin hacer nada, luego vuelve a transmitir los puntos....¿?) En El primer acceso a interrupcion tarda mas de 30 segundos y el segundo acceso y sucesivos no lo hace... porque? todo esta monitorizado con el hyperterminal. Haber si alguien me puede echar una mano que llevo mas de 10 horas detras del puñetero problema y no quiero acceder al puerto serie por sondeo sino por interrupcion. Gracias!!!!!!!!!!!