wip:
This commit is contained in:
		| @@ -18,10 +18,39 @@ | |||||||
|         .triac_port = 0} |         .triac_port = 0} | ||||||
|  |  | ||||||
| #ifdef __cplusplus | #ifdef __cplusplus | ||||||
|  |  | ||||||
| extern "C" | extern "C" | ||||||
| { | { | ||||||
| #endif | #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 |     typedef enum | ||||||
|     { |     { | ||||||
|         ZH_50HZ = 1, |         ZH_50HZ = 1, | ||||||
|   | |||||||
| @@ -1,5 +1,5 @@ | |||||||
| #include "zh_avr_ac_dimmer.h" | #include "zh_avr_ac_dimmer.h" | ||||||
| // https://avr-start.ru/?p=3983 |  | ||||||
| static zh_avr_ac_dimmer_init_config_t _init_config = {0}; | static zh_avr_ac_dimmer_init_config_t _init_config = {0}; | ||||||
| volatile static bool _is_dimmer_work = false; | volatile static bool _is_dimmer_work = false; | ||||||
| volatile static uint8_t _dimmer_value = 0; | volatile static uint8_t _dimmer_value = 0; | ||||||
| @@ -55,32 +55,33 @@ void zh_avr_ac_dimmer_isr_handler(void) | |||||||
|     case AVR_PORTB: |     case AVR_PORTB: | ||||||
|         if ((PINB & (1 << _init_config.zero_cross_gpio)) == (1 << _init_config.zero_cross_gpio)) |         if ((PINB & (1 << _init_config.zero_cross_gpio)) == (1 << _init_config.zero_cross_gpio)) | ||||||
|         { |         { | ||||||
|             PORTB &= ~(1 << _init_config.triac_gpio); |             ZH_ZERO_CROSSING_ON; | ||||||
|             flag = true; |         } | ||||||
|  |         if ((PINB & (1 << _init_config.zero_cross_gpio)) == 0) | ||||||
|  |         { | ||||||
|  |             ZH_ZERO_CROSSING_OFF; | ||||||
|         } |         } | ||||||
|         break; |         break; | ||||||
|     case AVR_PORTC: |     case AVR_PORTC: | ||||||
|         if ((PINC & (1 << _init_config.zero_cross_gpio)) == (1 << _init_config.zero_cross_gpio)) |         if ((PINC & (1 << _init_config.zero_cross_gpio)) == (1 << _init_config.zero_cross_gpio)) | ||||||
|         { |         { | ||||||
|             PORTC &= ~(1 << _init_config.triac_gpio); |             ZH_ZERO_CROSSING_ON; | ||||||
|             flag = true; |         } | ||||||
|  |         if ((PINC & (1 << _init_config.zero_cross_gpio)) == 0) | ||||||
|  |         { | ||||||
|  |             ZH_ZERO_CROSSING_OFF; | ||||||
|         } |         } | ||||||
|         break; |         break; | ||||||
|     case AVR_PORTD: |     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); |             ZH_ZERO_CROSSING_ON; | ||||||
|             // flag = true; |  | ||||||
|             _is_zero_crossing = true; |  | ||||||
|         } |         } | ||||||
|         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); |             ZH_ZERO_CROSSING_OFF; | ||||||
|             _is_zero_crossing = false; |  | ||||||
|             flag = true; |  | ||||||
|         } |         } | ||||||
|         break; |         break; | ||||||
|  |  | ||||||
|     default: |     default: | ||||||
|         break; |         break; | ||||||
|     } |     } | ||||||
| @@ -90,24 +91,17 @@ void zh_avr_ac_dimmer_isr_handler(void) | |||||||
|         { |         { | ||||||
|             if (_dimmer_value == 100) |             if (_dimmer_value == 100) | ||||||
|             { |             { | ||||||
|                 // cli(); |  | ||||||
|                 TIMSK0 &= ~(1 << OCIE0A); |                 TIMSK0 &= ~(1 << OCIE0A); | ||||||
|                 // sei(); |  | ||||||
|                 switch (_init_config.triac_port) |                 switch (_init_config.triac_port) | ||||||
|                 { |                 { | ||||||
|                 case AVR_PORTB: |                 case AVR_PORTB: | ||||||
|                     PORTB |= (1 << _init_config.triac_gpio); |                     PORTB |= (1 << _init_config.triac_gpio); | ||||||
|                     // _delay_us(ZH_TRIAC_TIME); |  | ||||||
|                     // PORTB &= ~(1 << _init_config.triac_gpio); |  | ||||||
|                     break; |                     break; | ||||||
|                 case AVR_PORTC: |                 case AVR_PORTC: | ||||||
|                     PORTC |= (1 << _init_config.triac_gpio); |                     PORTC |= (1 << _init_config.triac_gpio); | ||||||
|                     // _delay_us(ZH_TRIAC_TIME); |                     break; | ||||||
|                     // PORTC &= ~(1 << _init_config.triac_gpio); |  | ||||||
|                 case AVR_PORTD: |                 case AVR_PORTD: | ||||||
|                     PORTD |= (1 << _init_config.triac_gpio); |                     PORTD |= (1 << _init_config.triac_gpio); | ||||||
|                     // _delay_us(10); |  | ||||||
|                     // PORTD &= ~(1 << _init_config.triac_gpio); |  | ||||||
|                     break; |                     break; | ||||||
|                 default: |                 default: | ||||||
|                     break; |                     break; | ||||||
| @@ -115,11 +109,9 @@ void zh_avr_ac_dimmer_isr_handler(void) | |||||||
|             } |             } | ||||||
|             else |             else | ||||||
|             { |             { | ||||||
|                 // cli(); |  | ||||||
|                 TCNT0 = 0; |                 TCNT0 = 0; | ||||||
|                 TIFR0 = (1 << OCF0A); |                 TIFR0 = (1 << OCF0A); | ||||||
|                 TIMSK0 |= (1 << OCIE0A); |                 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) | static avr_err_t _zh_avr_ac_dimmer_timer_init(void) | ||||||
| { | { | ||||||
|  |     // Frequency calculator http://rcl-radio.ru/?p=111487. | ||||||
|     TCCR0A |= (1 << WGM01); |     TCCR0A |= (1 << WGM01); | ||||||
|     switch (F_CPU) |     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) |         switch (_init_config.ac_dimmer_frequency) | ||||||
|         { |         { | ||||||
|         case ZH_50HZ: |         case ZH_50HZ: | ||||||
|             OCR0A = 94; // Check. 99 |             OCR0A = 94; // Timer tick every 0,00009524 sec. | ||||||
|             TCCR0B |= (1 << CS01); |             TCCR0B |= (1 << CS01); | ||||||
|             break; |             break; | ||||||
|         case ZH_60HZ: |         case ZH_60HZ: // Timer tick every 0,00007937 sec. | ||||||
|             OCR0A = 82; |             OCR0A = 78; | ||||||
|             TCCR0B |= (1 << CS01); |             TCCR0B |= (1 << CS01); | ||||||
|             break; |             break; | ||||||
|         case ZH_400HZ: |         case ZH_400HZ: // Timer tick every 0,0000119 sec. | ||||||
|             OCR0A = 99; |             OCR0A = 94; | ||||||
|             TCCR0B |= (1 << CS00); |             TCCR0B |= (1 << CS00); | ||||||
|             break; |             break; | ||||||
|         default: |         default: | ||||||
| @@ -207,15 +200,15 @@ static avr_err_t _zh_avr_ac_dimmer_timer_init(void) | |||||||
|     case 16000000: |     case 16000000: | ||||||
|         switch (_init_config.ac_dimmer_frequency) |         switch (_init_config.ac_dimmer_frequency) | ||||||
|         { |         { | ||||||
|         case ZH_50HZ: |         case ZH_50HZ: // Timer tick every 0,0001 sec. | ||||||
|             OCR0A = 24; |             OCR0A = 24; | ||||||
|             TCCR0B |= (1 << CS01) | (1 << CS00); |             TCCR0B |= (1 << CS01) | (1 << CS00); | ||||||
|             break; |             break; | ||||||
|         case ZH_60HZ: |         case ZH_60HZ: // Timer tick every 0,00008333 sec. | ||||||
|             OCR0A = 165; |             OCR0A = 165; | ||||||
|             TCCR0B |= (1 << CS01); |             TCCR0B |= (1 << CS01); | ||||||
|             break; |             break; | ||||||
|         case ZH_400HZ: |         case ZH_400HZ: // Timer tick every 0,0000125 sec. | ||||||
|             OCR0A = 24; |             OCR0A = 24; | ||||||
|             TCCR0B |= (1 << CS01); |             TCCR0B |= (1 << CS01); | ||||||
|             break; |             break; | ||||||
| @@ -226,15 +219,15 @@ static avr_err_t _zh_avr_ac_dimmer_timer_init(void) | |||||||
|     case 20000000: |     case 20000000: | ||||||
|         switch (_init_config.ac_dimmer_frequency) |         switch (_init_config.ac_dimmer_frequency) | ||||||
|         { |         { | ||||||
|         case ZH_50HZ: |         case ZH_50HZ: // Timer tick every 0,0001 sec. | ||||||
|             OCR0A = 249; |             OCR0A = 249; | ||||||
|             TCCR0B |= (1 << CS01); |             TCCR0B |= (1 << CS01); | ||||||
|             break; |             break; | ||||||
|         case ZH_60HZ: |         case ZH_60HZ: // Timer tick every 0,00008333 sec. | ||||||
|             OCR0A = 207; |             OCR0A = 207; | ||||||
|             TCCR0B |= (1 << CS01); |             TCCR0B |= (1 << CS01); | ||||||
|             break; |             break; | ||||||
|         case ZH_400HZ: |         case ZH_400HZ: // Timer tick every 0,0000125 sec. | ||||||
|             OCR0A = 249; |             OCR0A = 249; | ||||||
|             TCCR0B |= (1 << CS00); |             TCCR0B |= (1 << CS00); | ||||||
|             break; |             break; | ||||||
| @@ -277,5 +270,4 @@ ISR(TIMER0_COMPA_vect) | |||||||
|         } |         } | ||||||
|     } |     } | ||||||
|     TIFR0 = (1 << OCF0A); |     TIFR0 = (1 << OCF0A); | ||||||
|     // ++_dimmer_count; |  | ||||||
| } | } | ||||||
		Reference in New Issue
	
	Block a user