#INCLUDE <12F1840.h>
#device PASS_STRINGS=IN_RAM
#FUSES INTRC_IO
#FUSES WDT
#FUSES PUT
#FUSES NOMCLR
#FUSES NOPROTECT
#FUSES NOCPD
#FUSES NOBROWNOUT
#FUSES NOCLKOUT
#FUSES NOIESO
#FUSES FCMEN
#FUSES NOWRT
#FUSES PLL_SW
#FUSES STVREN
#FUSES NODEBUG
#FUSES NOLVP
#USE delay (Clock = 16000000,RESTART_WDT)
#use fast_io(A)
#locate Puerto_A = 0xf92
#bit Pgm_Cod = Puerto_A.4
#bit Led_Cod_OK = Puerto_A.0
#bit Led_Cod_Error = Puerto_A.1
#bit Config = Puerto_A.5
#bit Dato_entrada = Puerto_A.2
int Estado = 0;
#bit Bien = Estado.0
#bit Mal = Estado.1
#bit Comienzo = Estado.2
#bit Fin = Estado.3
#bit Estado_inicial = Estado.4
#bit Escaneo_tiempo = Estado.5
#bit Nuevo_Codigo = Estado.6
#bit Abrir_Cerrar = Estado.7
long Tiempo,Tiempo_Max,Tiempo_Min,Reset;
int i,Contador,Contador_Unos,Codigo[3],Salto,aux,Contador_Codigo,Auxiliar[3];
void Inicializacion_dispositivo ();
void Demora_ms(long tiempo_ms);
void Tiempo_Bajo ();
void Tiempo_Alto ();
void Decodificacion_cero ();
void Decodificacion_uno ();
void Decodificacion_Codigo ();
void Registro_codigos ();
void Guardar_Codigo_Eeprom ();
void Leer_codigo ();
void Configurar ();
#int_timer0
void Reset_temp (void)
{
Reset++;
}
void main()
{
Inicializacion_dispositivo();
Led_Cod_Error = 1;
Demora_ms (500);
Led_Cod_Error = 0;
Demora_ms (500);
Salto = read_eeprom (125);
for (;;)
{
if (Pgm_Cod == true)
Registro_codigos ();
if (Config == true)
Configurar ();
Leer_codigo ();
}
}
void Demora_ms(long tiempo_ms)
{
while (--tiempo_ms)
delay_ms(1);
}
void Inicializacion_dispositivo(void)
{
setup_oscillator(OSC_16MHZ);
setup_adc_ports(NO_ANALOGS|VSS_VDD);
setup_adc(ADC_OFF);
setup_dac(DAC_OFF);
setup_spi(SPI_SS_DISABLED);
setup_ccp1(CCP_OFF);
setup_comparator(NC_NC);
set_tris_a (0b111100);
output_a (0);
setup_timer_1 (T1_INTERNAL | T1_DIV_BY_4);
setup_timer_0 (T0_DIV_256);
enable_interrupts (GLOBAL);
}
void Registro_codigos (void)
{
while (Pgm_Cod == true);
Reset= 0;
clear_interrupt (INT_TIMER0);
enable_interrupts (INT_TIMER0);
while ((Bien == 0)&(Reset<611))
{
Contador_Codigo = 0;
Mal = 0;
Nuevo_Codigo = 0;
for (i=0;i<3;i++)
Auxiliar[i] = 0;
do
{
for (i=0;i<3;i++)
Codigo[i] = 0;
Contador = 25;
Contador_Unos = 0;
Tiempo_Max = 0;
Tiempo_Min = 0xFFFF;
while (Contador!=0)
{
Tiempo_Bajo ();
if (Tiempo_Max<Tiempo)
Tiempo_Max = Tiempo;
Contador--;
}
Contador = 25;
while (((Tiempo_Max-(Tiempo_Max/16))>Tiempo)&(Contador!=0))
{
Tiempo_Bajo ();
Contador--;
}
Decodificacion_Codigo ();
if (Nuevo_Codigo == 0)
{
for (i=0;i<3;i++)
Auxiliar[i]=Codigo[i];
if ((Codigo[0]==0)&(Codigo[1]==0)&(Codigo[2]==0))
Mal = 1;
}
if ((Mal == 0)&(Nuevo_Codigo == 1))
{
if (Auxiliar[0] == Codigo[0])
{
if (Auxiliar[1] == Codigo[1])
{
if (Auxiliar[2] == Codigo[2])
Bien = 1;
else
{
Mal = 1;
Bien = 0;
}
}
else
{
Mal = 1;
Bien = 0;
}
}
else
{
Mal = 1;
Bien = 0;
}
}
Contador_Codigo++;
Nuevo_Codigo = 1;
}while ((Mal == 0)&(Contador_Codigo < 4));
}
disable_interrupts (INT_TIMER0);
if (Bien == 1)
{
Guardar_Codigo_Eeprom();
Led_Cod_OK = 1;
Demora_ms (1000);
Led_Cod_OK = 0;
}
else
{
Led_Cod_Error = 1;
Demora_ms (1000);
Led_Cod_Error = 0;
}
Bien = 0;
Mal = 0;
}
void Tiempo_Bajo (void)
{
while(Dato_entrada == 1);
set_timer1(0);
while(Dato_entrada == 0);
Tiempo = get_timer1();
}
void Tiempo_Alto (void)
{
while(Dato_entrada == 0);
set_timer1(0);
while(Dato_entrada == 1);
Tiempo = get_timer1();
}
void Decodificacion_cero (void)
{
shift_left(Codigo,3,0);
}
void Decodificacion_uno (void)
{
shift_left(Codigo,3,1);
}
void Guardar_Codigo_Eeprom (void)
{
if (Salto>120)
Salto = 0;
for (i=0;i<3;i++)
{
aux = Codigo[i];
write_eeprom(i+Salto,aux);
}
if (make16(read_eeprom(126),read_eeprom(127))>Tiempo_Max)
{
write_eeprom(126,make8(Tiempo_Max,1));
write_eeprom(127,make8(Tiempo_Max,0));
}
Salto+=3;
write_eeprom(125,Salto);
}
void Leer_codigo (void)
{
for (i=0;i<3;i++)
Codigo[i] = 0;
Contador = 25;
Contador_Unos = 0;
Tiempo_Min = 0xFFFF;
Tiempo_Max = make16(read_eeprom(126),read_eeprom(127));
Tiempo_Bajo ();
if ((Tiempo_Max-(Tiempo_Max/16))<Tiempo)
{
Decodificacion_Codigo ();
if (Mal == 0)
{
for (i=0;i<120;i+=3)
{
if (Bien == 0)
{
if (read_eeprom(1+i) == Codigo[1])
{
if (read_eeprom(2+i) == Codigo[2])
{
if (read_eeprom(0+i) == Codigo[0])
{
Bien = 1;
Mal = 0;
}
else
Mal = 1;
}
else
Mal = 1;
}
else
Mal = 1;
}
}
}
if (Bien == 1)
{
output_toggle(PIN_A0);
Demora_ms(500);
}
Bien = 0;
Mal = 0;
}
}
void Configurar (void)
{
while (Config == true);
Demora_ms(20);
for (i=0;i<128;i++)
{
write_eeprom(i,0xFF);
}
Led_Cod_OK = 1;
Led_Cod_Error = 1;
Demora_ms (333);
Led_Cod_OK = 0;
Led_Cod_Error = 0;
Demora_ms (333);
Led_Cod_OK = 1;
Led_Cod_Error = 1;
Demora_ms (333);
Led_Cod_OK = 0;
Led_Cod_Error = 0;
Demora_ms (333);
Led_Cod_OK = 1;
Led_Cod_Error = 1;
Demora_ms (333);
Led_Cod_OK = 0;
Led_Cod_Error = 0;
}
void Decodificacion_Codigo (void)
{
do
{
Contador_Unos++;
Tiempo_Bajo();
if (Tiempo_Min>Tiempo)
Tiempo_Min = Tiempo;
}while(((Tiempo_Max-(Tiempo_Max/16))>Tiempo)&(Contador_Unos<26));
if (Contador_Unos == 25)
Contador_Unos--;
if (Contador_Unos == 13)
{
Contador_Unos--;
do
{
Tiempo_Bajo();
if ((Tiempo_Min+(Tiempo_Min/2))>Tiempo)
Decodificacion_cero();
else
Decodificacion_uno();
Contador_Unos--;
}while(Contador_Unos != 0);
}
else
{
if ((Contador_Unos==24)|(Contador_Unos==18))
{
do
{
Tiempo_Alto();
if ((Tiempo_Min+(Tiempo_Min/2))>Tiempo)
Decodificacion_cero();
else
Decodificacion_uno();
Contador_Unos--;
}while(Contador_Unos != 0);
}
else
Mal = 1;
}
}