#include <avr/sleep.h> // Sleep Modes
#include <avr/power.h> // Power management
// ATMEL ATTINY 25/45/85 / ARDUINO
// Pin 1 is /RESET
//
// +-\/-+
// Ain0 (D 5) PB5 1| |8 Vcc
// Ain3 (D 3) PB3 2| |7 PB2 (D 2) Ain1
// Ain2 (D 4) PB4 3| |6 PB1 (D 1) pwm1
// GND 4| |5 PB0 (D 0) pwm0
// +----+
#define blink_delay 250
#define led_pin 0
int loop_cnt = 0;
void setup() {
// put your setup code here, to run once:
// Debug.begin();
// Debug.println("setting up");
//adc_disable(); // ADC uses ~320uA
//set_sleep_mode(SLEEP_MODE_PWR_DOWN);
blink_it(1);
}
void loop() {
loop_cnt++;
// put your main code here, to run repeatedly:
// Debug.print("starting loop ");
// Debug.println(loop_cnt);
blink_it(2);
delay(100);
goToSleep();
// Sleep();
blink_it(3);
// Debug.print("ending loop ");
// Debug.println(loop_cnt);
delay(2000);
}
// --------------------------------------- FUNCTIONS
void goToSleep ()
{
set_sleep_mode (SLEEP_MODE_PWR_DOWN);
noInterrupts (); // timed sequence coming up
sleep_enable (); // ready to sleep
interrupts (); // interrupts are required now
// Debug.println("about to sleep");
sleep_cpu (); // sleep
sleep_disable (); // precaution
} // end of goToSleep
void Sleep() {
GIMSK |= _BV(PCIE); // Enable Pin Change Interrupts
PCMSK |= _BV(PCINT3); // Use PB3 as interrupt pin
ADCSRA &= ~_BV(ADEN); // ADC off
set_sleep_mode(SLEEP_MODE_PWR_DOWN); // replaces above statement
sleep_enable(); // Sets the Sleep Enable bit in the MCUCR Register (SE BIT)
sei(); // Enable interrupts
sleep_cpu(); // sleep
cli(); // Disable interrupts
PCMSK &= ~_BV(PCINT3); // Turn off PB3 as interrupt pin
sleep_disable(); // Clear SE bit
ADCSRA |= _BV(ADEN); // ADC on
sei(); // Enable interrupts
} // sleep
ISR(PCINT0_vect) {
// This is called when the interrupt occurs, but I don't need to do anything in it
}
void blink_it(int times) {
int i;
for (i=1; i <= times; i++) {
digitalWrite(led_pin, HIGH);
delay(blink_delay);
digitalWrite(led_pin, LOW);
delay(blink_delay);
}
delay(2000);
}