選択できるのは25トピックまでです。 トピックは、先頭が英数字で、英数字とダッシュ('-')を使用した35文字以内のものにしてください。
 
 
 
 

301 行
7.8 KiB

  1. /*******************************************************************************
  2. * *
  3. * Copyright 2010 Rheinmetall Canada Inc. *
  4. * *
  5. * No part of this document may be reproduced, stored in *
  6. * a retrieval system, or transmitted, in any form or by any means, *
  7. * electronic, mechanical, photocopying, recording, or otherwise, *
  8. * without the prior written permission of Rheinmetall Canada Inc. *
  9. * *
  10. *******************************************************************************/
  11. #include "timer.h"
  12. #include "define.h"
  13. #include <string.h>
  14. //#include <plib.h>
  15. //#include "./FatFS/diskio.h"
  16. //unsigned int MillisecCounter[TIMER_MAX_ID];
  17. //unsigned int SecondCounter;
  18. //int CalcPeriod;
  19. stTimer astTimer[TIMER_MAX_ID];
  20. //-------------------------------------------------------
  21. void TimerInit(void)
  22. {
  23. #ifdef GP_TIMER_USE_TIMER_1
  24. T1CON = 0;
  25. T1CONbits.TCKPS = 0b01; //1:8 prescaler
  26. TMR1 = 0;
  27. PR1 = 10000; //77.824MHz clock with 1:8 prescaler = timer period of 102.8ns. 1ms period --> 9728 * 102.8ns = 1ms
  28. IPC1bits.T1IP = 2; //timer interrupt priority = 2;
  29. IPC1bits.T1IS = 3; //timer interrupt sub-priority = 2;
  30. IFS0bits.T1IF = 0;
  31. IEC0bits.T1IE = 1; //start timer
  32. T1CONbits.ON = 1;
  33. #endif
  34. #ifdef GP_TIMER_USE_TIMER_2
  35. T2CON = 0;
  36. T2CONbits.TCKPS = 0b011; //1:8 prescaler
  37. TMR2 = 0;
  38. PR2 = 10000; //77.824MHz clock with 1:8 prescaler = timer period of 102.8ns. 1ms period --> 9728 * 102.8ns = 1ms
  39. IPC2bits.T2IP = 2; //timer interrupt priority = 2;
  40. IPC2bits.T2IS = 3; //timer interrupt sub-priority = 2;
  41. IFS0bits.T2IF = 0;
  42. IEC0bits.T2IE = 1; //start timer
  43. T2CONbits.ON = 1;
  44. #endif
  45. memset(&astTimer[0], 0, sizeof(astTimer));
  46. }
  47. //-------------------------------------------------------
  48. /*unsigned int GetActualTimerMilliSec(void)
  49. {
  50. return MillisecCounter;
  51. }*/
  52. //-------------------------------------------------------
  53. /*unsigned int GetActualTimerSec(void)
  54. {
  55. return SecondCounter;
  56. }*/
  57. //-------------------------------------------------------
  58. int IsMilliSecTimerExpired(eTimerID p_eTimerID)
  59. {
  60. int CalcPeriod = 0;
  61. if ((astTimer+p_eTimerID)->bRunning)
  62. {
  63. CalcPeriod = (astTimer+p_eTimerID)->uiMillisecCounter - (astTimer+p_eTimerID)->uiStart;
  64. //if(CalcPeriod > 0 && CalcPeriod >= (astTimer+p_eTimerID)->uiPeriodMillisec)
  65. if(CalcPeriod >= (astTimer+p_eTimerID)->uiPeriodMillisec)
  66. {
  67. //TimerReset(p_eTimerID);
  68. (astTimer+p_eTimerID)->uiMillisecCounter = 0;
  69. return 1;
  70. }
  71. else if(CalcPeriod < 0)
  72. {
  73. if((1000 + CalcPeriod) >= (astTimer+p_eTimerID)->uiPeriodMillisec)
  74. {
  75. //TimerReset(p_eTimerID);
  76. (astTimer+p_eTimerID)->uiMillisecCounter = 0;
  77. return 1;
  78. }
  79. }
  80. }
  81. return 0;
  82. }
  83. //-------------------------------------------------------
  84. int IsSecTimerExpired(eTimerID p_eTimerID)
  85. {
  86. int iCalcPeriod = 0;
  87. if ((astTimer+p_eTimerID)->bRunning)
  88. {
  89. iCalcPeriod = (astTimer+p_eTimerID)->uiSecondCounter - (astTimer+p_eTimerID)->uiStart;
  90. //if(iCalcPeriod > 0 && iCalcPeriod >= (astTimer+p_eTimerID)->uiPeriodSecond)
  91. if(iCalcPeriod >= (astTimer+p_eTimerID)->uiPeriodSecond)
  92. {
  93. //TimerReset(p_eTimerID);
  94. (astTimer+p_eTimerID)->uiSecondCounter = 0;
  95. return 1;
  96. }
  97. else if(iCalcPeriod < 0)
  98. {
  99. if(((unsigned)0xFFFFFFFF + iCalcPeriod) >= (astTimer+p_eTimerID)->uiPeriodSecond)
  100. {
  101. //TimerReset(p_eTimerID);
  102. (astTimer+p_eTimerID)->uiSecondCounter = 0;
  103. return 1;
  104. }
  105. }
  106. }
  107. return 0;
  108. }
  109. //-------------------------------------------------------
  110. int IsTimerExpired(eTimerID p_eTimerID)
  111. {
  112. int iCalcPeriod = 0;
  113. if ((astTimer+p_eTimerID)->bRunning)
  114. {
  115. /*if (IsSecTimerExpired(p_eTimerID) && IsMilliSecTimerExpired(p_eTimerID))
  116. return 1;*/
  117. iCalcPeriod = (astTimer+p_eTimerID)->uiSecondCounter - (astTimer+p_eTimerID)->uiStart;
  118. if(iCalcPeriod >= (astTimer+p_eTimerID)->uiPeriodSecond)
  119. {
  120. iCalcPeriod = (astTimer+p_eTimerID)->uiMillisecCounter - (astTimer+p_eTimerID)->uiStart;
  121. if(iCalcPeriod >= (astTimer+p_eTimerID)->uiPeriodMillisec)
  122. {
  123. (astTimer+p_eTimerID)->uiSecondCounter = 0;
  124. (astTimer+p_eTimerID)->uiMillisecCounter = 0;
  125. return 1;
  126. }
  127. else if(iCalcPeriod < 0)
  128. {
  129. if((1000 + iCalcPeriod) >= (astTimer+p_eTimerID)->uiPeriodMillisec)
  130. {
  131. (astTimer+p_eTimerID)->uiSecondCounter = 0;
  132. (astTimer+p_eTimerID)->uiMillisecCounter = 0;
  133. return 1;
  134. }
  135. }
  136. }
  137. else if(iCalcPeriod < 0)
  138. {
  139. if(((unsigned)0xFFFFFFFF + iCalcPeriod) >= (astTimer+p_eTimerID)->uiPeriodSecond)
  140. {
  141. iCalcPeriod = (astTimer+p_eTimerID)->uiMillisecCounter - (astTimer+p_eTimerID)->uiStart;
  142. if(iCalcPeriod >= (astTimer+p_eTimerID)->uiPeriodMillisec)
  143. {
  144. (astTimer+p_eTimerID)->uiSecondCounter = 0;
  145. (astTimer+p_eTimerID)->uiMillisecCounter = 0;
  146. return 1;
  147. }
  148. else if(iCalcPeriod < 0)
  149. {
  150. if((1000 + iCalcPeriod) >= (astTimer+p_eTimerID)->uiPeriodMillisec)
  151. {
  152. (astTimer+p_eTimerID)->uiSecondCounter = 0;
  153. (astTimer+p_eTimerID)->uiMillisecCounter = 0;
  154. return 1;
  155. }
  156. }
  157. }
  158. }
  159. }
  160. return 0;
  161. }
  162. //-------------------------------------------------------
  163. void TimerStart(eTimerID p_eTimerID, unsigned int p_uiPeriod)
  164. {
  165. (astTimer+p_eTimerID)->bRunning = true;
  166. if (p_uiPeriod >= 1000)
  167. {
  168. (astTimer+p_eTimerID)->uiPeriodSecond = p_uiPeriod / 1000;
  169. (astTimer+p_eTimerID)->uiPeriodMillisec = p_uiPeriod % 1000;
  170. }
  171. else
  172. {
  173. (astTimer+p_eTimerID)->uiPeriodSecond = 0;
  174. (astTimer+p_eTimerID)->uiPeriodMillisec = p_uiPeriod;
  175. }
  176. TimerReset(p_eTimerID);
  177. }
  178. void TimerStartSeconds(eTimerID p_eTimerID, unsigned int p_uiPeriod)
  179. {
  180. (astTimer+p_eTimerID)->bRunning = true;
  181. (astTimer+p_eTimerID)->uiPeriodSecond = p_uiPeriod;
  182. (astTimer+p_eTimerID)->uiPeriodMillisec = 0;
  183. TimerReset(p_eTimerID);
  184. }
  185. //-------------------------------------------------------
  186. void TimerReset(eTimerID p_eTimerID)
  187. {
  188. (astTimer+p_eTimerID)->uiStart = 0;
  189. (astTimer+p_eTimerID)->uiMillisecCounter = 0;
  190. (astTimer+p_eTimerID)->uiSecondCounter = 0;
  191. }
  192. //-------------------------------------------------------
  193. bool IsTimerRunning(eTimerID p_eTimerID)
  194. {
  195. return (astTimer+p_eTimerID)->bRunning;
  196. }
  197. //-------------------------------------------------------
  198. void TimerStop(eTimerID p_eTimerID)
  199. {
  200. (astTimer+p_eTimerID)->bRunning = false;
  201. }
  202. //-------------------------------------------------------
  203. void Sleep(unsigned int timeout)
  204. {
  205. TimerStart(SLEEP_FCN_TIMER,timeout);
  206. while(!IsTimerExpired(SLEEP_FCN_TIMER))
  207. {
  208. Nop();
  209. }
  210. TimerStop(SLEEP_FCN_TIMER);
  211. }
  212. #ifdef GP_TIMER_USE_TIMER_1
  213. void __ISR(_TIMER_1_VECTOR, ipl2) Timer1MilliSecInterrupt(void)
  214. {
  215. unsigned int i;
  216. stTimer* pstPtr = &astTimer[0];
  217. // disk_timerproc();
  218. // Update all timers
  219. for (i=0; i<TIMER_MAX_ID; i++)
  220. {
  221. // update timer only if timer is running
  222. if (pstPtr->bRunning)
  223. {
  224. if(pstPtr->uiMillisecCounter++ == 1000)
  225. {
  226. pstPtr->uiMillisecCounter = 0;
  227. pstPtr->uiSecondCounter++;
  228. }
  229. }
  230. pstPtr++;
  231. }
  232. IFS0bits.T1IF = 0; //Clear interrupt flag
  233. }
  234. #endif
  235. #ifdef GP_TIMER_USE_TIMER_2
  236. void __ISR(_TIMER_2_VECTOR, ipl2) Timer2MilliSecInterrupt(void) {
  237. unsigned int i;
  238. stTimer* pstPtr = &astTimer[0];
  239. //disk_timerproc();
  240. // Update all timers
  241. for (i = 0; i < TIMER_MAX_ID; i++) {
  242. // update timer only if timer is running
  243. if (pstPtr->bRunning) {
  244. if (pstPtr->uiMillisecCounter++ == 1000) {
  245. pstPtr->uiMillisecCounter = 0;
  246. pstPtr->uiSecondCounter++;
  247. }
  248. }
  249. pstPtr++;
  250. }
  251. IFS0bits.T2IF = 0; //Clear interrupt flag
  252. }
  253. #endif
  254. //EOF