





       .     C     AVR-GCC.          INT0.      TIMER1,    .   ,       TCNT1  ,      4 .      .    ,     , TIMER1 ,     .

Listing 1.
//zalaczenie bramki triaka
#define GATE_ON PORTA&=0b01111111
//wylaczenie braki triaka
#define GATE_OFF PORTA|=0b10000000
//wartosc pobrana z ADC z zakresu 0 - 1023
volatile uint16_t adc = 0;
//stan pracy ukladu:
volatile uint8_t state = 0;
//1 - rozpoczecie odliczania po wykryciu przejscia przez zero
//2 - zalaczenie bramki po odliczeniu odpowiedniego opoznienia
//0 - stan spoczynkowy, oczekiwanie na impuls z detektora
//wartosc do zaladowania dla Timer1
volatile uint32_t tim1_cnt = 0;
//---------------------------------------------------------------
// OBSLUGA DETEKCJI ZERA
ISR(EXT_INT0_vect){
 //zaladowanie obliczonego wczesniej opoznienia
 TCNT1 = tim1_cnt;
 TCCR1B = (1 << CS11); //preskaler przez 8
 state = 1; //rozpoczecie odliczania
}
//---------------------------------------------------------------
// OBSLUGA BRAMKI TRIAKA
ISR(TIM1_OVF_vect){
 //po zakonczeniu zalaczenia bramki triaka
 if(state == 2){
 GATE_OFF; //wylacz bramke triaka
 TCCR1B = 0; //wylacz Timer1
 state = 0; //przejscie w stan spoczynku
 }
 //po zakonczeniu odmierzania opoznienia
 if(state == 1){
 GATE_ON; //zalacz bramke triaka
 TCNT1 = 65531; //zaladuj do odmierzenia ok. 4us
 state = 2; //oczekuj na zakonczenie impulsu
 }
}
//---------------------------------------------------------------
// GLOWNA FUNKCJA PROGRAMU
int main(void){
 //przerwanie INT0 (od zbocza narastajacego)
 //do wykrywania przejscia przez zero
 MCUCR = (1 << ISC01) | (1 << ISC00);
 GIMSK = (1 << INT0);
 //przerwanie TIM1 do generacji impulsow opozniajacych
 //oraz zalaczajacych bramke triaka
 TIMSK1 |= (1 << TOIE1);
 sei(); //aktywacja systemu przerwan
 while (1){
 //wartosci ustalone doswiadczalnie
 tim1_cnt = 55880 + (adc * 9.149);
 }
}

     (     )          ,       .   ,   ,     .




