/* PULS-PAUSE-Timer per WDT vom ATtiny25/45/85 Es wird ein '0'-Ausgangssignal an PB3 erzeugt, welches für 10 Minuten aktiv bleibt. Danach werden ca. 60 Tage angewartet, bis ein neuer Impuls ausgegeben wird. Die Genauigkeit des Timimgs liegt bei ca. 1-2 %. Die Stromaufnahme beträgt etwa 7 µA @ 5 V. Michael Nowak www.mino-elektronik.de 2022-01-08 */ #include #include #include #define BIT(x) (1< OUT_PIN1 = 0 ISR(WDT_vect) { // Aufruffrequenz ca. 0,25 Hz if(!wdt_cnt--) { // für +Impuls nachfolgende Zeitvorgaben vertauschen if(PORTB & OUT1_PIN) // bei aktuellem +Pegel wdt_cnt = PULS; // Zeit für -Impuls vorgeben else wdt_cnt = PAUSE; // ansonsten Pausenzeit einstellen PORTB ^= OUT1_PIN; // neuer Ausgangspegel } } int main(void) { CLKPR = 0x80; CLKPR = 0x8; // Vorteiler / 256 CPU-Takt = 31,25 kHz DDRB = 0x1f; // alle Pins als Ausgang und auf GND WDTCR = BIT(WDIE) | BIT(WDP3); // Watchdog-Intervall auf 4 s per Interrupt sei(); // ISR zulassen while(1) { MCUCR = BIT(SE) + BIT(SM1); // Power-Down wählen sleep_cpu(); // und stoppen bis WDT aufweckt } }