#include <12F675.h>
#device adc=10
#FUSES NOWDT, INTRC_IO, NOCPD, NOPROTECT, NOMCLR, NOPUT, NOBROWNOUT, BANDGAP_HIGH, RESERVED
#use delay(clock=4000000)
#bit Led=0x85.1
int RPM=false;
short Sleep_Mode;
const int FMax=60; //frecuencia maxima de corte en Hz
const int FTyp=50; //frecuencia tipica de operacion en Hz
const int FMin=46; //frecuencia minima de corte en Hz
const int T_Retry=30; //tiempo de espera para reintentar activar campo en Segundos
const long Vmax=536; //Voltaje maximo de operacion en escala de 0 a 1024
const long VMin=488; //Voltaje minimo de operacion en escala de 0 a 1024
const long T_Auto=2; //Tiempo de activacion del campo antes de regulador en Segundos
long Freqcount(void)
{int cycles8, cycles;
long freq;
cycles8=0x00;
cycles=0x00;
set_timer1(0);
setup_timer_1(T1_External|T1_Div_By_1);
while (cycles!=0xFF)
{cycles8=0x00;
while (cycles8!=0xFF)
{delay_cycles(0x09);
cycles8++;}
delay_cycles(0x55);
cycles++;}
delay_cycles(0x8D);
setup_timer_1(T1_Disabled);
freq=get_timer1();
return(freq);}
void Turn_On(long Time)
{long Frq=0;
long VW=0;
long TO=0;
output_low(pin_a1);
output_high(pin_a4);
while ((VW<=VMin||frq<=FTyp-1)&&TO<=Time)
{frq= freqcount();
if (frq>=FTyp-1) RPM=true;
VW=Read_Adc();
if (VW>=Vmin) {output_low(pin_a2);output_low(pin_a4);}
TO++;
if (Time==0xFFFF)
{TO=0;if (led==0) output_float(pin_a1); else output_low(pin_a1);}}
if (TO>=Time)
{output_low(pin_a4);output_high(pin_a1);output_high(pin_a2);}
}
void Turn_Off(void)
{output_high(pin_a1);
output_high(pin_a2);
RPM=false;}
#int_RA
void RA_isr(void)
{if (input(pin_a3)&&sleep_mode==true) sleep_mode=true;}
void main(void)
{delay_ms(200);
long VD;
long msec,sec;
long Timer=0xFFFF;
setup_adc_ports(sAN0|VSS_VDD);
setup_adc(ADC_Clock_Div_2);
setup_timer_0(RTCC_Internal|RTCC_Div_1);
setup_comparator(NC_NC);
setup_vref(false);
set_tris_a(0x29);
set_adc_channel(0);
enable_interrupts(Int_RA3);
enable_interrupts(Global);
output_low(pin_a4);
output_high(pin_a2);
output_high(pin_a1);
sleep_mode=false;
sec=t_retry;
while (true)
{if (sleep_mode==true) sleep();
if (RPM==true)
{VD=Read_Adc();
if (VD>=VMin&&VD<=VMax) output_low(pin_a1); else output_high(pin_a1);
VD=freqcount();
if (VD<=FMin||VD>=Fmax) {Turn_Off();sec=0;Timer=T_Auto;}}
else if (sleep_mode==false)
{delay_ms(1);
msec++;
if (msec>=0x03E7)
{msec=0;sec++;if (led==0) output_float(pin_a1); else output_high(pin_a1);}
if (sec>=T_Retry) {Turn_On(Timer);sec=0;}}
if (!input(pin_a3))
{while(!input(pin_a3)) true;
if (RPM==true) {Turn_Off();output_float(pin_a1);sleep_mode=true;}
else
if (sleep_mode==true) {sleep_mode=false;sec=T_Retry;timer=0xFFFF;} else {sleep_mode=true;output_float(pin_a1);}
}
}
}