#include <avr/io.h>
#include <avr/sleep.h>
#include <avr/interrupt.h>
#include <util/delay.h>
// 79 cykli po 8 sekund = ok. 10.48 minuty
#define CYKLE_WDT 79
volatile uint8_t licznik_wdt = 0;
void setup_watchdog(void) {
cli();
#if defined(__AVR_ATtiny13__) || defined(__AVR_ATtiny13A__)
WDTCR |= (1 << WDCE) | (1 << WDE);
WDTCR = (1 << WDTIE) | (0 << WDE) | (1 << WDP3) | (0 << WDP2) | (0 << WDP1) | (1 << WDP0);
#else
WDTCR |= (1 << WDCE) | (1 << WDE);
WDTCR = (1 << WDIE) | (0 << WDE) | (1 << WDP3) | (0 << WDP2) | (0 << WDP1) | (1 << WDP0);
#endif
sei();
}
int main(void) {
DDRB |= (1 << PB0);
PORTB &= ~(1 << PB0);
PORTB |= (1 << PB1) | (1 << PB2) | (1 << PB3) | (1 << PB4) | (1 << PB5);
ADCSRA &= ~(1 << ADEN);
ACSR |= (1 << ACD);
#if defined(__AVR_ATtiny13__) || defined(__AVR_ATtiny13A__)
PRR |= (1 << PRTIM0) | (1 << PRADC);
#else
PRR |= (1 << PRTIM0) | (1 << PRTIM1) | (1 << PRADC);
#endif
setup_watchdog();
while (1) {
if (licznik_wdt >= CYKLE_WDT) {
licznik_wdt = 0;
// --- AKCJA: Włączenie lampki disco i silniczka na 2 sekundy ---
PORTB |= (1 << PB0);
_delay_ms(2000);
PORTB &= ~(1 << PB0);
}
// --- GŁĘBOKI SEN ---
set_sleep_mode(SLEEP_MODE_PWR_DOWN);
sleep_enable();
#if defined(BODS) && defined(BODSE)
MCUCR |= (1 << BODS) | (1 << BODSE);
MCUCR = (MCUCR & ~(1 << BODSE)) | (1 << BODS);
#endif
sleep_cpu();
sleep_disable();
}
}
ISR(WDT_vect) {
licznik_wdt++;
#if defined(__AVR_ATtiny13__) || defined(__AVR_ATtiny13A__)
WDTCR |= (1 << WDTIE);
#else
WDTCR |= (1 << WDIE);
#endif
}