1
//v0 5/1/2014 by Everett
3
//simple flashlight controller. mode change on power cycle
8
#define _XTAL_FREQ 8000000
9
__CONFIG(CP_OFF & BOREN_OFF & LVP_OFF & MCLRE_ON & WDTE_OFF & PWRTE_OFF & FOSC_INTOSC & WRT_HALF);
13
persistent unsigned char mode; //must be declared persistent for ram retention trick to work
20
#define default_mode 0
22
persistent unsigned int key;
25
#define voltage_rate 100 //milliseconds
27
void delayms(int milliseconds);
29
unsigned char read_voltage(void);
30
void initialize_mode(void);
32
void interrupt isr(void)
35
if(TMR0IF){ //fires at 1kHz
37
if(++v_timer==voltage_rate){v_timer=0; v_sample=1;}
44
configure(); //set up hardware peripherals
45
delayms(15); //short delay to avoid power glitches incrementing mode
46
if(key==12345){ //RAM retention trick to detect quick power cycles
47
mode++; //go to next mode
48
if(mode>max_mode){mode=0;}
50
else{ //long power loss. default to first mode
56
GIE=1; //turn on interrupts
62
if(mode==max){ //if battery goes below 3.0V in max mode, force down to medium mode
63
if(read_voltage()>87){
73
void initialize_mode(void)
75
switch(mode){ //initialize current mode
89
unsigned char read_voltage(void)
91
//fvr is at 1.024V. ADRES = 1.024/Vin*255. Vin = 1.024/(ADRES/255). voltage limit set to 3.0V -> 87. values below this correspond to voltage above 3.0V
98
void delayms(int milliseconds)
100
while(milliseconds!=0){ __delay_ms(1); milliseconds--;}
105
INTCON=0b00100000; //tmr0 only
107
T2CON=0b00000100; //on, no prescale
112
TRISA=0b11111110; //GP0 output
113
ANSELA=0b11110000; //
116
OSCCON=0b01100000; //8MHz
118
OPTION_REG=0b00000010; //8 prescale for 1ms interrupts
120
FVRCON=0b10000001; //1.024v to adc
121
ADCON=0b10111101; // fvr
124
PWM1CON=0b11000000; //on, output