# HG changeset patch # User darius@Inchoate # Date 1224503535 -37800 # Node ID 13a68734348b7fcd742cf261476fe83867e1dcf3 # Parent fb272cb82bcbacdde948ded919272ebeae19777f Add watchdog timer. diff -r fb272cb82bcb -r 13a68734348b testavr.c --- a/testavr.c Mon Oct 20 22:21:21 2008 +1030 +++ b/testavr.c Mon Oct 20 22:22:15 2008 +1030 @@ -34,6 +34,7 @@ #include #include #include +#include #include "cons.h" #include "1wire.h" @@ -42,8 +43,24 @@ #endif #include "tempctrl.h" +/* + * Mirror of the MCUCSR register, taken early during startup. + */ +uint8_t mcucsr __attribute__((section(".noinit"))); + void process_cmd(void); +/* + * Read out and reset MCUCSR early during startup. + */ +void handle_mcucsr(void) + __attribute__((section(".init3"))) + __attribute__((naked)); +void handle_mcucsr(void) { + mcucsr = MCUCSR; + MCUCSR = 0; +} + int main(void) { /* Disable interrupts while we frob stuff */ @@ -84,29 +101,34 @@ printf_P(PSTR("\r\n\r\n===============\r\n" "Inited!\r\n\r\n")); + if ((mcucsr & _BV(PORF)) == _BV(PORF)) + printf_P(PSTR("Power on reset\r\n")); + + if ((mcucsr & _BV(EXTRF)) == _BV(EXTRF)) + printf_P(PSTR("External reset\r\n")); + + if ((mcucsr & _BV(BORF)) == _BV(BORF)) + printf_P(PSTR("Brown-out reset\r\n")); + + if ((mcucsr & _BV(WDRF)) == _BV(WDRF)) + printf_P(PSTR("Watchdog reset\r\n")); + + if ((mcucsr & _BV(JTRF)) == _BV(JTRF)) + printf_P(PSTR("JTAG reset\r\n")); + tempctrl_init(); /* Ready to go! */ sei(); -#if 0 - DDRA = 0xff; - DDRC = 0xff; - while (1) { - printf_P(PSTR("1\r\n")); - PORTA = 0xff; - printf_P(PSTR("2\r\n")); - PORTC = 0x00; - printf_P(PSTR("3\r\n")); - _delay_us(1); - printf_P(PSTR("4\r\n")); - PORTA = 0x80; - printf_P(PSTR("5\r\n")); - PORTC = 0xff; - printf_P(PSTR("6\r\n")); - } -#endif - + /* + * Enable the watchdog with the largest prescaler. Will cause a + * watchdog reset after approximately 2 s @ Vcc = 5 V + * + * Gets reset in the loop below and in the tempctrl.c timer IRQ + */ + wdt_enable(WDTO_2S); + #ifdef WITHUSB printf_P(PSTR("Calling usb_init\r\n")); usb_init(); @@ -118,6 +140,8 @@ /* Wait for user input or an "interrupt" */ while (1) { + wdt_reset(); + tempctrl_update(); if (cmd.state == 255) {