diff options
Diffstat (limited to 'spaghetti-monster/fsm-ramping.c')
| -rw-r--r-- | spaghetti-monster/fsm-ramping.c | 29 |
1 files changed, 29 insertions, 0 deletions
diff --git a/spaghetti-monster/fsm-ramping.c b/spaghetti-monster/fsm-ramping.c index d6a14ef..1a08149 100644 --- a/spaghetti-monster/fsm-ramping.c +++ b/spaghetti-monster/fsm-ramping.c @@ -151,6 +151,35 @@ void set_level(uint8_t level) { #endif #endif // ifdef USE_TINT_RAMPING + + #ifdef USE_DYN_PWM + uint16_t top = PWM_GET(pwm_tops, level); + #ifdef PWM1_CNT + // wait to ensure compare match won't be missed + // (causes visible flickering when missed, because the counter + // goes all the way to 65535 before returning) + // (see attiny1634 reference manual page 103 for a warning about + // the timing of changing the TOP value (section 12.8.4)) + // to be safe, allow at least 64 cycles to update TOP + while(PWM1_CNT > (top - 64)) {} + #endif + // pulse frequency modulation, a.k.a. dynamic PWM + PWM1_TOP = top; + + // repeat for other channels if necessary + #ifdef PMW2_TOP + #ifdef PWM2_CNT + while(PWM2_CNT > (top - 64)) {} + #endif + PWM2_TOP = top; + #endif + #ifdef PMW3_TOP + #ifdef PWM3_CNT + while(PWM3_CNT > (top - 64)) {} + #endif + PWM3_TOP = top; + #endif + #endif // ifdef USE_DYN_PWM } #endif // ifdef OVERRIDE_SET_LEVEL #ifdef USE_DYNAMIC_UNDERCLOCKING |
