# HG changeset patch # User Matt Johnston # Date 1340548234 -28800 # Node ID 0d3d14af55c2a7d06de8375f753adebacc2eb5c8 # Parent 56b1f02f470cc0886362ba0048a6ecd5cc6cc260 add "awake" and "reset" functions diff -r 56b1f02f470c -r 0d3d14af55c2 main.c --- a/main.c Sun Jun 24 17:22:26 2012 +0800 +++ b/main.c Sun Jun 24 22:30:34 2012 +0800 @@ -7,6 +7,7 @@ #include #include #include +#include #include // for DWORD of get_fattime() @@ -115,8 +116,15 @@ static void setup_chip() { + cli(); + + // stop watchdog timer (might have been used to cause a reset) + wdt_reset(); + MCUSR &= ~_BV(WDRF); + WDTCSR |= _BV(WDCE) | _BV(WDE); + WDTCSR = 0; + // Set clock to 2mhz - cli(); CLKPR = _BV(CLKPCE); // divide by 4 CLKPR = _BV(CLKPS1); @@ -294,6 +302,23 @@ } static void +cmd_awake() +{ + comms_timeout = WAKE_SECS; + printf_P(PSTR("awake %hu\n"), WAKE_SECS); +} + +static void +cmd_reset() +{ + printf_P(PSTR("reset\n")); + _delay_ms(100); + cli(); // disable interrupts + wdt_enable(WDTO_15MS); // enable watchdog + while(1); // wait for watchdog to reset processor +} + +static void cmd_measure() { printf_P(PSTR("measuring\n")); @@ -466,10 +491,18 @@ { cmd_add_all(); } + else if (strcmp_P(readbuf, PSTR("awake"))== 0) + { + cmd_awake(); + } else if (strcmp_P(readbuf, PSTR("init")) == 0) { cmd_init(); } + else if (strcmp_P(readbuf, PSTR("reset")) == 0) + { + cmd_reset(); + } else { printf_P(PSTR("Bad command\n")); @@ -479,6 +512,7 @@ ISR(INT0_vect) { need_comms = 1; + comms_timeout = WAKE_SECS; blink(); _delay_ms(100); blink(); @@ -728,7 +762,6 @@ printf_P(PSTR("Bad interrupt\n")); } - int main(void) { setup_chip();