21#include <avr/interrupt.h>
28#if (PX_SYSCLK_CFG_USE_TMRX == 0)
30#define TMR_VECT TIMER0_COMPA_vect
31#define TMR_INT_ENABLE() PX_BIT_SET_HI(TIMSK0, OCIE0A)
32#define TMR_INT_DISABLE() PX_BIT_SET_LO(TIMSK0, OCIE0A)
33#define TMR_INT_IS_ENABLED() PX_BIT_IS_HI(TIMSK0, OCIE0A)
35#if (PX_SYSCLK_CFG_TMR_PRESCALER == 1)
37#elif (PX_SYSCLK_CFG_TMR_PRESCALER == 8)
39#elif (PX_SYSCLK_CFG_TMR_PRESCALER == 64)
41#elif (PX_SYSCLK_CFG_TMR_PRESCALER == 256)
43#elif (PX_SYSCLK_CFG_TMR_PRESCALER == 1024)
46#error "PX_SYSCLK_TMR_PRESCALER value is invalid"
49#elif (PX_SYSCLK_CFG_USE_TMRX == 1)
51#define TMR_VECT TIMER1_COMPA_vect
52#define TMR_INT_ENABLE() PX_BIT_SET_HI(TIMSK1, OCIE1A)
53#define TMR_INT_DISABLE() PX_BIT_SET_LO(TIMSK1, OCIE1A)
54#define TMR_INT_IS_ENABLED() PX_BIT_IS_HI(TIMSK1, OCIE1A)
55#if (PX_SYSCLK_CFG_TMR_PRESCALER == 1)
57#elif (PX_SYSCLK_CFG_TMR_PRESCALER == 8)
59#elif (PX_SYSCLK_CFG_TMR_PRESCALER == 64)
61#elif (PX_SYSCLK_CFG_TMR_PRESCALER == 256)
63#elif (PX_SYSCLK_CFG_TMR_PRESCALER == 1024)
66#error "PX_SYSCLK_TMR_PRESCALER value is invalid"
69#elif (PX_SYSCLK_CFG_USE_TMRX == 2)
71#define TMR_VECT TIMER2_COMPA_vect
72#define TMR_INT_ENABLE() PX_BIT_SET_HI(TIMSK2, OCIE2A)
73#define TMR_INT_DISABLE() PX_BIT_SET_LO(TIMSK2, OCIE2A)
74#define TMR_INT_IS_ENABLED() PX_BIT_IS_HI(TIMSK2, OCIE2A)
75#if (PX_SYSCLK_CFG_TMR_PRESCALER == 1)
77#elif (PX_SYSCLK_CFG_TMR_PRESCALER == 8)
79#elif (PX_SYSCLK_CFG_TMR_PRESCALER == 32)
81#elif (PX_SYSCLK_CFG_TMR_PRESCALER == 64)
83#elif (PX_SYSCLK_CFG_TMR_PRESCALER == 128)
85#elif (PX_SYSCLK_CFG_TMR_PRESCALER == 256)
87#elif (PX_SYSCLK_CFG_TMR_PRESCALER == 1024)
90#error "PX_SYSCLK_TMR_PRESCALER value is invalid"
94#error "Specified TMR not supported!"
105#ifdef PX_SYSCLK_CFG_TIMEOUT_PERIOD_TICKS
116 px_sysclk_tick_counter++;
118#ifdef PX_SYSCLK_CFG_TIMEOUT_PERIOD_TICKS
120 if(--px_sysclk_timeout_counter == 0)
126#ifdef PX_SYSCLK_CFG_ON_PERIODIC_TIMEOUT
128 PX_SYSCLK_CFG_ON_PERIODIC_TIMEOUT();
131#ifdef PX_SYSCLK_CFG_TIMEOUT_PERIOD_TICKS
139#if (PX_SYSCLK_CFG_USE_TMRX == 0)
142 TCCR0A = (1 << WGM01) | (0 << WGM00);
143 TCCR0B = (0 << WGM02) | (PX_SYSCLK_CS << CS00);
150#elif (PX_SYSCLK_CFG_USE_TMRX == 1)
153 TCCR1A = (0 << WGM11) | (0 << WGM10);
154 TCCR1B = (0 << WGM13) | (1 << WGM12) | (PX_SYSCLK_CS << CS10);
161#elif (PX_SYSCLK_CFG_USE_TMRX == 2)
164 TCCR2A = (1 << WGM21) | (0 << WGM20);
165 TCCR2B = (0 << WGM22) | (PX_SYSCLK_CS << CS20);
173 #error "Specified TMR not supported!"
176#ifdef PX_SYSCLK_CFG_TIMEOUT_PERIOD_TICKS
187 bool enabled = TMR_INT_IS_ENABLED();
206 counter = px_sysclk_tick_counter;
bool px_sysclk_disable(void)
Disable system clock.
#define PX_SYSCLK_CFG_TIMEOUT_PERIOD_TICKS
Specify periodic timeout (in sysclk ticks)
#define PX_SYSCLK_CFG_TMR_PRESCALER
Specify TMR Prescaler.
#define PX_SYSCLK_CFG_TICKS_PER_SEC
The number of system clock ticks per second.
void px_sysclk_enable(void)
Enable system clock.
#define F_CPU
Processor frequency in Hz.
#define PX_UDIV_ROUND(dividend, divisor)
Calculate unsigned division with rounding to nearest integer value.
px_sysclk_ticks_t px_sysclk_get_tick_count(void)
Return number of ticks since system clock started.
uint32_t px_sysclk_ticks_t
Size definition of the tick counter.
void px_sysclk_init(void)
Start system clock (one clock tick every 1/PX_SYSCLK_TICKS_PER_SEC seconds)