From a01a27d8d2562e08baf7a58a76fc90670cdc2c4e Mon Sep 17 00:00:00 2001 From: Gabriel Hart Date: Tue, 4 Jan 2022 16:56:37 -0600 Subject: Experimental: add optional delay when using LED_ENABLE_PIN to avoid flashes of light --- spaghetti-monster/fsm-ramping.c | 10 ++++++++++ 1 file changed, 10 insertions(+) (limited to 'spaghetti-monster/fsm-ramping.c') diff --git a/spaghetti-monster/fsm-ramping.c b/spaghetti-monster/fsm-ramping.c index 05c2e0e..89e1f13 100644 --- a/spaghetti-monster/fsm-ramping.c +++ b/spaghetti-monster/fsm-ramping.c @@ -103,6 +103,10 @@ void set_level(uint8_t level) { } else { // enable the power channel, if relevant #ifdef LED_ENABLE_PIN + #ifdef LED_ENABLE_DELAY + uint8_t led_enable_port_save = LED_ENABLE_PORT; + #endif + #ifndef LED_ENABLE_PIN_LEVEL_MIN LED_ENABLE_PORT |= (1 << LED_ENABLE_PIN); #else @@ -113,6 +117,12 @@ void set_level(uint8_t level) { else // disable during other parts of the ramp LED_ENABLE_PORT &= ~(1 << LED_ENABLE_PIN); #endif + + // for drivers with a slow regulator chip (eg, boost converter, delay before lighting up to prevent flashes + #ifdef LED_ENABLE_DELAY + if (LED_ENABLE_PORT != led_enable_port_save) // only delay if the pin status changed + delay_4ms(LED_ENABLE_DELAY/4); + #endif #endif #ifdef LED2_ENABLE_PIN LED2_ENABLE_PORT |= (1 << LED2_ENABLE_PIN); -- cgit v1.2.3 From 3bfa5f1065bce68e637be0b09089921577e88ce7 Mon Sep 17 00:00:00 2001 From: Gabriel Hart Date: Wed, 5 Jan 2022 09:09:50 -0600 Subject: Experimental: add optional delay when using LED_ENABLE_PIN to avoid flashes of light (this time for LED2_ENABLE pin) --- spaghetti-monster/fsm-ramping.c | 12 +++++++++++- 1 file changed, 11 insertions(+), 1 deletion(-) (limited to 'spaghetti-monster/fsm-ramping.c') diff --git a/spaghetti-monster/fsm-ramping.c b/spaghetti-monster/fsm-ramping.c index 89e1f13..6bb2390 100644 --- a/spaghetti-monster/fsm-ramping.c +++ b/spaghetti-monster/fsm-ramping.c @@ -125,7 +125,17 @@ void set_level(uint8_t level) { #endif #endif #ifdef LED2_ENABLE_PIN - LED2_ENABLE_PORT |= (1 << LED2_ENABLE_PIN); + #ifdef LED2_ENABLE_DELAY + uint8_t led2_enable_port_save = LED2_ENABLE_PORT; + #endif + + LED2_ENABLE_PORT |= (1 << LED2_ENABLE_PIN); + + // for drivers with a slow regulator chip (eg, boost converter, delay before lighting up to prevent flashes + #ifdef LED2_ENABLE_DELAY + if (LED2_ENABLE_PORT != led2_enable_port_save) // only delay if the pin status changed + delay_4ms(LED2_ENABLE_DELAY/4); + #endif #endif // PWM array index = level - 1 -- cgit v1.2.3 From 7d383475d5b7c0edaabce3665dd880425d51a24d Mon Sep 17 00:00:00 2001 From: Gabriel Hart Date: Wed, 13 Apr 2022 10:13:45 -0500 Subject: Created LED_DISABLE_DELAY option and enabled it for SP10 Pro to hopefully eliminate flashes when turning off at certain levels --- spaghetti-monster/fsm-ramping.c | 4 ++++ 1 file changed, 4 insertions(+) (limited to 'spaghetti-monster/fsm-ramping.c') diff --git a/spaghetti-monster/fsm-ramping.c b/spaghetti-monster/fsm-ramping.c index 1f575fd..2e6901d 100644 --- a/spaghetti-monster/fsm-ramping.c +++ b/spaghetti-monster/fsm-ramping.c @@ -93,6 +93,10 @@ void set_level(uint8_t level) { TINT1_LVL = 0; TINT2_LVL = 0; #endif + // for drivers with a slow regulator chip (eg, boost converter, delay before turning off to prevent flashes + #ifdef LED_DISABLE_DELAY + delay_4ms(LED_DISABLE_DELAY/4); + #endif // disable the power channel, if relevant #ifdef LED_ENABLE_PIN LED_ENABLE_PORT &= ~(1 << LED_ENABLE_PIN); -- cgit v1.2.3 From 4f6ae9925fefed4694bc87584040edc5426cdd94 Mon Sep 17 00:00:00 2001 From: Selene ToyKeeper Date: Thu, 14 Apr 2022 20:34:21 -0600 Subject: moved fuses from cfg to hwdef, renamed LED_EN/DISABLE_DELAY to LED_ON/OFF_DELAY (also really should rename LED_* to CH1_* and LED2_* to CH2_*) --- spaghetti-monster/fsm-ramping.c | 39 ++++++++++++++++++++++----------------- 1 file changed, 22 insertions(+), 17 deletions(-) (limited to 'spaghetti-monster/fsm-ramping.c') diff --git a/spaghetti-monster/fsm-ramping.c b/spaghetti-monster/fsm-ramping.c index 2e6901d..ade49b7 100644 --- a/spaghetti-monster/fsm-ramping.c +++ b/spaghetti-monster/fsm-ramping.c @@ -93,9 +93,10 @@ void set_level(uint8_t level) { TINT1_LVL = 0; TINT2_LVL = 0; #endif - // for drivers with a slow regulator chip (eg, boost converter, delay before turning off to prevent flashes - #ifdef LED_DISABLE_DELAY - delay_4ms(LED_DISABLE_DELAY/4); + #ifdef LED_OFF_DELAY + // for drivers with a slow regulator chip (eg, boost converter), + // delay before turning off to prevent flashes + delay_4ms(LED_OFF_DELAY/4); #endif // disable the power channel, if relevant #ifdef LED_ENABLE_PIN @@ -108,10 +109,10 @@ void set_level(uint8_t level) { // enable the power channel, if relevant #ifndef USE_TINT_RAMPING // update_tint handles this better #ifdef LED_ENABLE_PIN - #ifdef LED_ENABLE_DELAY + #ifdef LED_ON_DELAY uint8_t led_enable_port_save = LED_ENABLE_PORT; #endif - + #ifndef LED_ENABLE_PIN_LEVEL_MIN LED_ENABLE_PORT |= (1 << LED_ENABLE_PIN); #else @@ -122,24 +123,28 @@ void set_level(uint8_t level) { else // disable during other parts of the ramp LED_ENABLE_PORT &= ~(1 << LED_ENABLE_PIN); #endif - - // for drivers with a slow regulator chip (eg, boost converter, delay before lighting up to prevent flashes - #ifdef LED_ENABLE_DELAY - if (LED_ENABLE_PORT != led_enable_port_save) // only delay if the pin status changed - delay_4ms(LED_ENABLE_DELAY/4); + + // for drivers with a slow regulator chip (eg, boost converter), + // delay before lighting up to prevent flashes + #ifdef LED_ON_DELAY + // only delay if the pin status changed + if (LED_ENABLE_PORT != led_enable_port_save) + delay_4ms(LED_ON_DELAY/4); #endif #endif #ifdef LED2_ENABLE_PIN - #ifdef LED2_ENABLE_DELAY + #ifdef LED2_ON_DELAY uint8_t led2_enable_port_save = LED2_ENABLE_PORT; #endif - + LED2_ENABLE_PORT |= (1 << LED2_ENABLE_PIN); - - // for drivers with a slow regulator chip (eg, boost converter, delay before lighting up to prevent flashes - #ifdef LED2_ENABLE_DELAY - if (LED2_ENABLE_PORT != led2_enable_port_save) // only delay if the pin status changed - delay_4ms(LED2_ENABLE_DELAY/4); + + // for drivers with a slow regulator chip (eg, boost converter), + // delay before lighting up to prevent flashes + #ifdef LED2_ON_DELAY + // only delay if the pin status changed + if (LED2_ENABLE_PORT != led2_enable_port_save) + delay_4ms(LED2_ON_DELAY/4); #endif #endif #endif // ifndef USE_TINT_RAMPING -- cgit v1.2.3 From ad92203240b60d1f9a916f5f0625e701d6d4387a Mon Sep 17 00:00:00 2001 From: Selene ToyKeeper Date: Thu, 14 Apr 2022 21:27:08 -0600 Subject: sp10-pro: hard reset phase while turning off, fixes shutoff bug without a delay (also, made phase hacks individually selectable) --- spaghetti-monster/fsm-ramping.c | 25 +++++++++++++++++-------- 1 file changed, 17 insertions(+), 8 deletions(-) (limited to 'spaghetti-monster/fsm-ramping.c') diff --git a/spaghetti-monster/fsm-ramping.c b/spaghetti-monster/fsm-ramping.c index ade49b7..1667c00 100644 --- a/spaghetti-monster/fsm-ramping.c +++ b/spaghetti-monster/fsm-ramping.c @@ -70,7 +70,7 @@ void set_level(uint8_t level) { set_level_override(level); #else - #ifdef PWM1_CNT + #if defined(PWM1_CNT) && defined(PWM1_PHASE_RESET_ON) || defined(PWM1_PHASE_SYNC) static uint8_t prev_level = 0; uint8_t api_level = level; #endif @@ -93,6 +93,15 @@ void set_level(uint8_t level) { TINT1_LVL = 0; TINT2_LVL = 0; #endif + #if defined(PWM1_CNT) && defined(PWM1_PHASE_RESET_OFF) + PWM1_CNT = 0; + #endif + #if defined(PWM2_CNT) && defined(PWM2_PHASE_RESET_OFF) + PWM2_CNT = 0; + #endif + #if defined(PWM3_CNT) && defined(PWM3_PHASE_RESET_OFF) + PWM3_CNT = 0; + #endif #ifdef LED_OFF_DELAY // for drivers with a slow regulator chip (eg, boost converter), // delay before turning off to prevent flashes @@ -167,7 +176,7 @@ void set_level(uint8_t level) { #ifdef USE_DYN_PWM uint16_t top = PWM_GET(pwm_tops, level); - #ifdef PWM1_CNT + #if defined(PWM1_CNT) && defined(PWM1_PHASE_SYNC) // 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) @@ -183,27 +192,27 @@ void set_level(uint8_t level) { // repeat for other channels if necessary #ifdef PMW2_TOP - #ifdef PWM2_CNT + #if defined(PWM2_CNT) && defined(PWM2_PHASE_SYNC) while(prev_level && (PWM2_CNT > (top - 32))) {} #endif PWM2_TOP = top; #endif #ifdef PMW3_TOP - #ifdef PWM3_CNT + #if defined(PWM3_CNT) && defined(PWM3_PHASE_SYNC) while(prev_level && (PWM3_CNT > (top - 32))) {} #endif PWM3_TOP = top; #endif #endif // ifdef USE_DYN_PWM - #ifdef PWM1_CNT + #if defined(PWM1_CNT) && defined(PWM1_PHASE_RESET_ON) // force reset phase when turning on from zero // (because otherwise the initial response is inconsistent) if (! prev_level) { PWM1_CNT = 0; - #ifdef PWM2_CNT + #if defined(PWM2_CNT) && defined(PWM2_PHASE_RESET_ON) PWM2_CNT = 0; #endif - #ifdef PWM3_CNT + #if defined(PWM3_CNT) && defined(PWM3_PHASE_RESET_ON) PWM3_CNT = 0; #endif } @@ -213,7 +222,7 @@ void set_level(uint8_t level) { update_tint(); #endif - #ifdef PWM1_CNT + #if defined(PWM1_CNT) && defined(PWM1_PHASE_RESET_ON) || defined(PWM1_PHASE_SYNC) prev_level = api_level; #endif #endif // ifdef OVERRIDE_SET_LEVEL -- cgit v1.2.3