You are on page 1of 2

#define triac_gate 

   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

You might also like