aboutsummaryrefslogtreecommitdiff
diff options
context:
space:
mode:
authorSelene ToyKeeper2022-04-14 21:39:50 -0600
committerSelene ToyKeeper2022-04-14 21:39:50 -0600
commitb34e7a1f3b9ab1b69d863187d542449545c21201 (patch)
tree68bf7a1e7813480311a8dc0009cfb4cbeca7e888
parentjust a couple quick notes on using attiny1616, since the process is still evo... (diff)
parentapplied new phase-hack flags to other builds where relevant (diff)
downloadanduril-b34e7a1f3b9ab1b69d863187d542449545c21201.tar.gz
anduril-b34e7a1f3b9ab1b69d863187d542449545c21201.tar.bz2
anduril-b34e7a1f3b9ab1b69d863187d542449545c21201.zip
merged sp10-pro shutoff fix and mt35-mini support
-rwxr-xr-xbin/build.sh2
-rw-r--r--hwdef-BLF_LT1.h3
-rw-r--r--hwdef-Emisar_D4Sv2-tintramp.h3
-rw-r--r--hwdef-Mateminco_MT35-Mini.h47
-rw-r--r--hwdef-Noctigon_DM11-12V.h3
-rw-r--r--hwdef-Noctigon_DM11-SBT90.h3
-rw-r--r--hwdef-Noctigon_DM11.h3
-rw-r--r--hwdef-Noctigon_KR4-12V.h3
-rw-r--r--hwdef-Noctigon_KR4.h3
-rw-r--r--hwdef-Sofirn_SP10-Pro.h24
-rw-r--r--hwdef-thefreeman-lin16dac.h2
-rw-r--r--spaghetti-monster/anduril/MODELS1
-rw-r--r--spaghetti-monster/anduril/cfg-mateminco-mt35-mini.h51
-rw-r--r--spaghetti-monster/fsm-ramping.c56
14 files changed, 191 insertions, 13 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-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-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/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
diff --git a/hwdef-Sofirn_SP10-Pro.h b/hwdef-Sofirn_SP10-Pro.h
index bb10f2f..d7c2081 100644
--- a/hwdef-Sofirn_SP10-Pro.h
+++ b/hwdef-Sofirn_SP10-Pro.h
@@ -49,13 +49,17 @@ 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 // 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 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
@@ -121,4 +125,20 @@ inline void hwdef_setup() {
}
+// 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
+};
+
+
#endif
diff --git a/hwdef-thefreeman-lin16dac.h b/hwdef-thefreeman-lin16dac.h
index 0999c4c..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_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/MODELS b/spaghetti-monster/anduril/MODELS
index d2d509a..329cc4d 100644
--- a/spaghetti-monster/anduril/MODELS
+++ b/spaghetti-monster/anduril/MODELS
@@ -51,6 +51,7 @@ Model Name MCU
0441 ff-e01 attiny85
0511 mateminco-mf01s attiny85
0521 mateminco-mf01-mini attiny85
+0531 mateminco-mt35-mini attiny85
0611 blf-q8 attiny85
0612 sofirn-sp36 attiny85
0613 blf-q8-t1616 attiny1616
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/fsm-ramping.c b/spaghetti-monster/fsm-ramping.c
index abbfbde..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,20 @@ 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
+ delay_4ms(LED_OFF_DELAY/4);
+ #endif
// disable the power channel, if relevant
#ifdef LED_ENABLE_PIN
LED_ENABLE_PORT &= ~(1 << LED_ENABLE_PIN);
@@ -104,6 +118,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_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
@@ -114,9 +132,29 @@ 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_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
- LED2_ENABLE_PORT |= (1 << LED2_ENABLE_PIN);
+ #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_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
@@ -138,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)
@@ -154,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
}
@@ -184,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