Untitled diff

作成日 差分は期限切れになりません
15 削除
287 行
20 追加
296 行
*Settings to modify per driver
#define F_CPU 4800000UL
/*
* =========================================================================
* Settings to modify per driver
*/
*/
#define VOLTAGE_MON // Comment out to disable
#define VOLTAGE_MON // Comment out to disable
#define MODE_MOON 1 // Can comment out to remove mode, but should be set through soldering stars
#define MODE_MOON 8 // Can comment out to remove mode, but should be set through soldering stars
#define MODE_LOW 8 // Can comment out to remove mode
#define MODE_LOW 14 // Can comment out to remove mode
#define MODE_MED 75 // Can comment out to remove mode
#define MODE_MED 39 // Can comment out to remove mode
#define MODE_HIGH_W_TURBO 110 // MODE_HIGH value when turbo is enabled
#define MODE_HIGH 120 // Can comment out to remove mode
#define MODE_TURBO 255 // Can comment out to remove mode
#define MODE_TURBO 255 // Can comment out to remove mode
#define TURBO_TIMEOUT 37 // How many WTD ticks before before dropping down (.5 sec each)
#define TURBO_TIMEOUT 240 // How many WTD ticks before before dropping down (.5 sec each)
#define WDT_TIMEOUT 2 // Number of WTD ticks before mode is saved (.5 sec each)
#define WDT_TIMEOUT 2 // Number of WTD ticks before mode is saved (.5 sec each)
#define ADC_LOW 130 // When do we start ramping
#define ADC_LOW 130 // When do we start ramping
#define ADC_CRIT 120 // When do we shut the light off
#define ADC_CRIT 120 // When do we shut the light off
/*
/*
* =========================================================================
* =========================================================================
*/
*/
#ifdef MODE_TURBO
#ifdef MODE_TURBO
#undef MODE_HIGH
#undef MODE_HIGH
#define MODE_HIGH MODE_HIGH_W_TURBO
#define MODE_HIGH MODE_HIGH_W_TURBO
#endif
#endif
//#include <avr/pgmspace.h>
//#include <avr/pgmspace.h>
#include <avr/io.h>
#include <avr/io.h>
#include <util/delay.h>
#include <util/delay.h>
#include <avr/interrupt.h>
#include <avr/interrupt.h>
#include <avr/wdt.h>
#include <avr/wdt.h>
#include <avr/eeprom.h>
#include <avr/eeprom.h>
#include <avr/sleep.h>
#include <avr/sleep.h>
//#include <avr/power.h>
//#include <avr/power.h>
#define STAR2_PIN PB0
#define STAR2_PIN PB0
#define STAR3_PIN PB4
#define STAR3_PIN PB4
#define STAR4_PIN PB3
#define STAR4_PIN PB3
#define PWM_PIN PB1
#define PWM_PIN PB1
#define VOLTAGE_PIN PB2
#define VOLTAGE_PIN PB2
#define ADC_CHANNEL 0x01 // MUX 01 corresponds with PB2
#define ADC_CHANNEL 0x01 // MUX 01 corresponds with PB2
#define ADC_DIDR ADC1D // Digital input disable bit corresponding with PB2
#define ADC_DIDR ADC1D // Digital input disable bit corresponding with PB2
#define ADC_PRSCL 0x06 // clk/64
#define ADC_PRSCL 0x06 // clk/64
#define PWM_LVL OCR0B // OCR0B is the output compare register for PB1
#define PWM_LVL OCR0B // OCR0B is the output compare register for PB1
/*
/*
* global variables
* global variables
*/
*/
// Mode storage
// Mode storage
uint8_t eepos = 0;
uint8_t eepos = 0;
uint8_t eep[32];
uint8_t eep[32];
uint8_t memory = 0;
uint8_t memory = 0;
// Modes (gets set when the light starts up based on stars)
// Modes (gets set when the light starts up based on stars)
static uint8_t modes[10]; // Don't need 10, but keeping it high enough to handle all
static uint8_t modes[10]; // Don't need 10, but keeping it high enough to handle all
volatile uint8_t mode_idx = 0;
volatile uint8_t mode_idx = 0;
int mode_dir = 0; // 1 or -1. Determined when checking stars. Do we increase or decrease the idx when moving up to a higher mode.
int mode_dir = 0; // 1 or -1. Determined when checking stars. Do we increase or decrease the idx when moving up to a higher mode.
uint8_t mode_cnt = 0;
uint8_t mode_cnt = 0;
uint8_t lowbatt_cnt = 0;
uint8_t lowbatt_cnt = 0;
void store_mode_idx(uint8_t lvl) { //central method for writing (with wear leveling)
void store_mode_idx(uint8_t lvl) { //central method for writing (with wear leveling)
uint8_t oldpos=eepos;
uint8_t oldpos=eepos;
eepos=(eepos+1)&31; //wear leveling, use next cell
eepos=(eepos+1)&31; //wear leveling, use next cell
// Write the current mode
// Write the current mode
EEARL=eepos; EEDR=lvl; EECR=32+4; EECR=32+4+2; //WRITE //32:write only (no erase) 4:enable 2:go
EEARL=eepos; EEDR=lvl; EECR=32+4; EECR=32+4+2; //WRITE //32:write only (no erase) 4:enable 2:go
while(EECR & 2); //wait for completion
while(EECR & 2); //wait for completion
// Erase the last mode
// Erase the last mode
EEARL=oldpos; EECR=16+4; EECR=16+4+2; //ERASE //16:erase only (no write) 4:enable 2:go
EEARL=oldpos; EECR=16+4; EECR=16+4+2; //ERASE //16:erase only (no write) 4:enable 2:go
}
}
inline void read_mode_idx() {
inline void read_mode_idx() {
eeprom_read_block(&eep, 0, 32);
eeprom_read_block(&eep, 0, 32);
while((eep[eepos] == 0xff) && (eepos < 32)) eepos++;
while((eep[eepos] == 0xff) && (eepos < 32)) eepos++;
if (eepos < 32) mode_idx = eep[eepos];//&0x10; What the?
if (eepos < 32) mode_idx = eep[eepos];//&0x10; What the?
else eepos=0;
else eepos=0;
}
}
inline void next_mode() {
inline void next_mode() {
if (mode_idx == 0 && mode_dir == -1) {
if (mode_idx == 0 && mode_dir == -1) {
// Wrap around
// Wrap around
mode_idx = mode_cnt - 1;
mode_idx = mode_cnt - 1;
} else {
} else {
mode_idx += mode_dir;
mode_idx += mode_dir;
if (mode_idx > (mode_cnt - 1)) {
if (mode_idx > (mode_cnt - 1)) {
// Wrap around
// Wrap around
mode_idx = 0;
mode_idx = 0;
}
}
}
}
}
}
inline void WDT_on() {
inline void WDT_on() {
// Setup watchdog timer to only interrupt, not reset, every 500ms.
// Setup watchdog timer to only interrupt, not reset, every 500ms.
cli(); // Disable interrupts
cli(); // Disable interrupts
wdt_reset(); // Reset the WDT
wdt_reset(); // Reset the WDT
WDTCR |= (1<<WDCE) | (1<<WDE); // Start timed sequence
WDTCR |= (1<<WDCE) | (1<<WDE); // Start timed sequence
WDTCR = (1<<WDTIE) | (1<<WDP2) | (1<<WDP0); // Enable interrupt every 500ms
WDTCR = (1<<WDTIE) | (1<<WDP2) | (1<<WDP0); // Enable interrupt every 500ms
sei(); // Enable interrupts
sei(); // Enable interrupts
}
}
inline void WDT_off()
inline void WDT_off()
{
{