aboutsummaryrefslogtreecommitdiff
path: root/spaghetti-monster
diff options
context:
space:
mode:
Diffstat (limited to 'spaghetti-monster')
-rw-r--r--spaghetti-monster/fsm-ramping.c41
1 files changed, 22 insertions, 19 deletions
diff --git a/spaghetti-monster/fsm-ramping.c b/spaghetti-monster/fsm-ramping.c
index 503f90f..1a08149 100644
--- a/spaghetti-monster/fsm-ramping.c
+++ b/spaghetti-monster/fsm-ramping.c
@@ -153,30 +153,33 @@ void set_level(uint8_t level) {
#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 = PWM_GET(pwm_tops, level);
+ PWM1_TOP = top;
+
+ // repeat for other channels if necessary
#ifdef PMW2_TOP
- PWM2_TOP = PWM_GET(pwm_tops, level);
+ #ifdef PWM2_CNT
+ while(PWM2_CNT > (top - 64)) {}
+ #endif
+ PWM2_TOP = top;
#endif
#ifdef PMW3_TOP
- PWM3_TOP = PWM_GET(pwm_tops, level);
- #endif
-
- // reset the phase, to avoid random long pulses
- // see attiny1634 reference manual page 103 for a warning about
- // the timing of changing the TOP value (section 12.8.4)
- // (we don't care about being phase-correct, so the brute-force
- // approach can be used to reset it here)
- #ifdef PWM1_CNT
- PWM1_CNT = 0;
- #endif
- #ifdef PWM2_CNT
- PWM2_CNT = 0;
- #endif
- #ifdef PWM3_CNT
- PWM3_CNT = 0;
+ #ifdef PWM3_CNT
+ while(PWM3_CNT > (top - 64)) {}
+ #endif
+ PWM3_TOP = top;
#endif
- #endif
+ #endif // ifdef USE_DYN_PWM
}
#endif // ifdef OVERRIDE_SET_LEVEL
#ifdef USE_DYNAMIC_UNDERCLOCKING
If you find this content useful please consider a small donation via bitcoin: bitcoin:1mxKyQsHHugqRxPKgwaA7wUwJEGCNthn2?amount=0.001&message=Donation Scraping git contents via cgit is very resource intensive. The continued hosting of these git repositories is entirely financed by your bitcoin contributions. For donations of a least 1 mBTC you include your IP address in the message of your bitcoin donation. This will remove this message in the future for requests from your IP, which will significantly reduce token usage. In any case, any contributions to bitcoin address 1mxKyQsHHugqRxPKgwaA7wUwJEGCNthn2 are very welcome. Thanks in advance for you contribution to a self-sustaining ecosystem.