~gabe/flashlight-firmware/anduril2

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
//MiniMo -- minimalistic driver firmware for momentary buttons (no blinkies)  --  DrJones 2014
#define F_CPU 4800000                    //use fuses  low:0x75  high:0xff
#include <avr/io.h>
#include <util/delay.h>
//change modes here; just change/add/delete values. The "0" is 'off' 
uint8_t modes[]={0,  8,90,255};          //PWM values, 5..255 - LEAVE THE "0" THERE
int main() {
  DDRB=2; PORTB=8;                       //define PB1 as output and pull-up switch on PB3
  TCCR0A=0b00100001; TCCR0B=0b00000001;  //PWM setup, 9kHz
  uint8_t count=0,mode=0,lastmode=1,waspressed=0; //define some variables used below

  while(1) {                             //endless loop

    if ((PINB&8)==0) {                   //when the button is pressed (PB3 pulled down)
      count++;                           //count length of button press
      if (count==16) {                    //pressed long (8*50ms)
        if (mode>0) {lastmode=mode; mode=0;}  //was on?  -> off, but remember the mode
        else mode=lastmode;                   //was off? -> on, with previous mode.
      }
      waspressed=1;                      //remember that the button was pressed, see below
    }
    else {                               //button not pressed
      if (waspressed) {                    //but it was pressed, so it has just been released!
        waspressed=0;                      //reset that
        if (count<16 && mode>0) {           //really was a short press AND the light is on
          mode++; if (mode>=sizeof(modes)) mode=1; //next mode
        }
        count=0;                           //reset counter
      }
    }    

  OCR0B=modes[mode];                     //set PWM level (0 is off)
  _delay_ms(25);                         //wait a bit before checking again, important for counting
  }
}