#include<12F629.h>
#fuses INTRC_IO,MCLR,NOBROWNOUT,NOWDT,PROTECT
#use delay(clock=4M)
#zero_ram
#define subida 1
#define bajada 0
#define on output_low
#define off output_high
#define toggle output_toggle
#define GATE pin_a0
#define CHANGE pin_a4
#define LED pin_a1
#define ApagarLED on(LED)
#define EncenderLED off(LED)
struct BytesFase
{
int SetPoint;
short Flanco;
int IntsTimer;
short Estado;
short TLed;
} CtrlFase;
struct BytesTimer
{
int Ints;
short TimeOk;
}Timer1;
#int_EXT
void ZeroCross_isr(void)
{
if(CtrlFase.Flanco==subida)
{
enable_interrupts(INT_TIMER0);
ext_int_edge(H_TO_L);
CtrlFase.Flanco = bajada;
if(CtrlFase.TLed)
toggle(LED);
}
else
{
enable_interrupts(INT_TIMER0);
ext_int_edge(L_TO_H);
CtrlFase.Flanco = subida;
}
}
#int_TIMER0
void TimeGate_isr(void)
{
CtrlFase.IntsTimer++;
if(CtrlFase.IntsTimer>CtrlFase.SetPoint)
{
on(GATE);
delay_us(150);
off(GATE);
CtrlFase.IntsTimer=0;
disable_interrupts(INT_TIMER0);
}
set_timer0(0);
}
#int_TIMER1
void TiempoOff_isr(void)
{
Timer1.Ints++;
if(Timer1.Ints>=115)
{
Timer1.Ints=0;
Timer1.TimeOk=1;
}
}
void main(void)
{
setup_comparator(NC_NC_NC_NC);
setup_timer_0(RTCC_INTERNAL | RTCC_8_BIT | RTCC_DIV_1);
setup_timer_1(T1_INTERNAL | T1_DIV_BY_8);
ext_int_edge(L_TO_H);
enable_interrupts(INT_EXT);
disable_interrupts(INT_TIMER1);
enable_interrupts(GLOBAL);
CtrlFase.Flanco=subida;
CtrlFase.SetPoint=23;
ApagarLED;
while(true)
{
if(input_state(CHANGE))
{
if(Timer1.TimeOk)
{
CtrlFase.SetPoint=23;
CtrlFase.TLed = 0;
ApagarLED;
}
else
{
CtrlFase.SetPoint = 15;
CtrlFase.TLed = 1;
enable_interrupts(INT_TIMER1);
}
}
else
{
CtrlFase.SetPoint = 5;
CtrlFase.TLed = 0;
disable_interrupts(INT_TIMER1);
Timer1.TimeOk=0;
Timer1.Ints=0;
EncenderLED;
}
}
}