#include <16F876.h>
//#device adc=8
#FUSES NOWDT //Watch Dog Timer
#FUSES XT //High speed Osc (> 4mhz for PCM/PCH) (>10mhz for PCD)
#FUSES NOPUT //No Power Up Timer
#FUSES NOPROTECT //Code not protected from reading
#FUSES NOBROWNOUT //No brownout reset
#FUSES NOLVP //No low voltage prgming, B3(PIC16) or B5(PIC18) used for I/O
#FUSES NOCPD //No EE protection
#FUSES NOWRT //Program memory not write protected
#FUSES NODEBUG //No Debug mode for ICD
#use delay(clock=4000000)
#use fast_io(A)
#use fast_io(B)
#use fast_io(C)
short f_c_abrir = 1;
short f_c_cerrar = 1;
short cierre_aut = 0;
short modo_mando = 0;
short abrir = 1;
short cerrar = 1;
short parar = 1;
short contacto_fotocelula = 1;
short modo_luz = 0;
short bandera_luz = 0;
short flag_abre = 0;
short flag = 1;
int tiempo_sel_cierre = 0;
int salida = 1; // Todo a 0 y celula apagada
int def_micros = 0;
int lee_micros;
int entrada = 0;
int lee_entrada;
long tiempo_acu_luz = 0;
long tiempo_acu_cerrar = 0;
#int_TIMER1
void TIMER1_isr(void)
{
if(bandera_luz){
tiempo_acu_luz++;
}
if(tiempo_acu_luz==458){
bandera_luz=0;
bit_clear(salida,3);
tiempo_acu_luz=0;
}
}
void main()
{
setup_adc_ports(NO_ANALOGS);
setup_spi(SPI_SS_DISABLED);
setup_timer_1(T1_INTERNAL|T1_DIV_BY_8);
setup_ccp1(CCP_OFF);
set_tris_a (0b111111);
set_tris_b (0b11111111);
set_tris_c (0b11110000);
while(true)
{
lee_micros=input_b();
if(lee_micros!=def_micros){
def_micros=lee_micros;
modo_mando=bit_test(def_micros,7);
modo_luz=bit_test(def_micros,6);
cierre_aut=bit_test(def_micros,5);
tiempo_sel_cierre=def_micros & 15;
}
lee_entrada=input_a();
if(lee_entrada!=entrada){
flag=0;
entrada=lee_entrada;
f_c_abrir=bit_test(entrada,4);
f_c_cerrar=bit_test(entrada,5);
abrir=bit_test(entrada,0);
cerrar=bit_test(entrada,1);
parar=bit_test(entrada,2);
contacto_fotocelula=bit_test(entrada,3);
flag=1;
}
if(!f_c_abrir && !abrir){
bit_clear(salida,1);
bit_clear(salida,2);
abrir=1;
}
if(!f_c_cerrar && !cerrar){
bit_clear(salida,1);
bit_clear(salida,2);
cerrar=1;
bit_set(salida,0);
}
if(bandera_luz){
bit_set(salida,3);
}
if(!modo_mando){ // Modo 3 pulsadores
if(!abrir){
bit_set(salida,1);
bit_clear(salida,2);
abrir=1;
bit_set(salida,0);
if(!modo_luz){
bandera_luz=1;
}
}
if(!cerrar){
bit_set(salida,2);
bit_clear(salida,1);
bit_clear(salida,0);
}
if(!cerrar && !contacto_fotocelula){
bit_clear(salida,2);
bit_set(salida,1);
bit_set(salida,0);
cerrar=1;abrir=0;
}
if(!parar){
bit_clear(salida,1);
bit_clear(salida,2);
parar=1;
bit_set(salida,0);
}
}
if(modo_mando) // Modo 1 pulsador
{
if(flag_abre && !abrir & parar){
bit_clear(salida,2);
bit_clear(salida,1);
flag_abre=0;
parar=1;
abrir=1;
}
if(!flag_abre && !abrir & parar){
bit_clear(salida,1);
bit_clear(salida,2);
flag_abre=1;
parar=1;
abrir=1;
}
if(flag_abre && !abrir){
bit_set(salida,2);
bit_clear(salida,1);
flag_abre=0;
parar=1;
abrir=1;
}
if(!flag_abre && !abrir){
bit_set(salida,1);
bit_clear(salida,2);
flag_abre=1;
parar=1;
abrir=1;
}
if(!flag_abre && !contacto_fotocelula){
bit_clear(salida,2);
bit_set(salida,1);
bit_set(salida,0);
flag_abre=1;
parar=1;
}
}
output_c(salida);
}
}