El problema es que con un 16f84 leo un receptor de IR, en comunicacion serie. El sistema funciona bien en Proteus y fisicamente, y de hecho trabaja bien hasta que se genera una interrupcion en el pic.
Parece mentira pero si esta a corta distancia del emisor funciona siempre con o sin interrupcion, pero a mucha distancia funciona siempre que no se genere la interrupcion.
No logro entenderlo, se que es un problema extraño pero pienso que es de hard y no de soft, de todas formas pego el codigo a ver si alguien logra acalararme que tiene que ver la distancia con la interrupcion,
//***************************************************************************
//******
//******
//****** 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;
// 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
}
}
// ***************************
// 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)
{
while(!kbhit())
{
switch(getch())
{
case "E":
output_high(PIN_A1);
int_count1=tiempo_seguridad;
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":
output_low(PIN_A1);
int_count1=tiempo_seguridad;
output_low(PIN_B0);
delay_ms(500);
output_high(PIN_B0); // si le llegan datos parpadea el led de encendido
break;
}
}
}
}
Si necesitan mas datos pidanlos
Gracias