wip:
This commit is contained in:
		| @@ -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, | ||||
|   | ||||
| @@ -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; | ||||
| } | ||||
		Reference in New Issue
	
	Block a user