]> git.sur5r.net Git - freertos/blob - FreeRTOS/Demo/CORTUS_APS3_GCC/Demo/7seg.c
7394bdbd704bde579cab9f5dd02714bc17077aa8
[freertos] / FreeRTOS / Demo / CORTUS_APS3_GCC / Demo / 7seg.c
1 /*\r
2  * FreeRTOS Kernel V10.2.1\r
3  * Copyright (C) 2019 Amazon.com, Inc. or its affiliates.  All Rights Reserved.\r
4  *\r
5  * Permission is hereby granted, free of charge, to any person obtaining a copy of\r
6  * this software and associated documentation files (the "Software"), to deal in\r
7  * the Software without restriction, including without limitation the rights to\r
8  * use, copy, modify, merge, publish, distribute, sublicense, and/or sell copies of\r
9  * the Software, and to permit persons to whom the Software is furnished to do so,\r
10  * subject to the following conditions:\r
11  *\r
12  * The above copyright notice and this permission notice shall be included in all\r
13  * copies or substantial portions of the Software.\r
14  *\r
15  * THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR\r
16  * IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, FITNESS\r
17  * FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE AUTHORS OR\r
18  * COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER\r
19  * IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN\r
20  * CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE.\r
21  *\r
22  * http://www.FreeRTOS.org\r
23  * http://aws.amazon.com/freertos\r
24  *\r
25  * 1 tab == 4 spaces!\r
26  */\r
27 \r
28 \r
29 #include <stdlib.h>\r
30 \r
31 /* Scheduler include files. */\r
32 #include "FreeRTOS.h"\r
33 #include "task.h"\r
34 \r
35 /* Demo program include files. */\r
36 #include "7seg.h"\r
37 #include "demoGpio.h"\r
38 \r
39 #define x7segSTACK_SIZE                 configMINIMAL_STACK_SIZE\r
40 \r
41 static void prvRefreshTask( void *pvParameters );\r
42 static void prvCountTask( void *pvParameters );\r
43 \r
44 /* Value to output to 7 segment display\r
45 led_digits[0] is the right most digit */\r
46 static signed char seg7_digits[4];\r
47 \r
48 void vStart7SegTasks( unsigned portBASE_TYPE uxPriority )\r
49 {\r
50         xTaskCreate( prvRefreshTask, "7SegRefresh", x7segSTACK_SIZE, NULL, uxPriority, ( TaskHandle_t *) NULL );\r
51         xTaskCreate( prvCountTask, "7SegCount", x7segSTACK_SIZE, NULL, uxPriority, ( TaskHandle_t *) NULL );\r
52 }\r
53 /*-----------------------------------------------------------*/\r
54 \r
55 static void prvRefreshTask( void *pvParameters )\r
56 {\r
57 /* This is table 3.3 from the Spartan-3 Starter Kit board user guide */\r
58 const unsigned char bits[ 16 ] =\r
59 {\r
60         0x01,\r
61         0x4f,\r
62         0x12,\r
63         0x06,\r
64         0x4c,\r
65         0x24,\r
66         0x20,\r
67         0x0f,\r
68         0x00,\r
69         0x04,\r
70         0x08,\r
71         0x60,\r
72         0x31,\r
73         0x42,\r
74         0x30,\r
75         0x38\r
76 };\r
77 \r
78 const unsigned char apsx[4] =\r
79 {\r
80         0x06, /* 3 */\r
81         0x24, /* S */\r
82         0x18, /* P */\r
83         0x08  /* A */\r
84 };\r
85 \r
86 TickType_t xRefreshRate, xLastRefreshTime;\r
87 \r
88 /* Digit to scan */\r
89 static int d = 0;\r
90 \r
91         xRefreshRate = 2;\r
92 \r
93         /* We need to initialise xLastRefreshTime prior to the first call to\r
94         vTaskDelayUntil(). */\r
95         xLastRefreshTime = xTaskGetTickCount();\r
96 \r
97         for (;;)\r
98         {\r
99                 for( d = 0; d < 4; d++ )\r
100                 {\r
101                         vTaskDelayUntil ( &xLastRefreshTime, xRefreshRate );\r
102 \r
103                         /* Display digit */\r
104                         gpio->out.an  = -1;\r
105                         if( ( seg7_digits[ 1 ] == 4 ) || ( seg7_digits[ 1 ] == 5 ) )\r
106                         {\r
107                                 gpio->out.digit = apsx[ d ];\r
108                         }\r
109                         else\r
110                         {\r
111                                 gpio->out.digit = bits[ seg7_digits[ d ] ];\r
112                         }\r
113 \r
114                         gpio->out.dp = 1;\r
115                         gpio->out.an  = ~(1 << d);\r
116                 }\r
117         }\r
118 }\r
119 /*-----------------------------------------------------------*/\r
120 \r
121 static void prvCountTask( void *pvParameters )\r
122 {\r
123 TickType_t xCountRate, xLastCountTime;\r
124 \r
125         /* Approximately 20HZ */\r
126         xCountRate = configTICK_RATE_HZ / 20;\r
127 \r
128         /* We need to initialise xLastCountTime prior to the first call to\r
129         vTaskDelayUntil(). */\r
130         xLastCountTime = xTaskGetTickCount();\r
131 \r
132         for (;;)\r
133         {\r
134                 vTaskDelayUntil( &xLastCountTime, xCountRate );\r
135 \r
136                 /* Really ugly way to do BCD arithmetic.... */\r
137                 seg7_digits[ 0 ] -= 1;\r
138                 if( seg7_digits[ 0 ] < 0 )\r
139                 {\r
140                         seg7_digits[ 0 ] = 9;\r
141                         seg7_digits[ 1 ] -= 1;\r
142                         if( seg7_digits[ 1 ] < 0 )\r
143                         {\r
144                                 seg7_digits[ 1 ] = 9;\r
145                                 seg7_digits[ 2 ] -= 1;\r
146                                 if( seg7_digits[ 2 ] < 0 )\r
147                                 {\r
148                                         seg7_digits[ 2 ] = 9;\r
149                                         seg7_digits[ 3 ] -= 1;\r
150                                         if( seg7_digits[ 3 ] < 0 )\r
151                                         {\r
152                                                 seg7_digits[ 3 ] = 9;\r
153                                         }\r
154                                 }\r
155                         }\r
156                 }\r
157         }\r
158 }\r
159 \r
160 \r