diff options
author | tmk <nobody@nowhere> | 2010-10-29 15:17:18 +0900 |
---|---|---|
committer | tmk <nobody@nowhere> | 2010-10-30 01:16:47 +0900 |
commit | 45d4a7a89883c3433604d4e011b665796a583008 (patch) | |
tree | b9ff5306dc5eb9a06d7e4a2fb7d0873a9b30606d /timer.c | |
parent | 6c3b9a2ded1afcf4a6bbc69878f52088f4c1a0e8 (diff) | |
download | firmware-45d4a7a89883c3433604d4e011b665796a583008.tar.gz firmware-45d4a7a89883c3433604d4e011b665796a583008.tar.bz2 firmware-45d4a7a89883c3433604d4e011b665796a583008.zip |
improve layer switching
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 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++; +} + |