Files
HendiControlFirmware/Control/firmware/uart_echo/timer.c
T
jens f5fe03340f - added suspend mode command 'X'
- added timerStop()

git-svn-id: http://moon:8086/svn/projects/HendiControl@66 fda53097-d464-4ada-af97-ba876c37ca34
2019-03-04 20:57:34 +00:00

66 lines
1.2 KiB
C

/*
* timer.c
*
* Created: 20.02.2019 20:56:18
* Author: jens
*/
#include <avr/io.h>
#include <avr/interrupt.h>
#include "timer.h"
#include "message.h"
static uint16_t timer_reload = 0;
static Timer_t user_timer[16];
static Fifo *g_pFifo = NULL;
ISR (TIMER1_OVF_vect) // Timer1 ISR
{
TCNT1 = timer_reload;
for (int i=0; i < 16; i++)
{
if (user_timer[i].isRunning)
{
if (user_timer[i].count > 0)
{
user_timer[i].count--;
}
else
{
Msg_t msg = {Timer, i};
if (fifo_push(g_pFifo, &msg))
{
user_timer[i].isRunning = 0;
}
}
}
}
}
void timer_init(Fifo *pFifo, uint16_t TIMER_RELOAD, TimerClockSel clockSel)
{
g_pFifo = pFifo;
timer_reload = TIMER_RELOAD;
TCNT1 = TIMER_RELOAD;
TCCR1A = 0x00;
TCCR1B = (TCCR1B & TimerClockSel_mask) | clockSel;
TIMSK1 = (1 << TOIE1) ; // Enable timer1 overflow interrupt(TOIE1)
}
void timer_start(TimerId timerId, uint16_t count)
{
enterCritical();
user_timer[timerId].count = count;
user_timer[timerId].isRunning = 1;
exitCritial();
}
void timer_stop(TimerId timerId)
{
enterCritical();
user_timer[timerId].isRunning = 0;
exitCritial();
}