#include #include #include #include #include #define DUTY 20 #define LED_PIN PB0 #define ONTIME 7210 #define OFFTIME 10101 //#define ONTIME 213 //#define OFFTIME 425 //#define ONTIME 5 //#define OFFTIME 5 #define BIT(x) (1< PB0) } /* When timer is set to Fast PWM Mode, the freqency can be calculated using equation: F = F_CPU / (N * 256) Posible frequencies (@1.2MHz): -> F(N_1) = 4.687kHz -> F(N_8) = 585Hz -> F(N_64) = 73Hz -> F(N_256) = 18Hz -> F(N_1024) = 4Hz */ static void pwm_set_frequency(uint32_t N) { TCCR0B = (TCCR0B & ~((1 << CS02) | (1 << CS01) | (1 << CS00))) | N; // set prescaler } static void pwm_set_duty(uint8_t duty) { OCR0A = duty; // set the OCRnx } static void pwm_stop(void) { TCCR0B &= ~((1 << CS02) | (1 << CS01) | (1 << CS00)); // stop the timer } ISR(WDT_vect) { cli(); seccount++; // set prescaler to "4s" (measured 5s on my attiny13) and enable Watchdog Timer WDTCR |= (1 << WDCE); WDTCR = (1 << WDTIE) | (0 << WDE) | (1 << WDP3) | (0 << WDP2) | (0 << WDP1) | (0 << WDP0); sei(); // enable global interrupts // start the lights if(!onoff && (seccount > OFFTIME)) { onoff=1; seccount=0; lastsec=0; pwm_set_frequency(N_8); pwm_init(); pwm_set_duty(DUTY); set_sleep_mode(SLEEP_MODE_ADC); return; } // stop the lights if(onoff && seccount > ONTIME){ onoff=0; seccount=0; lastsec=0; pwm_set_duty(0); pwm_stop(); digitalWrite(PB0,0); MCUCR = BIT(SE) + BIT(SM1); // Power-Down wählen sleep_cpu(); // und stoppen bis WDT aufweckt } } void setup() { _delay_ms(5000); /* setup */ pinMode(LED_PIN, OUTPUT); setPrescaler(4); pwm_set_frequency(N_8); pwm_init(); pwm_set_duty(DUTY); onoff=1; seccount = 0; cli(); WDTCR |= (1 << WDCE); WDTCR = (1 << WDTIE) | (0 << WDE) | (1 << WDP3) | (0 << WDP2) | (0 << WDP1) | (0 << WDP0); sei(); // enable global interrupts } void loop() { // todo check light conditions and change duty // todo check battery state and switch off }