#include <xc.h>
|
|
#include <avr/io.h>
|
|
#include <util/delay.h>
|
|
|
|
#include <avr/interrupt.h>
|
|
#include <avr/sleep.h>
|
|
#include <util/atomic.h>
|
|
#include <avr/wdt.h>
|
|
|
|
//reference: https://www.avrfreaks.net/forum/sample-project-attiny10
|
|
//another ref: https://blog.podkalicki.com/attiny13-blinky-with-timer-compa/
|
|
//
|
|
|
|
// Wake up by WDT interrupt.
|
|
// Don't need to do anything here but (auto-) clearing the interrupt flag.
|
|
EMPTY_INTERRUPT(WDT_vect);
|
|
|
|
/*
|
|
Delay in powerdown mode. Wake up by watchdog interrupt.
|
|
*/
|
|
void delay_power_down_wdt(uint8_t wdto)
|
|
{
|
|
wdt_reset();
|
|
wdt_enable(wdto);
|
|
WDTCSR |= (1<<WDIE);
|
|
//so far (with 128Khz clk) this sleep will be about 30-40 seconds.
|
|
|
|
//(however, I'll add the below to)
|
|
//adjust sleep speed here:
|
|
|
|
// 0110 is 1hz at 128KHz
|
|
//WDTCSR |= (0<< WDP3);
|
|
//WDTCSR |= (1<< WDP2);
|
|
//WDTCSR |= (1<< WDP1);
|
|
//WDTCSR |= (0<< WDP0);
|
|
|
|
set_sleep_mode(SLEEP_MODE_PWR_DOWN);
|
|
sleep_enable();
|
|
// Make sure interrups are enabled and the I flag is restored
|
|
NONATOMIC_BLOCK(NONATOMIC_RESTORESTATE)
|
|
{
|
|
sleep_cpu();
|
|
wdt_disable();
|
|
}
|
|
sleep_disable();
|
|
}
|
|
|
|
|
|
int main(void)
|
|
{
|
|
|
|
sei();
|
|
|
|
//Write CCP (to enable changing clock)
|
|
CCP = 0xD8;
|
|
//change CLK to 128KHz
|
|
CLKMSR = 0b01;
|
|
|
|
//In order to use the lowest sleep mode, we must either
|
|
//use watchdog or pin change interrupt to wake ic.
|
|
//here i will use watchdog
|
|
|
|
|
|
|
|
// PB2 change to output
|
|
DDRB = 1<<2;
|
|
|
|
while(1)
|
|
{
|
|
// Toggle PB2 Hi/Low
|
|
PINB = 1<<2;
|
|
//_delay_ms(500);
|
|
delay_power_down_wdt(WDTO_1S);
|
|
}
|
|
}
|
|
|