VAmos a ver el problema es en una comunicacion serie RS232 por IR, funciona bien pero si se interrumpe la comunicacion, la cual se produce cada 15 seg, al cabo de mas o menos 1 min salta alarma por medio de una interrupcion y vuelve a esperar el siguiente dato. Aunque el emisor lo manda el receptor despues de la interrupcion no se entera de nada.
En el proteus se ve bien.
De todas formas os pego el codigo de emisor y recpetor. mientras a ver si me decis como pegar el proteus.
Gracias
Emisor
//***************************************************************************
//******
//******
//****** NOTE: usa compilador: PCW v2.619
//******
//******
//******
//****************************************************************************
#include <12C508A.H>
#use delay(clock=1000000,RESTART_WDT)
#fuses XT,NOWDT
// define el puerto serie como 9660. 8 bits sin paridad y
// salida por pin RB4 y entrada de datos por pin RB6
// ojo señal invertida en la salida rs232 para que no se quede el led IR encendido led
#use RS232(BAUD=300, BITS=8, PARITY=N, XMIT=PIN_B1, RCV=PIN_B2, RESTART_WDT)
//#use fast_io(B)
// el emisor usa la entrada RA0 como deteccion de puesta en marcha y paro
// la salida RB4 es la salida de datos al diodo IR
//*********************
// PROGRAMA PRINCIPAL *
//*********************
void delay_seconds(int n)
{
for (;n!=0; n--)
delay_ms( 1000 );
}
void main()
{
set_tris_b(0x01111111); //
While(1)
{
// el retardo se usa para no estar enviando permanentemente en mensaje y conservar la bateria del emisor
delay_seconds(15);
// si esta activa Ra0 envia por el puerto E de Encender
// si Ra0 esta a cero envia por el puerto A de Apagar
if(input(PIN_B0))
putc("E");
else
putc("A");
}
}
REceptor (que es donde esta el fallo)
//***************************************************************************
//******
//******
//****** NOTA: usa compilador: PCW v2.619 o posterior
//******
//******
//******
//****************************************************************************
#include <16F84A.H>
#use delay(clock=1000000)
#fuses XT,NOWDT,PUT
// define el puerto serie como 300 Baudios 8 bits sin paridad y
// salida por pin RB0 y entrada de datos por pin RB6
#use RS232(BAUD=300, BITS=8, PARITY=N, XMIT=PIN_B1, RCV=PIN_B6)
// la entrada RB6 como entrada de datos del receptor
// la salida RA1 sera la que active el rele
#use fast_io(B)
byte int_count1; // Numero de interrupciones antes de que el contador este a cero
int tiempo_seguridad;
int flag_interrp=1;
// Rutina que se activa por la interrupcion
// esta funcion se llama cada vez que el timer rebosa
// se decrementa en 1 int_cont1 y si llega a cero
// se pone a cero la salida del rele
// Se usa para que no se quede activado
// si al cabo del tiempo no le han llegado datos
// automaticamente se apaga y espera
// una nueva orden de encendido
#int_rtcc
clock_isr()
{
if(--int_count1==0)
{
int_count1 = tiempo_seguridad;
output_low(PIN_A1); // si pasado el tiempo no le han llegado datos desconecta la salida y
//output_low(PIN_B0); // apaga el led de encendido hasta que le vuelven a llegar datos
flag_interrp=0;
set_rtcc(0);
}
}
// ***************************
// Programa principal
//****************************
void main(){
set_rtcc(0);
setup_counters(RTCC_INTERNAL, RTCC_DIV_256);
enable_interrupts(INT_RTCC);
enable_interrupts(GLOBAL);
set_tris_b(0x10); // PIN_B = Entradas
set_tris_a(0xff); // PIN_A = Salidas
tiempo_seguridad=2000; // aproximadamente un minuto sin recibir dato y apaga el sistema
output_high(PIN_B0); // enciende el led de encendido
While(1)
{
if(flag_interrp==0)
{
output_low(PIN_B0);
delay_ms(100);
output_high(PIN_B0);
delay_ms(100);
}
if(kbhit())
switch(getch())
{
case "E":
flag_interrp=1;
set_rtcc(0);
int_count1=tiempo_seguridad;
output_high(PIN_A1);
output_low(PIN_B0); // si le llegan datos parpadea el led de encendido durante 1/2 seg
delay_ms(500);
output_high(PIN_B0);
break;
case "A":
flag_interrp=1;
set_rtcc(0);
int_count1=tiempo_seguridad;
output_high(PIN_A1);
output_low(PIN_B0);
delay_ms(500);
output_high(PIN_B0); // si le llegan datos parpadea el led de encendido
break;
}
}
}