Advertisement
Not a member of Pastebin yet?
Sign Up,
it unlocks many cool features!
- //v0 4/21/2014 by Everett, modified 01/05/2014 by Mattaus
- //Modified for PIC10F322
- //Simple flashlight controller. Mode change on power cycle. 3 modes, no strobe.
- #include <htc.h>
- #include <pic10f322.h>
- #define _XTAL_FREQ 8000000
- #define max_mode 2 //number of modes is 3 (0,1,2)
- #define default_mode 0 //default mode is first mode
- #define on_time 15 //milliseconds
- __CONFIG(FOSC_INTOSC & WDTE_SWDTEN & PWRTE_ON & MCLRE_ON & CP_OFF & CPD_OFF & BOREN_ON & CLKOUTEN_OFF & IESO_OFF & FCMEN_OFF);
- __CONFIG(WRT_BOOT & PLLEN_OFF & STVREN_ON & BORV_LO & LVP_OFF);
- persistent unsigned char mode; //must be declared persistent for ram retention trick to work
- enum mode
- {
- max=0, //first mode is high
- med=1, //second mode is med
- low=2, //third mode is low
- };
- bit on_off;
- persistent unsigned int key;
- void delayms(int milliseconds);
- void configure(void);
- void interrupt isr(void)
- {
- if(TMR1IF)
- {
- TMR1IF=0;
- }
- if(TMR0IF) //fires at 1kHz
- {
- TMR0IF=0;
- if(strobe_timer){strobe_timer--;} //count down milliseconds
- }
- }
- void main(void)
- {
- configure(); //set up hardware peripherals
- delayms(15); //short delay to avoid power glitches incrementing mode
- if(key==12345) //RAM retention trick to detect quick power cycles
- {
- mode++; //go to next mode
- if(mode>max_mode){mode=0;} //if on third mode, cycle back to first mode
- }
- else //long power loss. default to first mode
- {
- mode=default_mode; //start in first mode
- key=12345; //set key back so it can recognise power outage
- }
- switch(mode) //initialize current mode
- {
- default:
- case max:
- CCPR1L=255; //PWM output to 100%
- break; //pause
- case med:
- CCPR1L=25; //PWM out to 10%
- break; //pause
- case low:
- CCPR1L=1; //PWM out to 0.4%
- break; //pause
- }
- GIE=1; //turn on interrupts
- }
- void delayms(int milliseconds) //I have no idea what this section does
- { //
- while(milliseconds!=0){ __delay_ms(1); milliseconds--;} //
- } //
- void configure(void)
- {
- INTCON=0b01100000;
- PIR1=0;
- PIR2=0;
- T1CON=0b00110001;
- T2CON=0b00000101;
- PR2=255;
- TMR2=0;
- LATA=0;
- TRISA=0b11111011;
- ANSELA=0b00000000;
- WPUA=0b11111011;
- APFCON=0;
- OSCCON=0b01110011; //8MHz
- PIE1=0b00000000;
- PIE2=0;
- OPTION_REG=0b00000010; //8 prescale for 1ms interrupts
- // FVRCON=0b11000001; //Need to change this register for 2.048v to adc (currently set to 1.024v)
- // ADCON0=0b00001101; //
- // ADCON1=0b00010000; //1/8, left justify, vref from vdd
- CCPR1L=0;
- CCP1CON=0b00001100;
- }
- __EEPROM_DATA(0,0,0,0,0,0,0,0); //Not sure what this stuff is for either
- __EEPROM_DATA(0, 0, 0, 0, 0, 0, 0, 0); //
- __EEPROM_DATA(0, 0, 0, 0, 0, 0, 0, 0); //
- __EEPROM_DATA('1','8','2','2',' ','f','l','a'); //
- __EEPROM_DATA('s','h','l','i','g','h','t',' '); //
- __EEPROM_DATA('b','y',' ','E','v','e','r','e'); //
- __EEPROM_DATA('t','t',' ','e','v','e','r','e'); //
- __EEPROM_DATA('t','t','.','b','r','a','d','f'); //
- __EEPROM_DATA('o','r','d','@','g','m','a','i'); //
- __EEPROM_DATA('l','.','c','o','m',' ',' ',' '); //
Advertisement
Add Comment
Please, Sign In to add comment
Advertisement