]> git.sur5r.net Git - freertos/blob - FreeRTOS/Demo/CORTUS_APS3_GCC/Demo/7seg.c
Update version number ready for V8.2.1 release.
[freertos] / FreeRTOS / Demo / CORTUS_APS3_GCC / Demo / 7seg.c
1 /*\r
2     FreeRTOS V8.2.1 - Copyright (C) 2015 Real Time Engineers Ltd.\r
3     All rights reserved\r
4 \r
5     VISIT http://www.FreeRTOS.org TO ENSURE YOU ARE USING THE LATEST VERSION.\r
6 \r
7     This file is part of the FreeRTOS distribution.\r
8 \r
9     FreeRTOS is free software; you can redistribute it and/or modify it under\r
10     the terms of the GNU General Public License (version 2) as published by the\r
11     Free Software Foundation >>!AND MODIFIED BY!<< the FreeRTOS exception.\r
12 \r
13     ***************************************************************************\r
14     >>!   NOTE: The modification to the GPL is included to allow you to     !<<\r
15     >>!   distribute a combined work that includes FreeRTOS without being   !<<\r
16     >>!   obliged to provide the source code for proprietary components     !<<\r
17     >>!   outside of the FreeRTOS kernel.                                   !<<\r
18     ***************************************************************************\r
19 \r
20     FreeRTOS is distributed in the hope that it will be useful, but WITHOUT ANY\r
21     WARRANTY; without even the implied warranty of MERCHANTABILITY or FITNESS\r
22     FOR A PARTICULAR PURPOSE.  Full license text is available on the following\r
23     link: http://www.freertos.org/a00114.html\r
24 \r
25     ***************************************************************************\r
26      *                                                                       *\r
27      *    FreeRTOS provides completely free yet professionally developed,    *\r
28      *    robust, strictly quality controlled, supported, and cross          *\r
29      *    platform software that is more than just the market leader, it     *\r
30      *    is the industry's de facto standard.                               *\r
31      *                                                                       *\r
32      *    Help yourself get started quickly while simultaneously helping     *\r
33      *    to support the FreeRTOS project by purchasing a FreeRTOS           *\r
34      *    tutorial book, reference manual, or both:                          *\r
35      *    http://www.FreeRTOS.org/Documentation                              *\r
36      *                                                                       *\r
37     ***************************************************************************\r
38 \r
39     http://www.FreeRTOS.org/FAQHelp.html - Having a problem?  Start by reading\r
40     the FAQ page "My application does not run, what could be wrong?".  Have you\r
41     defined configASSERT()?\r
42 \r
43     http://www.FreeRTOS.org/support - In return for receiving this top quality\r
44     embedded software for free we request you assist our global community by\r
45     participating in the support forum.\r
46 \r
47     http://www.FreeRTOS.org/training - Investing in training allows your team to\r
48     be as productive as possible as early as possible.  Now you can receive\r
49     FreeRTOS training directly from Richard Barry, CEO of Real Time Engineers\r
50     Ltd, and the world's leading authority on the world's leading RTOS.\r
51 \r
52     http://www.FreeRTOS.org/plus - A selection of FreeRTOS ecosystem products,\r
53     including FreeRTOS+Trace - an indispensable productivity tool, a DOS\r
54     compatible FAT file system, and our tiny thread aware UDP/IP stack.\r
55 \r
56     http://www.FreeRTOS.org/labs - Where new FreeRTOS products go to incubate.\r
57     Come and try FreeRTOS+TCP, our new open source TCP/IP stack for FreeRTOS.\r
58 \r
59     http://www.OpenRTOS.com - Real Time Engineers ltd. license FreeRTOS to High\r
60     Integrity Systems ltd. to sell under the OpenRTOS brand.  Low cost OpenRTOS\r
61     licenses offer ticketed support, indemnification and commercial middleware.\r
62 \r
63     http://www.SafeRTOS.com - High Integrity Systems also provide a safety\r
64     engineered and independently SIL3 certified version for use in safety and\r
65     mission critical applications that require provable dependability.\r
66 \r
67     1 tab == 4 spaces!\r
68 */\r
69 \r
70 \r
71 #include <stdlib.h>\r
72 \r
73 /* Scheduler include files. */\r
74 #include "FreeRTOS.h"\r
75 #include "task.h"\r
76 \r
77 /* Demo program include files. */\r
78 #include "7seg.h"\r
79 #include "demoGpio.h"\r
80 \r
81 #define x7segSTACK_SIZE                 configMINIMAL_STACK_SIZE\r
82 \r
83 static void prvRefreshTask( void *pvParameters );\r
84 static void prvCountTask( void *pvParameters );\r
85 \r
86 /* Value to output to 7 segment display\r
87 led_digits[0] is the right most digit */\r
88 static signed char seg7_digits[4];\r
89 \r
90 void vStart7SegTasks( unsigned portBASE_TYPE uxPriority )\r
91 {\r
92         xTaskCreate( prvRefreshTask, "7SegRefresh", x7segSTACK_SIZE, NULL, uxPriority, ( TaskHandle_t *) NULL );\r
93         xTaskCreate( prvCountTask, "7SegCount", x7segSTACK_SIZE, NULL, uxPriority, ( TaskHandle_t *) NULL );\r
94 }\r
95 /*-----------------------------------------------------------*/\r
96 \r
97 static void prvRefreshTask( void *pvParameters )\r
98 {\r
99 /* This is table 3.3 from the Spartan-3 Starter Kit board user guide */\r
100 const unsigned char bits[ 16 ] =\r
101 {\r
102         0x01,\r
103         0x4f,\r
104         0x12,\r
105         0x06,\r
106         0x4c,\r
107         0x24,\r
108         0x20,\r
109         0x0f,\r
110         0x00,\r
111         0x04,\r
112         0x08,\r
113         0x60,\r
114         0x31,\r
115         0x42,\r
116         0x30,\r
117         0x38\r
118 };\r
119 \r
120 const unsigned char apsx[4] =\r
121 {\r
122         0x06, /* 3 */\r
123         0x24, /* S */\r
124         0x18, /* P */\r
125         0x08  /* A */\r
126 };\r
127 \r
128 TickType_t xRefreshRate, xLastRefreshTime;\r
129 \r
130 /* Digit to scan */\r
131 static int d = 0;\r
132 \r
133         xRefreshRate = 2;\r
134 \r
135         /* We need to initialise xLastRefreshTime prior to the first call to\r
136         vTaskDelayUntil(). */\r
137         xLastRefreshTime = xTaskGetTickCount();\r
138 \r
139         for (;;)\r
140         {\r
141                 for( d = 0; d < 4; d++ )\r
142                 {\r
143                         vTaskDelayUntil ( &xLastRefreshTime, xRefreshRate );\r
144 \r
145                         /* Display digit */\r
146                         gpio->out.an  = -1;\r
147                         if( ( seg7_digits[ 1 ] == 4 ) || ( seg7_digits[ 1 ] == 5 ) )\r
148                         {\r
149                                 gpio->out.digit = apsx[ d ];\r
150                         }\r
151                         else\r
152                         {\r
153                                 gpio->out.digit = bits[ seg7_digits[ d ] ];\r
154                         }\r
155 \r
156                         gpio->out.dp = 1;\r
157                         gpio->out.an  = ~(1 << d);\r
158                 }\r
159         }\r
160 }\r
161 /*-----------------------------------------------------------*/\r
162 \r
163 static void prvCountTask( void *pvParameters )\r
164 {\r
165 TickType_t xCountRate, xLastCountTime;\r
166 \r
167         /* Approximately 20HZ */\r
168         xCountRate = configTICK_RATE_HZ / 20;\r
169 \r
170         /* We need to initialise xLastCountTime prior to the first call to\r
171         vTaskDelayUntil(). */\r
172         xLastCountTime = xTaskGetTickCount();\r
173 \r
174         for (;;)\r
175         {\r
176                 vTaskDelayUntil( &xLastCountTime, xCountRate );\r
177 \r
178                 /* Really ugly way to do BCD arithmetic.... */\r
179                 seg7_digits[ 0 ] -= 1;\r
180                 if( seg7_digits[ 0 ] < 0 )\r
181                 {\r
182                         seg7_digits[ 0 ] = 9;\r
183                         seg7_digits[ 1 ] -= 1;\r
184                         if( seg7_digits[ 1 ] < 0 )\r
185                         {\r
186                                 seg7_digits[ 1 ] = 9;\r
187                                 seg7_digits[ 2 ] -= 1;\r
188                                 if( seg7_digits[ 2 ] < 0 )\r
189                                 {\r
190                                         seg7_digits[ 2 ] = 9;\r
191                                         seg7_digits[ 3 ] -= 1;\r
192                                         if( seg7_digits[ 3 ] < 0 )\r
193                                         {\r
194                                                 seg7_digits[ 3 ] = 9;\r
195                                         }\r
196                                 }\r
197                         }\r
198                 }\r
199         }\r
200 }\r
201 \r
202 \r