Professional Documents
Culture Documents
SPCL Tpic
SPCL Tpic
PIN_D2
#include <16F877A.h>
#device ADC = 10
#fuses HS,NOWDT,NOPROTECT,NOLVP
#use delay(clock = 20MHz)
#use fast_io(d)
#byte OPTION_REG = GETENV("SFR:OPTION_REG") // get OPTION_REG register address
#bit INTEDG = OPTION_REG.6 // INTEDG (external interrupt edge) bit address
( OPTION_REG(6) )
int1 ZC = 0;
int16 alpha;
#INT_EXT // external interrupt ISR
void ext_isr(void)
{
ZC = 1;
// toggle external interrupt edge
if(INTEDG) INTEDG = 0;
else INTEDG = 1;
}
void main()
{
output_low(triac_gate);
output_drive(triac_gate);
setup_adc(ADC_CLOCK_INTERNAL); // set ADC clock source
setup_adc_ports(AN0); // configure AN0 pin as analog
set_adc_channel(0); // select channel AN0
clear_interrupt(INT_EXT); // clear external interrupt flag bit
enable_interrupts(GLOBAL); // enable global interrupts
enable_interrupts(INT_EXT); // enable external interrupt
delay_ms(500);
while(TRUE)
{
alpha = ( 1023 - read_adc() ) * 10;
if (alpha > 9500)
alpha = 9500;
else if (alpha < 200)
alpha = 0;
while(ZC == 0) ; // wait for zero crossing event
// send firing pulse after alpha
delay_us(alpha);
output_high(triac_gate);
delay_us(200);
output_low(triac_gate);
ZC = 0;
}
}
// End of code