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 --- hwdef-thefreeman-lin16dac.h | 1 + spaghetti-monster/anduril/version.h | 2 +- spaghetti-monster/fsm-ramping.c | 10 ++++++++++ 3 files changed, 12 insertions(+), 1 deletion(-) diff --git a/hwdef-thefreeman-lin16dac.h b/hwdef-thefreeman-lin16dac.h index 0999c4c..77b9ee0 100644 --- a/hwdef-thefreeman-lin16dac.h +++ b/hwdef-thefreeman-lin16dac.h @@ -43,6 +43,7 @@ Read voltage from VCC pin, has PFET so no drop #define LED_ENABLE_PORT PORTB_OUT #define LED_ENABLE_PIN_LEVEL_MIN 35 #define LED_ENABLE_PIN_LEVEL_MAX 150 +#define LED_ENABLE_DELAY 80 // how many ms to delay turning on the lights after enabling the channel // For turning on and off the op-amp #define LED2_ENABLE_PIN PIN7_bp diff --git a/spaghetti-monster/anduril/version.h b/spaghetti-monster/anduril/version.h index 7560ef2..ff0abc7 100644 --- a/spaghetti-monster/anduril/version.h +++ b/spaghetti-monster/anduril/version.h @@ -1 +1 @@ -#define VERSION_NUMBER "20211029" +#define VERSION_NUMBER "20220104" 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) --- hwdef-thefreeman-lin16dac.h | 3 +-- spaghetti-monster/anduril/version.h | 2 +- spaghetti-monster/fsm-ramping.c | 12 +++++++++++- 3 files changed, 13 insertions(+), 4 deletions(-) diff --git a/hwdef-thefreeman-lin16dac.h b/hwdef-thefreeman-lin16dac.h index 77b9ee0..adb7886 100644 --- a/hwdef-thefreeman-lin16dac.h +++ b/hwdef-thefreeman-lin16dac.h @@ -43,12 +43,11 @@ Read voltage from VCC pin, has PFET so no drop #define LED_ENABLE_PORT PORTB_OUT #define LED_ENABLE_PIN_LEVEL_MIN 35 #define LED_ENABLE_PIN_LEVEL_MAX 150 -#define LED_ENABLE_DELAY 80 // how many ms to delay turning on the lights after enabling the channel // For turning on and off the op-amp #define LED2_ENABLE_PIN PIN7_bp #define LED2_ENABLE_PORT PORTA_OUT - +#define LED2_ENABLE_DELAY 80 // how many ms to delay turning on the lights after enabling the channel // average drop across diode on this hardware #ifndef VOLTAGE_FUDGE_FACTOR diff --git a/spaghetti-monster/anduril/version.h b/spaghetti-monster/anduril/version.h index ff0abc7..c67379c 100644 --- a/spaghetti-monster/anduril/version.h +++ b/spaghetti-monster/anduril/version.h @@ -1 +1 @@ -#define VERSION_NUMBER "20220104" +#define VERSION_NUMBER "20220105" 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 056e48b0e30c8ed0dac6fa9ef4434852e2069b48 Mon Sep 17 00:00:00 2001 From: Gabriel Hart Date: Sat, 29 Jan 2022 07:22:09 -0600 Subject: Tweak a few MT35Mini settings --- hwdef-Mateminco_MT35-Mini.h | 47 ++++++++++++++++++++ spaghetti-monster/anduril/MODELS | 3 +- .../anduril/cfg-mateminco-mt35-mini.h | 51 ++++++++++++++++++++++ spaghetti-monster/anduril/version.h | 2 +- 4 files changed, 101 insertions(+), 2 deletions(-) create mode 100644 hwdef-Mateminco_MT35-Mini.h create mode 100644 spaghetti-monster/anduril/cfg-mateminco-mt35-mini.h diff --git a/hwdef-Mateminco_MT35-Mini.h b/hwdef-Mateminco_MT35-Mini.h new file mode 100644 index 0000000..344f658 --- /dev/null +++ b/hwdef-Mateminco_MT35-Mini.h @@ -0,0 +1,47 @@ +#ifndef HWDEF_MT35_MINI_H +#define HWDEF_MT35_MINI_H + +/* Mateminco MT35-Mini / Astrolux FT03 + * ---- + * Reset -|1 8|- VCC + * eswitch -|2 7|- Aux LED + * 1x7135 -|3 6|- NC + * GND -|4 5|- FET + * ---- + */ + +#define PWM_CHANNELS 2 + +#ifndef SWITCH_PIN +#define SWITCH_PIN PB3 // pin 2 +#define SWITCH_PCINT PCINT3 // pin 2 pin change interrupt +#endif + +#ifndef PWM1_PIN +#define PWM1_PIN PB4 // pin 3, 1x7135 PWM +#define PWM1_LVL OCR1B // OCR1B is the output compare register for PB0 +#endif + +#ifndef PWM2_PIN +#define PWM2_PIN PB0 // pin 5, FET PWM +#define PWM2_LVL OCR0A // OCR0A is the output compare register for PB4 +#endif + +#define ADC_PRSCL 0x07 // clk/128 + +// average drop across diode on this hardware +#ifndef VOLTAGE_FUDGE_FACTOR +#define VOLTAGE_FUDGE_FACTOR 7 // add 0.35V +#endif + +// lighted button +#ifndef AUXLED_PIN +#define AUXLED_PIN PB2 // pin 7 +#endif + +#define FAST 0xA3 // fast PWM both channels +#define PHASE 0xA1 // phase-correct PWM both channels + +#define LAYOUT_DEFINED + +#endif diff --git a/spaghetti-monster/anduril/MODELS b/spaghetti-monster/anduril/MODELS index 317bb6a..14392b6 100644 --- a/spaghetti-monster/anduril/MODELS +++ b/spaghetti-monster/anduril/MODELS @@ -44,6 +44,7 @@ Model Name MCU 0441 ff-e01 attiny85 0511 mateminco-mf01s attiny85 0521 mateminco-mf01-mini attiny85 +0531 mateminco-mf35-mini attiny85 0611 blf-q8 attiny85 0612 sofirn-sp36 attiny85 0613 blf-q8-t1616 attiny1616 @@ -55,4 +56,4 @@ Model Name MCU Duplicates: -Missing: \ No newline at end of file +Missing: diff --git a/spaghetti-monster/anduril/cfg-mateminco-mt35-mini.h b/spaghetti-monster/anduril/cfg-mateminco-mt35-mini.h new file mode 100644 index 0000000..b409c39 --- /dev/null +++ b/spaghetti-monster/anduril/cfg-mateminco-mt35-mini.h @@ -0,0 +1,51 @@ +// Mateminco MT35 Mini / Astrolux FT03 +#define MODEL_NUMBER "0531" +#include "hwdef-Mateminco_MT35-Mini.h" +// ATTINY: 85 + +// this light should be fine running a bit hotter than most +#undef DEFAULT_THERM_CEIL +#define DEFAULT_THERM_CEIL 55 + +// the button lights up +#define USE_INDICATOR_LED +// the button is visible while main LEDs are on +#define USE_INDICATOR_LED_WHILE_RAMPING + +// enable blinking aux LEDs +#define TICK_DURING_STANDBY +#define STANDBY_TICK_SPEED 3 // every 0.128 s + +#define RAMP_LENGTH 150 +// level_calc.py fifth 2 150 7135 1 1 120 FET 1 10 2000 +#define PWM1_LEVELS 1,2,2,3,4,5,6,7,8,9,11,13,14,16,18,21,23,26,28,31,35,38,41,45,49,53,58,63,67,73,78,84,90,96,102,109,116,124,131,139,147,156,165,174,184,194,204,215,226,237,249,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,0 +#define PWM2_LEVELS 0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,1,2,2,3,4,5,6,7,8,9,10,11,12,14,15,16,17,18,20,21,22,24,25,27,28,30,31,33,35,36,38,40,42,43,45,47,49,51,53,55,57,59,62,64,66,68,71,73,75,78,80,83,86,88,91,94,96,99,102,105,108,111,114,117,120,124,127,130,134,137,140,144,148,151,155,159,162,166,170,174,178,182,186,190,195,199,203,208,212,217,221,226,231,235,240,245,250,255 +#define DEFAULT_LEVEL 46 +#define MAX_1x7135 52 +#define HALFSPEED_LEVEL 20 +#define QUARTERSPEED_LEVEL 10 + +#define RAMP_SMOOTH_FLOOR 1 +#define RAMP_SMOOTH_CEIL 112 +#define RAMP_DISCRETE_FLOOR 10 +#define RAMP_DISCRETE_CEIL RAMP_SMOOTH_CEIL +#define RAMP_DISCRETE_STEPS 7 + +// safe limit ~33% power +#define SIMPLE_UI_FLOOR RAMP_DISCRETE_FLOOR +#define SIMPLE_UI_CEIL RAMP_LENGTH +#define SIMPLE_UI_STEPS 5 + +// stop panicking at ~40% power +#define THERM_FASTER_LEVEL 120 +#define MIN_THERM_STEPDOWN 95 // ~600 lumens +#define THERM_RESPONSE_MAGNITUDE 16 // smaller adjustments, big body. default = 64 + +#define DEFAULT_2C_STYLE 1 // enable 2 click turbo (Anduril 1 style) + +#ifdef BLINK_AT_RAMP_MIDDLE +#undef BLINK_AT_RAMP_MIDDLE +#endif + +// Allow 3C in Simple UI for switching between smooth and stepped ramping +#define USE_SIMPLE_UI_RAMPING_TOGGLE diff --git a/spaghetti-monster/anduril/version.h b/spaghetti-monster/anduril/version.h index c67379c..d6e3f1a 100644 --- a/spaghetti-monster/anduril/version.h +++ b/spaghetti-monster/anduril/version.h @@ -1 +1 @@ -#define VERSION_NUMBER "20220105" +#define VERSION_NUMBER "20220124" -- cgit v1.2.3 From 97063be85d0f964ba65a2f1ca355d818a5d93ab5 Mon Sep 17 00:00:00 2001 From: Gabriel Hart Date: Tue, 12 Apr 2022 00:05:27 -0500 Subject: Added FUSES section to SP10 Pro for building ELF file with BOD Active fuse setting --- hwdef-Sofirn_SP10-Pro.h | 2 +- spaghetti-monster/anduril/cfg-sofirn-sp10-pro.h | 15 +++++++++++++++ spaghetti-monster/anduril/version.h | 5 +---- 3 files changed, 17 insertions(+), 5 deletions(-) diff --git a/hwdef-Sofirn_SP10-Pro.h b/hwdef-Sofirn_SP10-Pro.h index bb10f2f..aea46e1 100644 --- a/hwdef-Sofirn_SP10-Pro.h +++ b/hwdef-Sofirn_SP10-Pro.h @@ -55,7 +55,7 @@ PA1 : Boost Enable #define LED_ENABLE_PORT PORTA_OUT #define USE_VOLTAGE_DIVIDER // use a dedicated pin, not VCC, because VCC input is flattened -#define DUAL_VOLTAGE_FLOOR 20 // for AA/14500 boost drivers, don't indicate low voltage if below this level +#define DUAL_VOLTAGE_FLOOR 21 // for AA/14500 boost drivers, don't indicate low voltage if below this level #define DUAL_VOLTAGE_LOW_LOW 7 // the lower voltage range's danger zone 0.7 volts (NiMH) #define ADMUX_VOLTAGE_DIVIDER ADC_MUXPOS_AIN9_gc // which ADC channel to read diff --git a/spaghetti-monster/anduril/cfg-sofirn-sp10-pro.h b/spaghetti-monster/anduril/cfg-sofirn-sp10-pro.h index bcfc80e..a3463ae 100644 --- a/spaghetti-monster/anduril/cfg-sofirn-sp10-pro.h +++ b/spaghetti-monster/anduril/cfg-sofirn-sp10-pro.h @@ -71,3 +71,18 @@ // enable factory reset on 13H without loosening tailcap #define USE_SOFT_FACTORY_RESET + +// set fuses, these carry over to the ELF file but not the HEX file +// we need this for enabling BOD in Active Mode from the factory. +// settings can be verified / dumped from the ELF file using this +// command: avr-objdump -d -S -j .fuse anduril.elf +FUSES = { + .WDTCFG = FUSE_WDTCFG_DEFAULT, /* Watchdog Configuration */ + .BODCFG = FUSE_ACTIVE0_bm, /* BOD Configuration */ + .OSCCFG = FUSE_OSCCFG_DEFAULT, /* Oscillator Configuration */ + .TCD0CFG = FUSE_TCD0CFG_DEFAULT, /* TCD0 Configuration */ + .SYSCFG0 = FUSE_SYSCFG0_DEFAULT, /* System Configuration 0 */ + .SYSCFG1 = FUSE_SYSCFG1_DEFAULT, /* System Configuration 1 */ + .APPEND = FUSE_APPEND_DEFAULT, /* Application Code Section End */ + .BOOTEND = FUSE_BOOTEND_DEFAULT, /* Boot Section End */ +}; \ No newline at end of file diff --git a/spaghetti-monster/anduril/version.h b/spaghetti-monster/anduril/version.h index 1bc3984..9f811f4 100644 --- a/spaghetti-monster/anduril/version.h +++ b/spaghetti-monster/anduril/version.h @@ -1,4 +1 @@ -// this file is replaced automatically by the build script -// set your own date here if you're not using the build script -// otherwise, default to first human contact with the moon -#define VERSION_NUMBER "19690720" \ No newline at end of file +#define VERSION_NUMBER "20220411" -- 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 --- hwdef-Sofirn_SP10-Pro.h | 1 + spaghetti-monster/anduril/version.h | 2 +- spaghetti-monster/fsm-ramping.c | 4 ++++ 3 files changed, 6 insertions(+), 1 deletion(-) diff --git a/hwdef-Sofirn_SP10-Pro.h b/hwdef-Sofirn_SP10-Pro.h index aea46e1..7d0d7f5 100644 --- a/hwdef-Sofirn_SP10-Pro.h +++ b/hwdef-Sofirn_SP10-Pro.h @@ -53,6 +53,7 @@ PA1 : Boost Enable #define LED_ENABLE_PIN PIN1_bp #define LED_ENABLE_PORT PORTA_OUT +#define LED_DISABLE_DELAY 4 #define USE_VOLTAGE_DIVIDER // use a dedicated pin, not VCC, because VCC input is flattened #define DUAL_VOLTAGE_FLOOR 21 // for AA/14500 boost drivers, don't indicate low voltage if below this level diff --git a/spaghetti-monster/anduril/version.h b/spaghetti-monster/anduril/version.h index 9f811f4..4e20d1d 100644 --- a/spaghetti-monster/anduril/version.h +++ b/spaghetti-monster/anduril/version.h @@ -1 +1 @@ -#define VERSION_NUMBER "20220411" +#define VERSION_NUMBER "20220413" 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_*) --- hwdef-Sofirn_SP10-Pro.h | 18 +++++++++++- hwdef-thefreeman-lin16dac.h | 2 +- spaghetti-monster/anduril/cfg-sofirn-sp10-pro.h | 15 ---------- spaghetti-monster/fsm-ramping.c | 39 ++++++++++++++----------- 4 files changed, 40 insertions(+), 34 deletions(-) diff --git a/hwdef-Sofirn_SP10-Pro.h b/hwdef-Sofirn_SP10-Pro.h index 7d0d7f5..e47131a 100644 --- a/hwdef-Sofirn_SP10-Pro.h +++ b/hwdef-Sofirn_SP10-Pro.h @@ -53,7 +53,7 @@ PA1 : Boost Enable #define LED_ENABLE_PIN PIN1_bp #define LED_ENABLE_PORT PORTA_OUT -#define LED_DISABLE_DELAY 4 +#define LED_OFF_DELAY 4 #define USE_VOLTAGE_DIVIDER // use a dedicated pin, not VCC, because VCC input is flattened #define DUAL_VOLTAGE_FLOOR 21 // for AA/14500 boost drivers, don't indicate low voltage if below this level @@ -122,4 +122,20 @@ inline void hwdef_setup() { } +// set fuses, these carry over to the ELF file but not the HEX file +// we need this for enabling BOD in Active Mode from the factory. +// settings can be verified / dumped from the ELF file using this +// command: avr-objdump -d -S -j .fuse anduril.elf +FUSES = { + .WDTCFG = FUSE_WDTCFG_DEFAULT, /* Watchdog Configuration */ + .BODCFG = FUSE_ACTIVE0_bm, /* BOD Configuration */ + .OSCCFG = FUSE_OSCCFG_DEFAULT, /* Oscillator Configuration */ + .TCD0CFG = FUSE_TCD0CFG_DEFAULT, /* TCD0 Configuration */ + .SYSCFG0 = FUSE_SYSCFG0_DEFAULT, /* System Configuration 0 */ + .SYSCFG1 = FUSE_SYSCFG1_DEFAULT, /* System Configuration 1 */ + .APPEND = FUSE_APPEND_DEFAULT, /* Application Code Section End */ + .BOOTEND = FUSE_BOOTEND_DEFAULT, /* Boot Section End */ +}; + + #endif diff --git a/hwdef-thefreeman-lin16dac.h b/hwdef-thefreeman-lin16dac.h index adb7886..9d6b145 100644 --- a/hwdef-thefreeman-lin16dac.h +++ b/hwdef-thefreeman-lin16dac.h @@ -47,7 +47,7 @@ Read voltage from VCC pin, has PFET so no drop // For turning on and off the op-amp #define LED2_ENABLE_PIN PIN7_bp #define LED2_ENABLE_PORT PORTA_OUT -#define LED2_ENABLE_DELAY 80 // how many ms to delay turning on the lights after enabling the channel +#define LED2_ON_DELAY 80 // how many ms to delay turning on the lights after enabling the channel // average drop across diode on this hardware #ifndef VOLTAGE_FUDGE_FACTOR diff --git a/spaghetti-monster/anduril/cfg-sofirn-sp10-pro.h b/spaghetti-monster/anduril/cfg-sofirn-sp10-pro.h index a3463ae..bcfc80e 100644 --- a/spaghetti-monster/anduril/cfg-sofirn-sp10-pro.h +++ b/spaghetti-monster/anduril/cfg-sofirn-sp10-pro.h @@ -71,18 +71,3 @@ // enable factory reset on 13H without loosening tailcap #define USE_SOFT_FACTORY_RESET - -// set fuses, these carry over to the ELF file but not the HEX file -// we need this for enabling BOD in Active Mode from the factory. -// settings can be verified / dumped from the ELF file using this -// command: avr-objdump -d -S -j .fuse anduril.elf -FUSES = { - .WDTCFG = FUSE_WDTCFG_DEFAULT, /* Watchdog Configuration */ - .BODCFG = FUSE_ACTIVE0_bm, /* BOD Configuration */ - .OSCCFG = FUSE_OSCCFG_DEFAULT, /* Oscillator Configuration */ - .TCD0CFG = FUSE_TCD0CFG_DEFAULT, /* TCD0 Configuration */ - .SYSCFG0 = FUSE_SYSCFG0_DEFAULT, /* System Configuration 0 */ - .SYSCFG1 = FUSE_SYSCFG1_DEFAULT, /* System Configuration 1 */ - .APPEND = FUSE_APPEND_DEFAULT, /* Application Code Section End */ - .BOOTEND = FUSE_BOOTEND_DEFAULT, /* Boot Section End */ -}; \ No newline at end of file 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 7ff4a96b1a25ebf6625f327b9d88e9f120ffde46 Mon Sep 17 00:00:00 2001 From: Selene ToyKeeper Date: Thu, 14 Apr 2022 21:01:05 -0600 Subject: avrdude fails when .fuse section is included, so omit that when copying elf to hex --- bin/build.sh | 2 +- hwdef-Sofirn_SP10-Pro.h | 18 +++++++++--------- 2 files changed, 10 insertions(+), 10 deletions(-) diff --git a/bin/build.sh b/bin/build.sh index 58896a5..4cb03b4 100755 --- a/bin/build.sh +++ b/bin/build.sh @@ -32,7 +32,7 @@ export DFPFLAGS="-B $ATTINY_DFP/gcc/dev/$MCU/ -I $ATTINY_DFP/include/" export CFLAGS="-Wall -g -Os -mmcu=$MCU -c -std=gnu99 -fgnu89-inline -fwhole-program -DATTINY=$ATTINY -I.. -I../.. -I../../.. -fshort-enums $DFPFLAGS" export OFLAGS="-Wall -g -Os -mmcu=$MCU -mrelax $DFPFLAGS" export LDFLAGS="-fgnu89-inline" -export OBJCOPYFLAGS='--set-section-flags=.eeprom=alloc,load --change-section-lma .eeprom=0 --no-change-warnings -O ihex' +export OBJCOPYFLAGS='--set-section-flags=.eeprom=alloc,load --change-section-lma .eeprom=0 --no-change-warnings -O ihex --remove-section .fuse' export OBJS=$PROGRAM.o for arg in "$*" ; do diff --git a/hwdef-Sofirn_SP10-Pro.h b/hwdef-Sofirn_SP10-Pro.h index e47131a..eee2f72 100644 --- a/hwdef-Sofirn_SP10-Pro.h +++ b/hwdef-Sofirn_SP10-Pro.h @@ -122,19 +122,19 @@ inline void hwdef_setup() { } -// set fuses, these carry over to the ELF file but not the HEX file +// set fuses, these carry over to the ELF file // we need this for enabling BOD in Active Mode from the factory. // settings can be verified / dumped from the ELF file using this // command: avr-objdump -d -S -j .fuse anduril.elf FUSES = { - .WDTCFG = FUSE_WDTCFG_DEFAULT, /* Watchdog Configuration */ - .BODCFG = FUSE_ACTIVE0_bm, /* BOD Configuration */ - .OSCCFG = FUSE_OSCCFG_DEFAULT, /* Oscillator Configuration */ - .TCD0CFG = FUSE_TCD0CFG_DEFAULT, /* TCD0 Configuration */ - .SYSCFG0 = FUSE_SYSCFG0_DEFAULT, /* System Configuration 0 */ - .SYSCFG1 = FUSE_SYSCFG1_DEFAULT, /* System Configuration 1 */ - .APPEND = FUSE_APPEND_DEFAULT, /* Application Code Section End */ - .BOOTEND = FUSE_BOOTEND_DEFAULT, /* Boot Section End */ + .WDTCFG = FUSE_WDTCFG_DEFAULT, // Watchdog Configuration + .BODCFG = FUSE_ACTIVE0_bm, // BOD Configuration + .OSCCFG = FUSE_OSCCFG_DEFAULT, // Oscillator Configuration + .TCD0CFG = FUSE_TCD0CFG_DEFAULT, // TCD0 Configuration + .SYSCFG0 = FUSE_SYSCFG0_DEFAULT, // System Configuration 0 + .SYSCFG1 = FUSE_SYSCFG1_DEFAULT, // System Configuration 1 + .APPEND = FUSE_APPEND_DEFAULT, // Application Code Section End + .BOOTEND = FUSE_BOOTEND_DEFAULT, // Boot Section End }; -- 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) --- hwdef-Sofirn_SP10-Pro.h | 7 +++++-- spaghetti-monster/fsm-ramping.c | 25 +++++++++++++++++-------- 2 files changed, 22 insertions(+), 10 deletions(-) diff --git a/hwdef-Sofirn_SP10-Pro.h b/hwdef-Sofirn_SP10-Pro.h index eee2f72..d7c2081 100644 --- a/hwdef-Sofirn_SP10-Pro.h +++ b/hwdef-Sofirn_SP10-Pro.h @@ -49,11 +49,14 @@ PA1 : Boost Enable // PWM parameters of both channels are tied together because they share a counter #define PWM1_TOP TCA0.SINGLE.PERBUF // holds the TOP value for for variable-resolution PWM // not necessary when double-buffered "BUF" registers are used -//#define PWM1_CNT TCA0.SINGLE.CNT // for resetting phase after each TOP adjustment +#define PWM1_CNT TCA0.SINGLE.CNT // for resetting phase after each TOP adjustment +#define PWM1_PHASE_RESET_OFF // force reset while shutting off +#define PWM1_PHASE_RESET_ON // force reset while turning on +//#define PWM1_PHASE_SYNC // manual sync while changing level #define LED_ENABLE_PIN PIN1_bp #define LED_ENABLE_PORT PORTA_OUT -#define LED_OFF_DELAY 4 +//#define LED_OFF_DELAY 4 // only needed when PWM1_PHASE_RESET_OFF not used #define USE_VOLTAGE_DIVIDER // use a dedicated pin, not VCC, because VCC input is flattened #define DUAL_VOLTAGE_FLOOR 21 // for AA/14500 boost drivers, don't indicate low voltage if below this level 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 From 30a503f84b80cef1a46ecbd33bfd4afd16e08e39 Mon Sep 17 00:00:00 2001 From: Selene ToyKeeper Date: Thu, 14 Apr 2022 21:32:08 -0600 Subject: applied new phase-hack flags to other builds where relevant --- hwdef-BLF_LT1.h | 3 +++ hwdef-Emisar_D4Sv2-tintramp.h | 3 +++ hwdef-Noctigon_DM11-12V.h | 3 +++ hwdef-Noctigon_DM11-SBT90.h | 3 +++ hwdef-Noctigon_DM11.h | 3 +++ hwdef-Noctigon_KR4-12V.h | 3 +++ hwdef-Noctigon_KR4.h | 3 +++ 7 files changed, 21 insertions(+) diff --git a/hwdef-BLF_LT1.h b/hwdef-BLF_LT1.h index 16e1c90..4e81c42 100644 --- a/hwdef-BLF_LT1.h +++ b/hwdef-BLF_LT1.h @@ -20,6 +20,9 @@ // dynamic PWM with tint ramping (not supported on attiny85) //#define USE_DYN_PWM // dynamic frequency and speed //#define PWM1_CNT TCNT0 // for dynamic PWM, reset phase +//#define PWM1_PHASE_RESET_OFF // force reset while shutting off +//#define PWM1_PHASE_RESET_ON // force reset while turning on +//#define PWM1_PHASE_SYNC // manual sync while changing level // usually PWM1_LVL would be a hardware register, but we need to abstract // it out to a soft brightness value, in order to handle tint ramping diff --git a/hwdef-Emisar_D4Sv2-tintramp.h b/hwdef-Emisar_D4Sv2-tintramp.h index 90545f4..0f4a77a 100644 --- a/hwdef-Emisar_D4Sv2-tintramp.h +++ b/hwdef-Emisar_D4Sv2-tintramp.h @@ -65,6 +65,9 @@ uint16_t PWM1_LVL; #define PWM1_PIN PB3 // pin 16, Opamp reference #define TINT1_LVL OCR1A // OCR1A is the output compare register for PB3 #define PWM1_CNT TCNT1 // for dynamic PWM, reset phase +#define PWM1_PHASE_RESET_OFF // force reset while shutting off +#define PWM1_PHASE_RESET_ON // force reset while turning on +#define PWM1_PHASE_SYNC // manual sync while changing level // gah, this driver is weird... // two linear channels are treated as one, diff --git a/hwdef-Noctigon_DM11-12V.h b/hwdef-Noctigon_DM11-12V.h index bd24768..a0d9715 100644 --- a/hwdef-Noctigon_DM11-12V.h +++ b/hwdef-Noctigon_DM11-12V.h @@ -61,6 +61,9 @@ #define PWM1_PIN PB3 // pin 16, Opamp reference #define PWM1_LVL OCR1A // OCR1A is the output compare register for PB3 #define PWM1_CNT TCNT1 // for dynamic PWM, reset phase +#define PWM1_PHASE_RESET_OFF // force reset while shutting off +#define PWM1_PHASE_RESET_ON // force reset while turning on +#define PWM1_PHASE_SYNC // manual sync while changing level // PWM parameters of both channels are tied together because they share a counter #define PWM1_TOP ICR1 // holds the TOP value for for variable-resolution PWM diff --git a/hwdef-Noctigon_DM11-SBT90.h b/hwdef-Noctigon_DM11-SBT90.h index 64ebe05..8d7aa3d 100644 --- a/hwdef-Noctigon_DM11-SBT90.h +++ b/hwdef-Noctigon_DM11-SBT90.h @@ -56,6 +56,9 @@ #define PWM1_PIN PB3 // pin 16, Opamp reference #define PWM1_LVL OCR1A // OCR1A is the output compare register for PB3 #define PWM1_CNT TCNT1 // for dynamic PWM, reset phase +#define PWM1_PHASE_RESET_OFF // force reset while shutting off +#define PWM1_PHASE_RESET_ON // force reset while turning on +#define PWM1_PHASE_SYNC // manual sync while changing level #define PWM2_PIN PA6 // pin 1, DD FET PWM #define PWM2_LVL OCR1B // OCR1B is the output compare register for PA6 diff --git a/hwdef-Noctigon_DM11.h b/hwdef-Noctigon_DM11.h index 19532e9..ea51432 100644 --- a/hwdef-Noctigon_DM11.h +++ b/hwdef-Noctigon_DM11.h @@ -55,6 +55,9 @@ #define PWM1_PIN PB3 // pin 16, Opamp reference #define PWM1_LVL OCR1A // OCR1A is the output compare register for PB3 #define PWM1_CNT TCNT1 // for dynamic PWM, reset phase +#define PWM1_PHASE_RESET_OFF // force reset while shutting off +#define PWM1_PHASE_RESET_ON // force reset while turning on +#define PWM1_PHASE_SYNC // manual sync while changing level #define PWM2_PIN PA6 // pin 1, DD FET PWM #define PWM2_LVL OCR1B // OCR1B is the output compare register for PA6 diff --git a/hwdef-Noctigon_KR4-12V.h b/hwdef-Noctigon_KR4-12V.h index 20724a2..e6cf18a 100644 --- a/hwdef-Noctigon_KR4-12V.h +++ b/hwdef-Noctigon_KR4-12V.h @@ -55,6 +55,9 @@ #define PWM1_PIN PB3 // pin 16, Opamp reference #define PWM1_LVL OCR1A // OCR1A is the output compare register for PB3 #define PWM1_CNT TCNT1 // for dynamic PWM, reset phase +#define PWM1_PHASE_RESET_OFF // force reset while shutting off +#define PWM1_PHASE_RESET_ON // force reset while turning on +#define PWM1_PHASE_SYNC // manual sync while changing level // PWM parameters of both channels are tied together because they share a counter #define PWM1_TOP ICR1 // holds the TOP value for for variable-resolution PWM diff --git a/hwdef-Noctigon_KR4.h b/hwdef-Noctigon_KR4.h index 75dd4c6..487d3ac 100644 --- a/hwdef-Noctigon_KR4.h +++ b/hwdef-Noctigon_KR4.h @@ -60,6 +60,9 @@ #define PWM1_PIN PB3 // pin 16, Opamp reference #define PWM1_LVL OCR1A // OCR1A is the output compare register for PB3 #define PWM1_CNT TCNT1 // for dynamic PWM, reset phase +#define PWM1_PHASE_RESET_OFF // force reset while shutting off +#define PWM1_PHASE_RESET_ON // force reset while turning on +#define PWM1_PHASE_SYNC // manual sync while changing level #define PWM2_PIN PA6 // pin 1, DD FET PWM #define PWM2_LVL OCR1B // OCR1B is the output compare register for PA6 -- cgit v1.2.3