/****************************************************************************************************** * Demoprogramm für die Verwendung von WD-Timer und WD-Reset gleichzeitig * Plattform: Tiny25/45/85 * * LED-Anzeigen zur Programmverfolgung * alle LED-Anzeigen im STK500: Low-Aktiv * * Funktion: * - zunächst für 1s Anzeige der Resetursachen * - dann 4Hz-Blinken PB1 für 12.5s * - dann 20Hz-Blinken für 6s * - Anzeige durch PB4: nächste 2s für den nächsten WDI und dann noch 2s bis zum WD Reset (Summe 10s) * - Neustart des Programms durch WD * - WD abschalten und Stop * - Anzeige WD-Reset WDRF in MCUSR * - ENDE * * Nur WD-Timer: WDE nicht setzen! * Nur WD-Reset: WDIE nicht setzen, keine WDT-ISR! WD muss zyklisch mit wdt_reset() bedient werden. * * 2.12.17 - HildeK *******************************************************************************************************/ #define F_CPU 1E6 #include #include #include #include volatile uint8_t wd_flag = 0; /*****************************/ ISR(WDT_vect) { wd_flag = 1; } /*****************************/ int main() { uint8_t i; cli(); // falls WD-Reset erfolgt ist: alle Interrupts ausschalten - weil in dem Programm (Demo!) nach WD-Reset angehalten werden soll. PORTB = 0xFF; // Pulls und STK500-LEDs an PB0/1/2/3/4 => off DDRB = 31; // PB0/1/2/3/4 für LEDs if ((MCUSR & (1< keine Reaktion der LED an PB2 if(wd_flag) // alle 2 Sekunden kommt WD-IRQ und setzt wd_flag --> langsames Blinken PB2 { wd_flag = 0; // Flag zurücksetzen PORTB ^= (1< WD-Reset erfolgt } } }