diff --git a/include/zh_avr_ac_dimmer.h b/include/zh_avr_ac_dimmer.h index fb5785d..8d87065 100644 --- a/include/zh_avr_ac_dimmer.h +++ b/include/zh_avr_ac_dimmer.h @@ -18,10 +18,39 @@ .triac_port = 0} #ifdef __cplusplus + extern "C" { #endif +#define ZH_ZERO_CROSSING_ON \ + if (_is_zero_crossing == false) \ + { \ + switch (_init_config.triac_port) \ + { \ + case AVR_PORTB: \ + PORTB &= ~(1 << _init_config.triac_gpio); \ + break; \ + case AVR_PORTC: \ + PORTC &= ~(1 << _init_config.triac_gpio); \ + case AVR_PORTD: \ + PORTD &= ~(1 << _init_config.triac_gpio); \ + break; \ + default: \ + break; \ + } \ + _is_zero_crossing = true; \ + break; \ + } + +#define ZH_ZERO_CROSSING_OFF \ + if (_is_zero_crossing == true) \ + { \ + _is_zero_crossing = false; \ + flag = true; \ + } \ + break; + typedef enum { ZH_50HZ = 1, diff --git a/zh_avr_ac_dimmer.c b/zh_avr_ac_dimmer.c index dff7925..9dfb15e 100644 --- a/zh_avr_ac_dimmer.c +++ b/zh_avr_ac_dimmer.c @@ -1,5 +1,5 @@ #include "zh_avr_ac_dimmer.h" -// https://avr-start.ru/?p=3983 + static zh_avr_ac_dimmer_init_config_t _init_config = {0}; volatile static bool _is_dimmer_work = false; volatile static uint8_t _dimmer_value = 0; @@ -55,32 +55,33 @@ void zh_avr_ac_dimmer_isr_handler(void) case AVR_PORTB: if ((PINB & (1 << _init_config.zero_cross_gpio)) == (1 << _init_config.zero_cross_gpio)) { - PORTB &= ~(1 << _init_config.triac_gpio); - flag = true; + ZH_ZERO_CROSSING_ON; + } + if ((PINB & (1 << _init_config.zero_cross_gpio)) == 0) + { + ZH_ZERO_CROSSING_OFF; } break; case AVR_PORTC: if ((PINC & (1 << _init_config.zero_cross_gpio)) == (1 << _init_config.zero_cross_gpio)) { - PORTC &= ~(1 << _init_config.triac_gpio); - flag = true; + ZH_ZERO_CROSSING_ON; + } + if ((PINC & (1 << _init_config.zero_cross_gpio)) == 0) + { + ZH_ZERO_CROSSING_OFF; } break; case AVR_PORTD: - if (((PIND & (1 << _init_config.zero_cross_gpio)) == (1 << _init_config.zero_cross_gpio)) && _is_zero_crossing == false) + if ((PIND & (1 << _init_config.zero_cross_gpio)) == (1 << _init_config.zero_cross_gpio)) { - PORTD &= ~(1 << _init_config.triac_gpio); - // flag = true; - _is_zero_crossing = true; + ZH_ZERO_CROSSING_ON; } - if (((PIND & (1 << _init_config.zero_cross_gpio)) == 0) && _is_zero_crossing == true) + if ((PIND & (1 << _init_config.zero_cross_gpio)) == 0) { - // PORTD &= ~(1 << _init_config.triac_gpio); - _is_zero_crossing = false; - flag = true; + ZH_ZERO_CROSSING_OFF; } break; - default: break; } @@ -90,24 +91,17 @@ void zh_avr_ac_dimmer_isr_handler(void) { if (_dimmer_value == 100) { - // cli(); TIMSK0 &= ~(1 << OCIE0A); - // sei(); switch (_init_config.triac_port) { case AVR_PORTB: PORTB |= (1 << _init_config.triac_gpio); - // _delay_us(ZH_TRIAC_TIME); - // PORTB &= ~(1 << _init_config.triac_gpio); break; case AVR_PORTC: PORTC |= (1 << _init_config.triac_gpio); - // _delay_us(ZH_TRIAC_TIME); - // PORTC &= ~(1 << _init_config.triac_gpio); + break; case AVR_PORTD: PORTD |= (1 << _init_config.triac_gpio); - // _delay_us(10); - // PORTD &= ~(1 << _init_config.triac_gpio); break; default: break; @@ -115,11 +109,9 @@ void zh_avr_ac_dimmer_isr_handler(void) } else { - // cli(); TCNT0 = 0; TIFR0 = (1 << OCF0A); TIMSK0 |= (1 << OCIE0A); - // sei(); } } } @@ -182,22 +174,23 @@ static void _zh_avr_ac_dimmer_gpio_init(void) static avr_err_t _zh_avr_ac_dimmer_timer_init(void) { + // Frequency calculator http://rcl-radio.ru/?p=111487. TCCR0A |= (1 << WGM01); switch (F_CPU) { - case 8000000: + case 8000000: // When operating from an internal RC generator, frequency deviation of up to 5% is possible. switch (_init_config.ac_dimmer_frequency) { case ZH_50HZ: - OCR0A = 94; // Check. 99 + OCR0A = 94; // Timer tick every 0,00009524 sec. TCCR0B |= (1 << CS01); break; - case ZH_60HZ: - OCR0A = 82; + case ZH_60HZ: // Timer tick every 0,00007937 sec. + OCR0A = 78; TCCR0B |= (1 << CS01); break; - case ZH_400HZ: - OCR0A = 99; + case ZH_400HZ: // Timer tick every 0,0000119 sec. + OCR0A = 94; TCCR0B |= (1 << CS00); break; default: @@ -207,15 +200,15 @@ static avr_err_t _zh_avr_ac_dimmer_timer_init(void) case 16000000: switch (_init_config.ac_dimmer_frequency) { - case ZH_50HZ: + case ZH_50HZ: // Timer tick every 0,0001 sec. OCR0A = 24; TCCR0B |= (1 << CS01) | (1 << CS00); break; - case ZH_60HZ: + case ZH_60HZ: // Timer tick every 0,00008333 sec. OCR0A = 165; TCCR0B |= (1 << CS01); break; - case ZH_400HZ: + case ZH_400HZ: // Timer tick every 0,0000125 sec. OCR0A = 24; TCCR0B |= (1 << CS01); break; @@ -226,15 +219,15 @@ static avr_err_t _zh_avr_ac_dimmer_timer_init(void) case 20000000: switch (_init_config.ac_dimmer_frequency) { - case ZH_50HZ: + case ZH_50HZ: // Timer tick every 0,0001 sec. OCR0A = 249; TCCR0B |= (1 << CS01); break; - case ZH_60HZ: + case ZH_60HZ: // Timer tick every 0,00008333 sec. OCR0A = 207; TCCR0B |= (1 << CS01); break; - case ZH_400HZ: + case ZH_400HZ: // Timer tick every 0,0000125 sec. OCR0A = 249; TCCR0B |= (1 << CS00); break; @@ -277,5 +270,4 @@ ISR(TIMER0_COMPA_vect) } } TIFR0 = (1 << OCF0A); - // ++_dimmer_count; } \ No newline at end of file