From b89a708807c72c67b128aa3d684afdbd694f66bc Mon Sep 17 00:00:00 2001 From: Lars-Dominik Braun Date: Mon, 24 Feb 2014 15:32:57 +0100 Subject: Add simple timer that counts one second --- timer.c | 56 ++++++++++++++++++++++++++++++++++++++++++++++++++++++++ 1 file changed, 56 insertions(+) create mode 100644 timer.c (limited to 'timer.c') diff --git a/timer.c b/timer.c new file mode 100644 index 0000000..5830b38 --- /dev/null +++ b/timer.c @@ -0,0 +1,56 @@ +#include +#include + +#include "timer.h" + +volatile unsigned char count = 0; +volatile unsigned char hit = 0; + +ISR(TIMER0_OVF_vect) { + /* there seems to be no mode of operation which disconnects pin OC0A _and_ + * clears the value */ + ++count; + switch (count) { + case 1: + case 2: + TCNT0 = 0; + break; + + /* three overflows happened, next one is a little shorter: + * F_CPU/prescaler-3*256=208.5625 -> 256-208=48 -> zero-based=47 */ + case 3: + TCNT0 = 47; + break; + + /* one second elapsed */ + case 4: + TCNT0 = 0; + count = 0; + ++hit; + break; + } +} + +bool timerHit () { + bool ret = hit != 0; + hit = 0; + return ret; +} + +void timerStart () { + count = 0; + /* reset timer value */ + TCNT0 = 0; + /* set normal mode timer0 */ + TCCR0A = 0; + /* enable overflow interrupt */ + TIMSK0 = (1 << TOIE0); + /* io clock with 1024 prescaler */ + TCCR0B = (TCCR0B & ~((1 << CS01)) | (1 << CS02) | (1 << CS00)); +} + +void timerStop () { + /* zero clock source */ + TCCR0B = 0; +} + -- cgit v1.2.3