diff options
Diffstat (limited to 'timer.c')
-rw-r--r-- | timer.c | 61 |
1 files changed, 61 insertions, 0 deletions
diff --git a/timer.c b/timer.c new file mode 100644 index 0000000000..23663042c7 --- /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++; +} + |