52 lines
1.0 KiB
C
52 lines
1.0 KiB
C
|
#include "timer.h"
|
||
|
#include "timer_macros.h"
|
||
|
|
||
|
void timer_init(void)
|
||
|
{
|
||
|
//// Timer0
|
||
|
// prescaler
|
||
|
TCCR0B &= TCCRnB_CSn_CLEAR;
|
||
|
TCCR0B |= TCCR0B_CS0_prescale1;
|
||
|
// interrupt mask
|
||
|
TIMSK0 &= TIMSKn_ENABLE_INTERRUPT_CLEAR;
|
||
|
TIMSK0 |= TIMSK0_ENABLE_INTERRUPT_on_nothing;
|
||
|
|
||
|
//// Timer1
|
||
|
// prescaler
|
||
|
TCCR1B &= TCCRnB_CSn_CLEAR;
|
||
|
TCCR1B |= TCCR1B_CS1_prescale256;
|
||
|
// interrupt mask
|
||
|
TIMSK1 &= TIMSKn_ENABLE_INTERRUPT_CLEAR;
|
||
|
TIMSK1 |= TIMSK1_ENABLE_INTERRUPT_on_overflow;
|
||
|
|
||
|
SREG |= 0x80; // Status Register
|
||
|
// Enable global interrupts
|
||
|
}
|
||
|
|
||
|
void timer_reset(void)
|
||
|
{
|
||
|
TCNT0 = 0;
|
||
|
TCNT1 = 0;
|
||
|
highBits32 = 0;
|
||
|
highBits64 = 0;
|
||
|
}
|
||
|
|
||
|
ISR(TIMER1_OVF_vect)
|
||
|
{
|
||
|
highBits32 += 0x01 00 00 00;
|
||
|
highBits64 += 0x00 00 00 00 01 00 00 00;
|
||
|
}
|
||
|
|
||
|
uint32_t timer_now32(void)
|
||
|
{
|
||
|
uint32_t lowBits = TCNT0;
|
||
|
uint32_t middleBits = TCNT1;
|
||
|
return highBits32 | (middleBits<<8) | lowBits;
|
||
|
}
|
||
|
|
||
|
uint64_t timer_now64(void)
|
||
|
{
|
||
|
uint64_t lowBits = TCNT0;
|
||
|
uint64_t middleBits = TCNT1;
|
||
|
return highBits64 | (middleBits<<8) | lowBits;
|
||
|
}
|