Advertisement
Guest User

Untitled

a guest
May 1st, 2014
496
0
Never
Not a member of Pastebin yet? Sign Up, it unlocks many cool features!
C 3.09 KB | None | 0 0
  1. //v0 4/21/2014 by Everett, modified 01/05/2014 by Mattaus
  2. //Modified for PIC10F322
  3. //Simple flashlight controller. Mode change on power cycle. 3 modes, no strobe.
  4.  
  5. #include <htc.h>
  6. #include <pic10f322.h>
  7.  
  8. #define _XTAL_FREQ 8000000
  9. #define max_mode 2  //number of modes is 3 (0,1,2)
  10. #define default_mode 0  //default mode is first mode
  11. #define on_time 15  //milliseconds
  12.  
  13. __CONFIG(FOSC_INTOSC & WDTE_SWDTEN & PWRTE_ON & MCLRE_ON & CP_OFF & CPD_OFF & BOREN_ON & CLKOUTEN_OFF & IESO_OFF & FCMEN_OFF);
  14. __CONFIG(WRT_BOOT & PLLEN_OFF & STVREN_ON & BORV_LO & LVP_OFF);
  15.  
  16. persistent unsigned char mode;  //must be declared persistent for ram retention trick to work
  17. enum mode
  18. {
  19.     max=0,  //first mode is high
  20.     med=1,  //second mode is med
  21.     low=2,  //third mode is low
  22. };
  23.  
  24. bit on_off;
  25. persistent unsigned int key;
  26.  
  27. void delayms(int milliseconds);
  28. void configure(void);
  29.  
  30. void interrupt isr(void)
  31. {
  32.     if(TMR1IF)
  33.     {
  34.         TMR1IF=0;
  35.     }
  36.  
  37.     if(TMR0IF)                  //fires at 1kHz
  38.     {  
  39.         TMR0IF=0;
  40.         if(strobe_timer){strobe_timer--;}   //count down milliseconds
  41.     }
  42. }
  43.  
  44. void main(void)
  45. {
  46.     configure();                //set up hardware peripherals
  47.    
  48.     delayms(15);                //short delay to avoid power glitches incrementing mode
  49.    
  50.     if(key==12345)              //RAM retention trick to detect quick power cycles
  51.     {              
  52.         mode++;             //go to next mode
  53.         if(mode>max_mode){mode=0;}  //if on third mode, cycle back to first mode
  54.     }  
  55.     else                    //long power loss. default to first mode
  56.     {                  
  57.         mode=default_mode;      //start in first mode
  58.         key=12345;          //set key back so it can recognise power outage
  59.     }      
  60.  
  61.  
  62.     switch(mode)                //initialize current mode
  63.     {              
  64.         default:
  65.         case max:
  66.             CCPR1L=255;     //PWM output to 100%
  67.             break;          //pause
  68.         case med:
  69.             CCPR1L=25;      //PWM out to 10%
  70.             break;          //pause
  71.         case low:
  72.             CCPR1L=1;       //PWM out to 0.4%
  73.             break;          //pause
  74.  
  75.     }      
  76.  
  77.    
  78.     GIE=1;                  //turn on interrupts
  79.  
  80. }
  81.  
  82. void delayms(int milliseconds)                  //I have no idea what this section does
  83. {                               //
  84.     while(milliseconds!=0){ __delay_ms(1); milliseconds--;} //
  85. }                               //
  86.  
  87. void configure(void)
  88. {
  89.     INTCON=0b01100000;
  90.     PIR1=0;
  91.     PIR2=0;
  92.     T1CON=0b00110001;
  93.     T2CON=0b00000101;
  94.     PR2=255;
  95.     TMR2=0;
  96.        
  97.     LATA=0;
  98.     TRISA=0b11111011;
  99.     ANSELA=0b00000000; 
  100.     WPUA=0b11111011;
  101.     APFCON=0;
  102.  
  103.     OSCCON=0b01110011;  //8MHz
  104.     PIE1=0b00000000;
  105.     PIE2=0;
  106.     OPTION_REG=0b00000010;  //8 prescale for 1ms interrupts
  107.  
  108. //  FVRCON=0b11000001;  //Need to change this register for 2.048v to adc (currently set to 1.024v)
  109. //  ADCON0=0b00001101;  //
  110. //  ADCON1=0b00010000;  //1/8, left justify, vref from vdd
  111.  
  112.     CCPR1L=0;
  113.     CCP1CON=0b00001100;
  114. }
  115.  
  116.  
  117. __EEPROM_DATA(0,0,0,0,0,0,0,0);         //Not sure what this stuff is for either
  118. __EEPROM_DATA(0, 0, 0, 0, 0, 0, 0, 0);      //
  119. __EEPROM_DATA(0, 0, 0, 0, 0, 0, 0, 0);      //
  120. __EEPROM_DATA('1','8','2','2',' ','f','l','a'); //
  121. __EEPROM_DATA('s','h','l','i','g','h','t',' '); //
  122. __EEPROM_DATA('b','y',' ','E','v','e','r','e'); //
  123. __EEPROM_DATA('t','t',' ','e','v','e','r','e'); //
  124. __EEPROM_DATA('t','t','.','b','r','a','d','f'); //
  125. __EEPROM_DATA('o','r','d','@','g','m','a','i'); // 
  126. __EEPROM_DATA('l','.','c','o','m',' ',' ',' '); //
Advertisement
Add Comment
Please, Sign In to add comment
Advertisement