wip:
This commit is contained in:
		| @@ -7,7 +7,7 @@ | |||||||
| #include "avr/interrupt.h" | #include "avr/interrupt.h" | ||||||
| #include "util/delay.h" | #include "util/delay.h" | ||||||
|  |  | ||||||
| #define ZH_TRIAC_TIME 2 // Triac turn-on time (in microseconds). Depends on the type of triac. Tested on BTA16-600. | #define ZH_TRIAC_TIME 1 // Triac turn-on time (in microseconds). Depends on the type of triac. Tested on BTA16-600. | ||||||
|  |  | ||||||
| #define ZH_AVR_AC_DIMMER_INIT_CONFIG_DEFAULT() \ | #define ZH_AVR_AC_DIMMER_INIT_CONFIG_DEFAULT() \ | ||||||
|     {                                          \ |     {                                          \ | ||||||
|   | |||||||
| @@ -5,6 +5,7 @@ volatile static bool _is_dimmer_work = false; | |||||||
| volatile static uint8_t _dimmer_value = 0; | volatile static uint8_t _dimmer_value = 0; | ||||||
| volatile static uint8_t _dimmer_count = 0; | volatile static uint8_t _dimmer_count = 0; | ||||||
| static bool _is_initialized = false; | static bool _is_initialized = false; | ||||||
|  | volatile static bool _is_zero_crossing = false; | ||||||
|  |  | ||||||
| static avr_err_t _zh_avr_ac_dimmer_validate_config(const zh_avr_ac_dimmer_init_config_t *config); | static avr_err_t _zh_avr_ac_dimmer_validate_config(const zh_avr_ac_dimmer_init_config_t *config); | ||||||
| static void _zh_avr_ac_dimmer_gpio_init(void); | static void _zh_avr_ac_dimmer_gpio_init(void); | ||||||
| @@ -54,18 +55,28 @@ 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); | ||||||
|             flag = true; |             flag = true; | ||||||
|         } |         } | ||||||
|         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); | ||||||
|             flag = true; |             flag = true; | ||||||
|         } |         } | ||||||
|         break; |         break; | ||||||
|     case AVR_PORTD: |     case AVR_PORTD: | ||||||
|         if ((PIND & (1 << _init_config.zero_cross_gpio)) == (1 << _init_config.zero_cross_gpio)) |         if (((PIND & (1 << _init_config.zero_cross_gpio)) == (1 << _init_config.zero_cross_gpio)) && _is_zero_crossing == false) | ||||||
|         { |         { | ||||||
|  |             PORTD &= ~(1 << _init_config.triac_gpio); | ||||||
|  |             // flag = true; | ||||||
|  |             _is_zero_crossing = true; | ||||||
|  |         } | ||||||
|  |         if (((PIND & (1 << _init_config.zero_cross_gpio)) == 0) && _is_zero_crossing == true) | ||||||
|  |         { | ||||||
|  |             // PORTD &= ~(1 << _init_config.triac_gpio); | ||||||
|  |             _is_zero_crossing = false; | ||||||
|             flag = true; |             flag = true; | ||||||
|         } |         } | ||||||
|         break; |         break; | ||||||
| @@ -77,24 +88,26 @@ void zh_avr_ac_dimmer_isr_handler(void) | |||||||
|     { |     { | ||||||
|         if (_dimmer_value != 0) |         if (_dimmer_value != 0) | ||||||
|         { |         { | ||||||
|             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); |                     // _delay_us(ZH_TRIAC_TIME); | ||||||
|                     PORTB &= ~(1 << _init_config.triac_gpio); |                     // 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); |                     // _delay_us(ZH_TRIAC_TIME); | ||||||
|                     PORTC &= ~(1 << _init_config.triac_gpio); |                     // 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(ZH_TRIAC_TIME); |                     // _delay_us(10); | ||||||
|                     PORTD &= ~(1 << _init_config.triac_gpio); |                     // PORTD &= ~(1 << _init_config.triac_gpio); | ||||||
|                     break; |                     break; | ||||||
|                 default: |                 default: | ||||||
|                     break; |                     break; | ||||||
| @@ -102,11 +115,11 @@ void zh_avr_ac_dimmer_isr_handler(void) | |||||||
|             } |             } | ||||||
|             else |             else | ||||||
|             { |             { | ||||||
|                 cli(); |                 // cli(); | ||||||
|                 TCNT0 = 0; |                 TCNT0 = 0; | ||||||
|                 // TIFR0 = (1 << OCF0A); |                 TIFR0 = (1 << OCF0A); | ||||||
|                 TIMSK0 |= (1 << OCIE0A); |                 TIMSK0 |= (1 << OCIE0A); | ||||||
|                 sei(); |                 // sei(); | ||||||
|             } |             } | ||||||
|         } |         } | ||||||
|     } |     } | ||||||
| @@ -176,7 +189,7 @@ static avr_err_t _zh_avr_ac_dimmer_timer_init(void) | |||||||
|         switch (_init_config.ac_dimmer_frequency) |         switch (_init_config.ac_dimmer_frequency) | ||||||
|         { |         { | ||||||
|         case ZH_50HZ: |         case ZH_50HZ: | ||||||
|             OCR0A = 99; |             OCR0A = 94; // Check. 99 | ||||||
|             TCCR0B |= (1 << CS01); |             TCCR0B |= (1 << CS01); | ||||||
|             break; |             break; | ||||||
|         case ZH_60HZ: |         case ZH_60HZ: | ||||||
| @@ -239,7 +252,7 @@ static avr_err_t _zh_avr_ac_dimmer_timer_init(void) | |||||||
| ISR(TIMER0_COMPA_vect) | ISR(TIMER0_COMPA_vect) | ||||||
| { | { | ||||||
|     ++_dimmer_count; |     ++_dimmer_count; | ||||||
|     if (_dimmer_count >= (100 - _dimmer_value)) |     if (_dimmer_count == (100 - _dimmer_value)) | ||||||
|     { |     { | ||||||
|         _dimmer_count = 0; |         _dimmer_count = 0; | ||||||
|         TIMSK0 &= ~(1 << OCIE0A); |         TIMSK0 &= ~(1 << OCIE0A); | ||||||
| @@ -263,5 +276,6 @@ ISR(TIMER0_COMPA_vect) | |||||||
|             break; |             break; | ||||||
|         } |         } | ||||||
|     } |     } | ||||||
|  |     TIFR0 = (1 << OCF0A); | ||||||
|     // ++_dimmer_count; |     // ++_dimmer_count; | ||||||
| } | } | ||||||
		Reference in New Issue
	
	Block a user