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