2011-07-20 15:32:52 +00:00
/*
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/>.
*/
2010-10-29 06:17:18 +00:00
# ifndef TIMER_H
# define TIMER_H 1
# include <stdint.h>
2011-09-17 13:39:50 +00:00
# ifndef TIMER_PRESCALER
# if F_CPU > 16000000
# define TIMER_PRESCALER 256
2012-08-25 06:49:08 +00:00
# elif F_CPU > 2000000
2011-09-17 13:39:50 +00:00
# define TIMER_PRESCALER 64
2012-08-25 06:49:08 +00:00
# elif F_CPU > 250000
2011-09-17 13:39:50 +00:00
# define TIMER_PRESCALER 8
2012-08-25 06:49:08 +00:00
# else
# define TIMER_PRESCALER 1
2011-09-17 13:39:50 +00:00
# endif
# endif
# define TIMER_RAW_FREQ (F_CPU / TIMER_PRESCALER)
# define TIMER_RAW TCNT0
# define TIMER_RAW_TOP (TIMER_RAW_FREQ / 1000)
# if (TIMER_RAW_TOP > 255)
# error "Timer0 can't count 1ms at this clock freq. Use larger prescaler."
# endif
# define TIMER_DIFF(a, b, max) ((a) >= (b) ? (a) - (b) : (max) - (b) + (a))
2012-09-02 14:47:18 +00:00
# define TIMER_DIFF_8(a, b) TIMER_DIFF(a, b, UINT8_MAX)
# define TIMER_DIFF_16(a, b) TIMER_DIFF(a, b, UINT16_MAX)
# define TIMER_DIFF_32(a, b) TIMER_DIFF(a, b, UINT32_MAX)
2012-09-04 04:29:21 +00:00
# define TIMER_DIFF_RAW(a, b) TIMER_DIFF_8(a, b)
2010-10-29 06:17:18 +00:00
2012-08-25 06:49:08 +00:00
# ifdef __cplusplus
extern " C " {
# endif
2012-09-04 04:29:21 +00:00
2012-09-02 14:47:18 +00:00
extern volatile uint32_t timer_count ;
2010-10-29 06:17:18 +00:00
void timer_init ( void ) ;
void timer_clear ( void ) ;
uint16_t timer_read ( void ) ;
2012-09-02 14:47:18 +00:00
uint32_t timer_read32 ( void ) ;
2010-10-29 06:17:18 +00:00
uint16_t timer_elapsed ( uint16_t last ) ;
2012-09-02 14:47:18 +00:00
uint32_t timer_elapsed32 ( uint32_t last ) ;
2012-09-04 04:29:21 +00:00
2012-08-25 06:49:08 +00:00
# ifdef __cplusplus
}
# endif
2010-10-29 06:17:18 +00:00
# endif