]> git.sur5r.net Git - freertos/blob - Source/portable/WizC/PIC18/Drivers/Tick/Tick.c
Update to V4.7.1
[freertos] / Source / portable / WizC / PIC18 / Drivers / Tick / Tick.c
1 /*\r
2         FreeRTOS.org V4.7.1 - Copyright (C) 2003-2008 Richard Barry.\r
3 \r
4         This file is part of the FreeRTOS.org distribution.\r
5 \r
6         FreeRTOS.org is free software; you can redistribute it and/or modify\r
7         it under the terms of the GNU General Public License as published by\r
8         the Free Software Foundation; either version 2 of the License, or\r
9         (at your option) any later version.\r
10 \r
11         FreeRTOS.org is distributed in the hope that it will be useful,\r
12         but WITHOUT ANY WARRANTY; without even the implied warranty of\r
13         MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the\r
14         GNU General Public License for more details.\r
15 \r
16         You should have received a copy of the GNU General Public License\r
17         along with FreeRTOS.org; if not, write to the Free Software\r
18         Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA  02111-1307  USA\r
19 \r
20         A special exception to the GPL can be applied should you wish to distribute\r
21         a combined work that includes FreeRTOS.org, without being obliged to provide\r
22         the source code for any proprietary components.  See the licensing section \r
23         of http://www.FreeRTOS.org for full details of how and when the exception\r
24         can be applied.\r
25 \r
26         ***************************************************************************\r
27 \r
28         Please ensure to read the configuration and relevant port sections of the \r
29         online documentation.\r
30 \r
31         +++ http://www.FreeRTOS.org +++\r
32         Documentation, latest information, license and contact details.  \r
33 \r
34         +++ http://www.SafeRTOS.com +++\r
35         A version that is certified for use in safety critical systems.\r
36 \r
37         +++ http://www.OpenRTOS.com +++\r
38         Commercial support, development, porting, licensing and training services.\r
39 \r
40         ***************************************************************************\r
41 */\r
42 \r
43 /* \r
44 Changes from V3.0.0\r
45         + ISRcode is pulled inline and portTICKisr() is therefore\r
46           deleted from this file.\r
47 \r
48         + Prescaler logic for Timer1 added to allow for a wider\r
49           range of TickRates.\r
50 \r
51 Changes from V3.0.1\r
52 */\r
53 \r
54 #include <FreeRTOS.h>\r
55 #include <task.h>\r
56 \r
57 /* IO port constants. */\r
58 #define portBIT_SET             (1)\r
59 #define portBIT_CLEAR   (0)\r
60 \r
61 /* \r
62  * Hardware setup for the tick.\r
63  * We use a compare match on timer1. Depending on MPU-frequency\r
64  * and requested tickrate, a prescaled value with a matching\r
65  * prescaler are determined.\r
66  */\r
67 #define portTIMER_COMPARE_BASE                  ((APROCFREQ/4)/configTICK_RATE_HZ)\r
68 \r
69 #if portTIMER_COMPARE_BASE   < 0x10000\r
70         #define portTIMER_COMPARE_VALUE         (portTIMER_COMPARE_BASE)\r
71         #define portTIMER_COMPARE_PS1           (portBIT_CLEAR)\r
72         #define portTIMER_COMPARE_PS0           (portBIT_CLEAR)\r
73 #elif portTIMER_COMPARE_BASE < 0x20000\r
74         #define portTIMER_COMPARE_VALUE         (portTIMER_COMPARE_BASE / 2)\r
75         #define portTIMER_COMPARE_PS1           (portBIT_CLEAR)\r
76         #define portTIMER_COMPARE_PS0           (portBIT_SET)\r
77 #elif portTIMER_COMPARE_BASE < 0x40000\r
78         #define portTIMER_COMPARE_VALUE         (portTIMER_COMPARE_BASE / 4)\r
79         #define portTIMER_COMPARE_PS1           (portBIT_SET)\r
80         #define portTIMER_COMPARE_PS0           (portBIT_CLEAR)\r
81 #elif portTIMER_COMPARE_BASE < 0x80000\r
82         #define portTIMER_COMPARE_VALUE         (portTIMER_COMPARE_BASE / 8)\r
83         #define portTIMER_COMPARE_PS1           (portBIT_SET)\r
84         #define portTIMER_COMPARE_PS0           (portBIT_SET)\r
85 #else\r
86         #error "TickRate out of range"\r
87 #endif\r
88 \r
89 /*-----------------------------------------------------------*/\r
90 \r
91 /*\r
92  * Setup a timer for a regular tick.\r
93  */\r
94 void portSetupTick( void )\r
95 {\r
96         /*\r
97          * Interrupts are disabled when this function is called.\r
98          */\r
99 \r
100         /*\r
101          * Setup CCP1\r
102          * Provide the tick interrupt using a compare match on timer1.\r
103          */\r
104 \r
105         /*\r
106          * Set the compare match value.\r
107          */\r
108         CCPR1H = ( unsigned portCHAR ) ( ( portTIMER_COMPARE_VALUE >> 8 ) & 0xff );\r
109         CCPR1L = ( unsigned portCHAR )   ( portTIMER_COMPARE_VALUE & 0xff );\r
110 \r
111         /*\r
112          * Set Compare Special Event Trigger Mode\r
113          */\r
114         bCCP1M3         = portBIT_SET;\r
115         bCCP1M2         = portBIT_CLEAR;\r
116         bCCP1M1         = portBIT_SET;\r
117         bCCP1M0         = portBIT_SET;\r
118 \r
119         /*\r
120          * Enable CCP1 interrupt\r
121          */\r
122         bCCP1IE         = portBIT_SET;\r
123 \r
124         /*\r
125          * We are only going to use the global interrupt bit, so disable\r
126          * interruptpriorities and enable peripheral interrupts.\r
127          */\r
128         bIPEN           = portBIT_CLEAR;\r
129         bPEIE           = portBIT_SET;\r
130 \r
131         /*\r
132          * Set up timer1\r
133          * It will produce the system tick.\r
134          */\r
135 \r
136         /*\r
137          * Clear the time count\r
138          */\r
139         TMR1H = ( unsigned portCHAR ) 0x00;\r
140         TMR1L = ( unsigned portCHAR ) 0x00;\r
141 \r
142         /*\r
143          * Setup the timer\r
144          */\r
145         bRD16           = portBIT_SET;                          // 16-bit\r
146         bT1CKPS1        = portTIMER_COMPARE_PS1;        // prescaler\r
147         bT1CKPS0        = portTIMER_COMPARE_PS0;        // prescaler\r
148         bT1OSCEN        = portBIT_SET;                          // Oscillator enable\r
149         bT1SYNC         = portBIT_SET;                          // No external clock sync\r
150         bTMR1CS         = portBIT_CLEAR;                        // Internal clock\r
151         \r
152         bTMR1ON         = portBIT_SET;                          // Start timer1\r
153 }\r