watchdog: Added a test module
authorMichel Pollet <buserror@gmail.com>
Wed, 6 Jan 2010 22:38:25 +0000 (22:38 +0000)
committerMichel Pollet <buserror@gmail.com>
Wed, 6 Jan 2010 22:47:18 +0000 (22:47 +0000)
Small module that tests the watchdog timer

Signed-off-by: Michel Pollet <buserror@gmail.com>
tests/Makefile
tests/atmega48_watchdog_test.c [new file with mode: 0644]

index 68db33c..0cf07f2 100644 (file)
@@ -3,7 +3,6 @@
 # And compile it into an ELF binary.
 # It also disassemble it for debugging purposes.
 # 
-# 
 #      Copyright 2008, 2009 Michel Pollet <buserror@gmail.com>
 #
 #      This file is part of simavr.
@@ -26,7 +25,11 @@ SHELL         = /bin/bash
 
 sources                := $(wildcard at*.c)
 
-all :  ${sources:.c=.axf} ${sources:.c=.hex}  ${sources:.c=.s}  
+all :  ${sources:.c=.axf}
+# if you want hex files
+#all : ${sources:.c=.hex}
+# if you need assembler output
+#all :  ${sources:.c=.s}  
 
 include ../Makefile.common
 
diff --git a/tests/atmega48_watchdog_test.c b/tests/atmega48_watchdog_test.c
new file mode 100644 (file)
index 0000000..e622886
--- /dev/null
@@ -0,0 +1,83 @@
+/*
+       attiny13_watchdog_test.c
+
+       Copyright 2008, 2009 Michel Pollet <buserror@gmail.com>
+
+       This file is part of simavr.
+
+       simavr is free software: you can redistribute it and/or modify
+       it under the terms of the GNU General Public License as published by
+       the Free Software Foundation, either version 3 of the License, or
+       (at your option) any later version.
+
+       simavr is distributed in the hope that it will be useful,
+       but WITHOUT ANY WARRANTY; without even the implied warranty of
+       MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
+       GNU General Public License for more details.
+
+       You should have received a copy of the GNU General Public License
+       along with simavr.  If not, see <http://www.gnu.org/licenses/>.
+ */
+
+
+#include <avr/io.h>
+#include <stdio.h>
+#include <avr/interrupt.h>
+#include <avr/delay.h>
+#include <avr/sleep.h>
+#include <avr/wdt.h>
+
+/*
+ * This demonstrate how to use the avr_mcu_section.h file
+ * The macro adds a section to the ELF file with useful
+ * information for the simulator
+ */
+#include "avr_mcu_section.h"
+AVR_MCU(F_CPU, "atmega48");
+
+static int uart_putchar(char c, FILE *stream) {
+  if (c == '\n')
+    uart_putchar('\r', stream);
+  loop_until_bit_is_set(UCSR0A, UDRE0);
+  UDR0 = c;
+  return 0;
+}
+
+static FILE mystdout = FDEV_SETUP_STREAM(uart_putchar, NULL,
+                                         _FDEV_SETUP_WRITE);
+
+
+ISR(WDT_vect)
+{
+       // nothing to do here, we're just here to wake the CPU
+}
+
+int main()
+{
+       stdout = &mystdout;
+
+       wdt_enable(WDTO_120MS);
+
+       // enable watchdog interupt
+       // NOTE: since the Change Enable bit is no longer on, it should not
+       // change the timer value that is already set!
+       WDTCSR = (1 << WDIE);
+
+       sei();
+
+       printf("Watchdog is active\n");
+       uint8_t count = 20;
+       while (count--) {
+               _delay_ms(10);
+               wdt_reset();
+       }
+       printf("Waiting for Watchdog to kick\n");
+       // now , stop calling the watchdog reset, and just sleep until it fires
+       sleep_cpu();
+       printf("Watchdog kicked us!\n");
+
+       // when arriving here, the watchdog timer interupt was called and woke up
+       // the core from sleep, so we can just quit properly
+       cli();
+       sleep_cpu();
+}