Subversion Repositories HomeAutomation

Rev

Rev 544 | Blame | Compare with Previous | Last modification | View Log | SVN | RSS feed

  1. /**
  2.  * Timer software module. Utilizes a hardware timer to provide a number of
  3.  * software timers to the application. Each timer can be set to either one-shot
  4.  * or free-running mode.
  5.  *
  6.  * @author  Andreas Fritiofson
  7.  *
  8.  * @date    2007-07-13
  9.  */
  10.  
  11. /*-----------------------------------------------------------------------------
  12.  * Includes
  13.  *---------------------------------------------------------------------------*/
  14. #include <inttypes.h>
  15. #include <avr/io.h>
  16. #include <avr/interrupt.h>
  17.  
  18. #include <drivers/timer/timer.h>
  19. #include "timer_cfg.h"
  20.  
  21.  
  22. /*-----------------------------------------------------------------------------
  23.  * Globals
  24.  *---------------------------------------------------------------------------*/
  25. volatile uint32_t ticks;
  26.  
  27. struct {
  28.     uint16_t timeout;
  29.     uint16_t reload;
  30.     unsigned char expired;
  31.     timerCallback_t callback;
  32. } timers[TIMER_NUM_TIMERS];
  33.  
  34. /*-----------------------------------------------------------------------------
  35.  * Interrupt Service Routines
  36.  *---------------------------------------------------------------------------*/
  37. ISR(TIMER_VECTOR)
  38. {
  39.     uint8_t t;
  40. #if defined(TIMER_RELOAD)
  41.     /* The hw timer does not support auto-reload so set the count manually. */
  42.     TIMER_RELOAD(TIMER_COUNTS_PER_TICK);
  43. #endif
  44.  
  45.     /* Increase the global tick count. */
  46.     ticks++;
  47.    
  48.     /* Decrease the timeout of all active timers and check if any have
  49.      * expired. */
  50.     for (t = 0; t < TIMER_NUM_TIMERS; t++)
  51.     {
  52.         if ((timers[t].timeout > 0) && (--timers[t].timeout == 0))
  53.         {
  54.             timers[t].expired = 1;
  55.             timers[t].timeout = timers[t].reload;
  56.             /* Call the callback, if any. */
  57.             if (timers[t].callback) timers[t].callback(t);
  58.         }
  59.     }
  60. }
  61.  
  62.  
  63. /*-----------------------------------------------------------------------------
  64.  * Public Functions
  65.  *---------------------------------------------------------------------------*/
  66.  
  67. void Timer_Init()
  68. {
  69.     /* Do basic setup of the timer hw, including interrupts. */
  70.     TIMER_INIT();
  71. #if defined(TIMER_RELOAD)
  72.     /* The hw timer does not support auto-reload so set the count manually. */
  73.     TIMER_RELOAD(TIMER_COUNTS_PER_TICK);
  74. #endif
  75. #if defined(TIMER_COMPARE_REG)
  76.     /* The hw timer has a compare match module so use it for auto-reload. */
  77.     TIMER_COMPARE_REG = TIMER_COUNTS_PER_TICK;
  78. #endif
  79.     /* Finalize hw setup and start the timer by setting its prescaler. */
  80.     TIMER_SET_PRESCALER();
  81. }
  82.  
  83. /*---------------------------------------------------------------------------*/
  84.  
  85. uint32_t Timer_GetTicks()
  86. {
  87.     uint32_t res;
  88.     uint8_t sreg = SREG;
  89.     cli();
  90.     res = ticks;
  91.     SREG = sreg;
  92.     return res;
  93. }
  94.  
  95. /*---------------------------------------------------------------------------*/
  96.  
  97. void Timer_SetTimeout(uint8_t timer, uint16_t timeout, uint8_t type, timerCallback_t callback)
  98. {
  99.     if (timer<TIMER_NUM_TIMERS)
  100.     {
  101.         uint8_t sreg = SREG;
  102.         cli();
  103.         timers[timer].expired = 0;
  104.         timers[timer].timeout = timeout;
  105.         if (type == TimerTypeFreeRunning)
  106.             timers[timer].reload = timeout;
  107.         else
  108.             timers[timer].reload = 0;
  109.         timers[timer].callback = callback;
  110.         SREG = sreg;
  111.     }
  112. }
  113.  
  114. /*---------------------------------------------------------------------------*/
  115.  
  116. uint8_t Timer_Expired(uint8_t timer)
  117. {
  118.     if ((timer<TIMER_NUM_TIMERS) && (timers[timer].expired))
  119.     {
  120.         timers[timer].expired = 0;
  121.         return 1;
  122.     }
  123.     return 0;
  124. }
  125.