Skip to content

Instantly share code, notes, and snippets.

@gdmn
Created February 18, 2021 19:25
Show Gist options
  • Star 0 You must be signed in to star a gist
  • Fork 0 You must be signed in to fork a gist
  • Save gdmn/6ed744ef8ae0fa1de046232dd09a2380 to your computer and use it in GitHub Desktop.
Save gdmn/6ed744ef8ae0fa1de046232dd09a2380 to your computer and use it in GitHub Desktop.
Anduril2, D4v2 driver for C8F configuration
// Emisar D4 config options for Anduril
#define MODEL_NUMBER "2113"
#include "hwdef-Emisar_D4v2_c8f.h"
// ATTINY: 1634
#define START_AT_MEMORIZED_LEVEL // dmn
// this light has three aux LED channels: R, G, B
#define USE_AUX_RGB_LEDS // dmn: must be enabled to use button led
// it also has an independent LED in the button
#define USE_BUTTON_LED
// the aux LEDs are front-facing, so turn them off while main LEDs are on
// TODO: the whole "indicator LED" thing needs to be refactored into
// "aux LED(s)" and "button LED(s)" since they work a bit differently
//#ifdef USE_INDICATOR_LED_WHILE_RAMPING
//#undef USE_INDICATOR_LED_WHILE_RAMPING // dmn: commented
//#endif
// enable blinking aux LEDs
#define TICK_DURING_STANDBY
#define STANDBY_TICK_SPEED 3 // every 0.128 s
//#define STANDBY_TICK_SPEED 4 // every 0.256 s
//#define STANDBY_TICK_SPEED 5 // every 0.512 s
// copied from original D4, since it's also a FET+1 and has the same host
// ../../bin/level_calc.py 1 65 7135 1 0.8 150
// ... mixed with this:
// ../../bin/level_calc.py 2 150 7135 4 0.33 150 FET 1 10 1500
#define RAMP_LENGTH 150
#define PWM1_LEVELS 1,1,2,2,3,3,4,4,5,6,7,8,9,10,12,13,14,15,17,19,20,22,24,26,29,31,34,36,39,42,45,48,51,55,59,62,66,70,75,79,84,89,93,99,104,110,115,121,127,134,140,147,154,161,168,176,184,192,200,209,217,226,236,245,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,0,0,0,0,0,0,0,0,0,0,0,0,0,0,1,3,4,5,7,8,9,11,12,14,15,17,19,20,22,24,25,27,29,31,33,35,37,39,41,43,45,48,50,52,55,57,59,62,64,67,70,72,75,78,81,84,87,90,93,96,99,102,105,109,112,115,119,122,126,129,133,137,141,144,148,152,156,160,165,169,173,177,182,186,191,195,200,205,209,214,219,224,229,234,239,244,250,255
#define MAX_1x7135 65
#define HALFSPEED_LEVEL 14
#define QUARTERSPEED_LEVEL 6
#define RAMP_SMOOTH_FLOOR 1
#define RAMP_SMOOTH_CEIL 120
// 10, 28, 46, [65], 83, 101, 120
#define RAMP_DISCRETE_FLOOR 10
#define RAMP_DISCRETE_CEIL RAMP_SMOOTH_CEIL
#define RAMP_DISCRETE_STEPS 7
// safe limit ~20% power
#define SIMPLE_UI_FLOOR RAMP_DISCRETE_FLOOR
#define SIMPLE_UI_CEIL 95
#define SIMPLE_UI_STEPS 5
// stop panicking at ~30% power or ~1200 lm
#define THERM_FASTER_LEVEL 105
#define THERM_CAL_OFFSET 5
#ifndef HWDEF_EMISAR_D4V2_H
#define HWDEF_EMISAR_D4V2_H
/* Emisar D4v2 driver layout (attiny1634)
*
* Pin / Name / Function
* 1 PA6 FET PWM (PWM1B)
* 2 PA5 red aux LED (PWM0B)
* 3 PA4 green aux LED
* 4 PA3 blue aux LED
* 5 PA2 e-switch
* 6 PA1 button LED
* 7 PA0 (none)
* 8 GND GND
* 9 VCC VCC
* 10 PC5 (none)
* 11 PC4 (none)
* 12 PC3 RESET
* 13 PC2 (none)
* 14 PC1 SCK
* 15 PC0 (none) PWM0A
* 16 PB3 7135 PWM (PWM1A)
* 17 PB2 MISO
* 18 PB1 MOSI
* 19 PB0 (none)
* 20 PA7 (none)
* ADC12 thermal sensor
*/
#ifdef ATTINY
#undef ATTINY
#endif
#define ATTINY 1634
#include <avr/io.h>
#define PWM_CHANNELS 2
#define SWITCH_PIN PA2 // pin 5
#define SWITCH_PCINT PCINT2 // pin 5 pin change interrupt
#define SWITCH_PCIE PCIE0 // PCIE0 is for PCINT[7:0]
#define SWITCH_PCMSK PCMSK0 // PCMSK0 is for PCINT[7:0]
#define SWITCH_PORT PINA // PINA or PINB or PINC
#define PWM1_PIN PB3 // pin 16, 1x7135 PWM
#define PWM1_LVL OCR1A // OCR1A is the output compare register for PB3
#define PWM2_PIN PA6 // pin 1, FET PWM
#define PWM2_LVL OCR1B // OCR1B is the output compare register for PB1
#define ADC_PRSCL 0x07 // clk/128
// average drop across diode on this hardware
#ifndef VOLTAGE_FUDGE_FACTOR
#define VOLTAGE_FUDGE_FACTOR 4 // add 0.20V (measured 0.22V)
#endif
// this light has aux LEDs under the optic
#define AUXLED_R_PIN PA1 // dmn: swapped with BUTTON_LED_PIN
#define AUXLED_G_PIN PA4 // pin 3
#define AUXLED_B_PIN PA3 // pin 4
#define AUXLED_RGB_PORT PORTA // PORTA or PORTB or PORTC
#define AUXLED_RGB_DDR DDRA // DDRA or DDRB or DDRC
#define AUXLED_RGB_PUE PUEA // PUEA or PUEB or PUEC
#define BUTTON_LED_PIN PA5 // dmn: swapped with AUXLED_R_PIN
#define BUTTON_LED_PORT PORTA // for all "PA" pins
#define BUTTON_LED_DDR DDRA // for all "PA" pins
#define BUTTON_LED_PUE PUEA // for all "PA" pins
// with so many pins, doing this all with #ifdefs gets awkward...
// ... so just hardcode it in each hwdef file instead
inline void hwdef_setup() {
// enable output ports
// 7135
DDRB = (1 << PWM1_PIN);
// FET, aux R/G/B, button LED
DDRA = (1 << PWM2_PIN)
| (1 << AUXLED_R_PIN)
| (1 << AUXLED_G_PIN)
| (1 << AUXLED_B_PIN)
| (1 << BUTTON_LED_PIN)
;
// configure PWM
// Setup PWM. F_pwm = F_clkio / 2 / N / TOP, where N = prescale factor, TOP = top of counter
// pre-scale for timer: N = 1
TCCR1A = (0<<WGM11) | (1<<WGM10) // 8-bit (TOP=0xFF) (DS table 12-5)
| (1<<COM1A1) | (0<<COM1A0) // PWM 1A in normal direction (DS table 12-4)
| (1<<COM1B1) | (0<<COM1B0) // PWM 1B in normal direction (DS table 12-4)
;
TCCR1B = (0<<CS12) | (0<<CS11) | (1<<CS10) // clk/1 (no prescaling) (DS table 12-6)
| (0<<WGM13) | (0<<WGM12) // phase-correct PWM (DS table 12-5)
;
// set up e-switch
//PORTA = (1 << SWITCH_PIN); // TODO: configure PORTA / PORTB / PORTC?
PUEA = (1 << SWITCH_PIN); // pull-up for e-switch
SWITCH_PCMSK = (1 << SWITCH_PCINT); // enable pin change interrupt
}
#define LAYOUT_DEFINED
#endif
Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment