aboutsummaryrefslogtreecommitdiffstats
path: root/timer.c
diff options
context:
space:
mode:
Diffstat (limited to 'timer.c')
-rw-r--r--timer.c61
1 files changed, 61 insertions, 0 deletions
diff --git a/timer.c b/timer.c
new file mode 100644
index 000000000..23663042c
--- /dev/null
+++ b/timer.c
@@ -0,0 +1,61 @@
+#include <avr/io.h>
+#include <avr/interrupt.h>
+#include <stdint.h>
+#include "timer.h"
+
+uint16_t timer_count = 0;
+
+// Configure timer 0 to generate a timer overflow interrupt every
+// 256*1024 clock cycles, or approx 61 Hz when using 16 MHz clock
+// This demonstrates how to use interrupts to implement a simple
+// inactivity timeout.
+void timer_init(void)
+{
+ TCCR0A = 0x00;
+ TCCR0B = 0x05;
+ TIMSK0 = (1<<TOIE0);
+}
+
+inline
+void timer_clear(void)
+{
+ cli();
+ timer_count = 0;
+ sei();
+}
+
+inline
+uint16_t timer_read(void)
+{
+ uint8_t _sreg = SREG;
+ uint16_t t;
+
+ cli();
+ t = timer_count;
+ SREG = _sreg;
+
+ return t;
+}
+
+inline
+uint16_t timer_elapsed(uint16_t last)
+{
+ uint8_t _sreg = SREG;
+ uint16_t t;
+
+ cli();
+ t = timer_count;
+ SREG = _sreg;
+
+ return TIMER_DIFF(t, last);
+}
+
+// This interrupt routine is run approx 61 times per second.
+// A very simple inactivity timeout is implemented, where we
+// will send a space character and print a message to the
+// hid_listen debug message window.
+ISR(TIMER0_OVF_vect)
+{
+ timer_count++;
+}
+