15 #if defined(ARDUINO_ARCH_AVR) && ! (defined(ARDUINO_AVR_ATmega32) ||defined(__AVR_ATmega128__))
23 void PhaseCut::init(uint8_t output_pin)
28 ZERO_CROSS_PIN = ZEROPIN;
29 OUTPUT_PIN = output_pin;
33 pinMode(OUTPUT_PIN, OUTPUT);
34 pinMode(ZERO_CROSS_PIN, INPUT);
39 uint8_t oldSREG = SREG;
44 TIMSK2 |= (1 << OCIE2A);
45 _valid_zero_crossing =
true;
48 bool PhaseCut::Start()
52 uint8_t oldSREG = SREG;
55 attachInterrupt(digitalPinToInterrupt(ZERO_CROSS_PIN), ZeroCrossEventCaller, CHANGE);
64 detachInterrupt(digitalPinToInterrupt(ZERO_CROSS_PIN));
65 digitalWrite(OUTPUT_PIN, LOW);
70 bool PhaseCut::isrunning()
74 bool PhaseCut::SetDimValue(
double value)
83 void PhaseCut::SetTimer()
88 void ZeroCrossEventCaller()
90 phaseCut.ZeroCrossEvent();
94 ISR(TIMER2_COMPA_vect)
99 void PhaseCut::ZeroCrossEvent()
101 if (!_valid_zero_crossing)
103 _valid_zero_crossing =
false;
106 TCCR2B |= (1 << WGM21) | (1 << CS20) | (1 << CS21) | (1 << CS22) ;
109 void PhaseCut::Fire()
111 #if PHASECUTMODE == 1
112 digitalWrite(OUTPUT_PIN, LOW);
114 if ( _timer > 0 ) digitalWrite(OUTPUT_PIN, HIGH);
119 void PhaseCut::CmpAEvent()
121 #if PHASECUTMODE == 1
122 if ( _timer < 75 )digitalWrite(OUTPUT_PIN, HIGH);
124 digitalWrite(OUTPUT_PIN, LOW);
129 _valid_zero_crossing =
true;