/*
* Blink and Sleep by Reset (Test register not initialized by Reset)
*
* Created: 2019/xx/xx
* Author : potesara
*
* PoerON->[MODE1]->Reset->[MODE2]->Reset->[MODE3]->Reset->[Sleep]->Reset->[MODE1] (loop)
*
* ATtiny13A
* LED : PB0~PB4
* Mode Switch : PB5(Reset Pin)
*
*/
#define F_CPU 1200000UL // 1MHz
#include <avr/io.h>
#include <util/delay.h>
#include <avr/sleep.h>
//int dummy;
//#define MODE dummy // Global Val. not initialized by reset?
#define MODE EEARL // Register not initialized by reset
#define POWER_ON ((MCUSR & 0b00000001)==1)
#define clr_power_on() (MCUSR&=0b11111110)
void setup(void){
_delay_ms(30); // Wait for switch bounce
DDRB = 0b00011111; // PB4~PB0 Port OUTPUT Mode
PORTB = 0b00000000; // PB4~PB0 LOW
if(MODE==0 || POWER_ON){ // Reset in MODE0 or PowerON Reset
clr_power_on(); // Clear POWER ON Flag
MODE = 1;
}else if(MODE==1){ // Reset in MODE1
MODE = 2;
}else if(MODE==2){ // Reset in MODE2
MODE = 3;
}else if(MODE>=3){ // Reset in MODE3 or else
MODE = 0;
set_sleep_mode(SLEEP_MODE_PWR_DOWN);
sleep_mode();
}
}
int main(void){
int i;
setup();
while (1){
for(i=0;i<MODE;i++){ // Flashes for the number of MODEs
PORTB = 0b00011111;
_delay_ms(100);
PORTB = 0b00000000;
_delay_ms(200);
}
PORTB = 0b00000000; // wait 1sec
_delay_ms(1000);
}
}