X-Git-Url: https://www.fi.muni.cz/~kas/git//home/kas/public_html/git/?a=blobdiff_plain;f=firmware%2Fpwm.c;h=8c95619a8f06ec423abce77a25f0a32f59f55258;hb=43b162ab0d886c7f75a9e8702052ab90ae462189;hp=da9fe3df679b9feb1faede1ed11205773890a824;hpb=64a3d3a699cd60b7a6b4b06c5c38689975a3d460;p=bike-lights.git diff --git a/firmware/pwm.c b/firmware/pwm.c index da9fe3d..8c95619 100644 --- a/firmware/pwm.c +++ b/firmware/pwm.c @@ -7,23 +7,28 @@ static uint16_t pwm[N_PWMLEDS]; static volatile unsigned char step; -void init_pwm() +static void enable_pll() { - int i; - - step = 0; - - for (i = 0; i < N_PWMLEDS; i++) - pwm[n] = 0; - /* Async clock */ PLLCSR = _BV(PLLE); /* Synchronize to the phase lock */ - _delay_ms(1); + _delay_us(100); while ((PLLCSR & _BV(PLOCK)) == 0) ; PLLCSR |= _BV(PCKE); +} + +void init_pwm() +{ + int i; + + step = 0; + + for (i = 0; i < N_PWMLEDS; i++) + pwm[i] = 0; + + enable_pll(); // PWM channel D is inverted, ... TCCR1C = _BV(COM1D1) | _BV(COM1D0) | _BV(PWM1D); @@ -56,6 +61,8 @@ void susp_pwm() TCCR1D = TCCR1C = TCCR1B = TCCR1A = 0; TIMSK = 0; TIFR = 0; + + PLLCSR &= ~(_BV(PLLE) | _BV(PCKE)); } void pwm_off(unsigned char n) @@ -116,22 +123,7 @@ void pwm_timer() step = 0; for (i = 0; i < N_PWMLEDS; i++) - if (pwm[n]) - pwm_update_hw(n); -} - -#if 0 -static void inline pwm_handler() -{ - OCR1A = pwmval[0]; - OCR1B = pwmval[1]; - OCR1D = pwmval[2]; - TIMSK &= ~_BV(TOIE1); -} - -ISR(TIMER1_OVF_vect) -{ - pwm_handler(); + if (pwm[i]) + pwm_update_hw(i); } -#endif