diff options
author | tmk <nobody@nowhere> | 2012-06-11 10:53:02 +0900 |
---|---|---|
committer | tmk <nobody@nowhere> | 2012-06-11 10:53:02 +0900 |
commit | 62d1ebb91c7b381ce3d88aad9ee0b03bea9fce26 (patch) | |
tree | 6b10864a310f611187e1b61102da7da1db1d2e29 /common/timer.c | |
parent | 225de7a847a511d004bf909b1334e19497cf2f9d (diff) | |
parent | 81706d1130fdc3c0d6d110f4d8665c47ffd7fb59 (diff) |
Merge branch 'newdir'
Diffstat (limited to 'common/timer.c')
-rw-r--r-- | common/timer.c | 89 |
1 files changed, 89 insertions, 0 deletions
diff --git a/common/timer.c b/common/timer.c new file mode 100644 index 0000000000..48a38c9b68 --- /dev/null +++ b/common/timer.c @@ -0,0 +1,89 @@ +/* +Copyright 2011 Jun Wako <wakojun@gmail.com> + +This program 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 2 of the License, or +(at your option) any later version. + +This program 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 this program. If not, see <http://www.gnu.org/licenses/>. +*/ + +#include <avr/io.h> +#include <avr/interrupt.h> +#include <stdint.h> +#include "timer.h" + + +// counter resolution 1ms +volatile uint16_t timer_count = 0; + +void timer_init(void) +{ + // Timer0 CTC mode + TCCR0A = 0x02; + +#if TIMER_PRESCALER == 1 + TCCR0B = 0x01; +#elif TIMER_PRESCALER == 8 + TCCR0B = 0x02; +#elif TIMER_PRESCALER == 64 + TCCR0B = 0x03; +#elif TIMER_PRESCALER == 256 + TCCR0B = 0x04; +#elif TIMER_PRESCALER == 1024 + TCCR0B = 0x05; +#else +# error "Timer prescaler value is NOT vaild." +#endif + + OCR0A = TIMER_RAW_TOP; + TIMSK0 = (1<<OCIE0A); +} + +inline +void timer_clear(void) +{ + uint8_t sreg = SREG; + cli(); + timer_count = 0; + SREG = sreg; +} + +inline +uint16_t timer_read(void) +{ + uint16_t t; + + uint8_t sreg = SREG; + cli(); + t = timer_count; + SREG = sreg; + + return t; +} + +inline +uint16_t timer_elapsed(uint16_t last) +{ + uint16_t t; + + uint8_t sreg = SREG; + cli(); + t = timer_count; + SREG = sreg; + + return TIMER_DIFF_MS(t, last); +} + +// excecuted once per 1ms.(excess for just timer count?) +ISR(TIMER0_COMPA_vect) +{ + timer_count++; +} |