]> git.sur5r.net Git - freertos/blob - FreeRTOS/Demo/RX600_RX62N-RSK_IAR/RSKRX62N_Demo.c
commit 9f316c246baafa15c542a5aea81a94f26e3d6507
[freertos] / FreeRTOS / Demo / RX600_RX62N-RSK_IAR / RSKRX62N_Demo.c
1 /*\r
2  * Copyright (c) 20010 IAR Systems AB.\r
3  *\r
4  * Permission to use, copy, modify, and distribute this software for any\r
5  * purpose with or without fee is hereby granted, provided that the above\r
6  * copyright notice and this permission notice appear in all copies.\r
7  *\r
8  * THE SOFTWARE IS PROVIDED "AS IS" AND THE AUTHOR DISCLAIMS ALL WARRANTIES\r
9  * WITH REGARD TO THIS SOFTWARE INCLUDING ALL IMPLIED WARRANTIES OF\r
10  * MERCHANTABILITY AND FITNESS. IN NO EVENT SHALL THE AUTHOR BE LIABLE FOR\r
11  * ANY SPECIAL, DIRECT, INDIRECT, OR CONSEQUENTIAL DAMAGES OR ANY DAMAGES\r
12  * WHATSOEVER RESULTING FROM LOSS OF USE, DATA OR PROFITS, WHETHER IN AN\r
13  * ACTION OF CONTRACT, NEGLIGENCE OR OTHER TORTIOUS ACTION, ARISING OUT OF\r
14  * OR IN CONNECTION WITH THE USE OR PERFORMANCE OF THIS SOFTWARE.\r
15  */\r
16 \r
17 /*\r
18  * IAR Embedded Workbench tutorial\r
19  *\r
20  * Test Program for the RSKRX62N Board.\r
21  * LED's perform different display according to\r
22  * which switch is pressed.\r
23  * Used to check that all the LED's, switches,\r
24  * clock function and AD trigger are working fine.\r
25  *\r
26  * $Revision: 1556 $\r
27  */\r
28 \r
29 #include "iorx62n.h"\r
30 #include "intrinsics.h"\r
31 \r
32 void ScrollLedsLowHigh(void);\r
33 void ScrollLedsHighLow(void);\r
34 \r
35 unsigned long pause;\r
36 unsigned long off_set;\r
37 \r
38 #define ON  0\r
39 #define OFF 1\r
40 #define LED0 PORT0.DR.BIT.B2  // P02 LED0\r
41 #define LED1 PORT0.DR.BIT.B3  // P03 LED1\r
42 #define LED2 PORT0.DR.BIT.B5  // P05 LED2\r
43 #define LED3 PORT3.DR.BIT.B4  // P34 LED3\r
44 #define LED4 PORT6.DR.BIT.B0  // P50 LED4\r
45 #define LED5 PORT7.DR.BIT.B3  // P73 LED5\r
46 \r
47 /* defined words used in this program */\r
48 enum {\r
49   SW1,\r
50   SW2,\r
51   SW3,\r
52   NONE\r
53 }GetKey;\r
54 \r
55 /* SW1 ISR */\r
56 #pragma vector = 72\r
57 __interrupt void isr_sw1(void)\r
58 {\r
59   GetKey=SW1;   \r
60    \r
61   CMT.CMSTR0.BIT.STR0 = 0; // stop timer\r
62   ICU.IR[72].BIT.IR = 0;   // clear interrupt request flag \r
63 }\r
64 \r
65 /* SW2 ISR */\r
66 #pragma vector = 73\r
67 __interrupt void isr_sw2(void)\r
68 {\r
69   GetKey=SW2;   \r
70     \r
71   CMT.CMSTR0.BIT.STR0 = 0; // stop timer\r
72   ICU.IR[73].BIT.IR = 0;   // clear interrupt request flag  \r
73 }\r
74 \r
75 /* SW3 ISR */\r
76 #pragma vector = 79\r
77 __interrupt void isr_sw3(void)\r
78 {\r
79   GetKey=SW3;   \r
80   \r
81   CMT.CMSTR0.BIT.STR0 = 1; // start timer\r
82   ICU.IR[79].BIT.IR = 0;   // clear interrupt request flag    \r
83 }\r
84 \r
85 /* Timer ISR */\r
86 #pragma vector = 0x1c\r
87 __interrupt void isr_cmt0(void)\r
88 {\r
89   // Toggle LED's\r
90   LED0 = ~LED0;\r
91   LED1 = ~LED1;\r
92   LED2 = ~LED2;\r
93   LED3 = ~LED3;\r
94   LED4 = ~LED4;\r
95   LED5 = ~LED5;  \r
96   ICU.IR[70].BIT.IR = 0;         // clear interrupt request flag\r
97 }\r
98 \r
99 /* Main program. */\r
100 void main (void)\r
101 {\r
102   // enable modules\r
103   SYSTEM.MSTPCRA.BIT.MSTPA23 = 0; // A/D Converter (Unit 0) Module\r
104   \r
105   // Set up RV1 (potentiometer)\r
106   AD0.ADCR.BIT.MODE = 2;  // Continuous scan mode\r
107   AD0.ADCSR.BIT.CH = 0;   // only AD0\r
108   AD0.ADCSR.BIT.ADST = 1; // Start A/D\r
109   \r
110   // Set up SW1, SW2, SW3\r
111   PORT0.DDR.BIT.B0 = 0; // SW1 input on P00\r
112   PORT0.DDR.BIT.B1 = 0; // SW2 input on P01\r
113   PORT0.DDR.BIT.B7 = 0; // SW3 input on P07  \r
114 \r
115   PORT0.ICR.BIT.B0 = 1; // Enable input buffer\r
116   PORT0.ICR.BIT.B1 = 1; // Enable input buffer\r
117   PORT0.ICR.BIT.B7 = 1; // Enable input buffer\r
118   \r
119   // IRQ8-A used for SW1\r
120   IOPORT.PF8IRQ.BIT.ITS8 = 0; // P00 is designated as the IRQ8-A input pin.\r
121   IEN(ICU,IRQ8) = 1;\r
122   IPR(ICU,IRQ8) = 3;         \r
123   \r
124   // IRQ9-A used for SW2\r
125   IOPORT.PF8IRQ.BIT.ITS9 = 0; // P01 is designated as IRQ9-A input pin.\r
126   IEN(ICU,IRQ9) = 1;\r
127   IPR(ICU,IRQ9) = 3;    \r
128 \r
129   // IRQ15-A used for SW3\r
130   IOPORT.PF8IRQ.BIT.ITS15 = 0; // P07 is designated as the IRQ15-A input pin.\r
131   IEN(ICU,IRQ15) = 1;\r
132   IPR(ICU,IRQ15) = 3; \r
133   \r
134   // Set up LED's\r
135   PORT0.DDR.BIT.B2 = 1;   // P02 LED0 \r
136   PORT0.DDR.BIT.B3 = 1;   // P03 LED1\r
137   PORT0.DDR.BIT.B5 = 1;   // P05 LED2\r
138   PORT3.DDR.BIT.B4 = 1;   // P34 LED3\r
139   PORT6.DDR.BIT.B0 = 1;   // P50 LED4\r
140   PORT7.DDR.BIT.B3 = 1;   // P73 LED5\r
141 \r
142   // Turn al LED's off\r
143   LED0 = LED1 = LED2 = LED3 = LED4 = LED5 = OFF;\r
144   \r
145   // Set up Timer\r
146   SYSTEM.MSTPCRA.BIT.MSTPA15 = 0; // CMT timers 0, \r
147   CMT0.CMCR.BIT.CKS = 3;          // 25MHz/512 = 48.8kHz\r
148   CMT0.CMCR.BIT.CMIE = 1;         // enable peripheral interrupt source\r
149   CMT0.CMCOR = 12212;             // 4 Hz operation\r
150   ICU.IER[3].BIT.IEN4 = 1;        // enable timer 0 interrupt  \r
151   IPR(CMT0,CMI0) = 1;             // LED level 1\r
152   \r
153   __enable_interrupt();  \r
154   \r
155   GetKey=SW1;\r
156   \r
157   for (;;)\r
158   {\r
159     switch (GetKey) \r
160     {\r
161       case SW1:\r
162         ScrollLedsLowHigh();\r
163         break;\r
164       case SW2:\r
165         ScrollLedsHighLow();\r
166         break;\r
167       case SW3:\r
168         GetKey=NONE;\r
169         break;\r
170     }\r
171   }\r
172 }\r
173 \r
174 /* scrolls the LED's from low to high */\r
175 void ScrollLedsLowHigh()\r
176 {\r
177   char led_number = 0;\r
178   \r
179   while (GetKey == SW1)\r
180   {\r
181     if (led_number > 5)\r
182       led_number = 0;\r
183     \r
184     switch(led_number)\r
185     {\r
186     case 0:\r
187       LED0=ON;\r
188       LED1=LED2=LED3=LED4=LED5=OFF;\r
189       break;      \r
190     case 1:\r
191       LED1=ON;\r
192       LED0=LED2=LED3=LED4=LED5=OFF;\r
193       break;      \r
194     case 2:\r
195       LED2=ON;\r
196       LED0=LED1=LED3=LED4=LED5=OFF;\r
197       break;      \r
198     case 3:\r
199       LED3=ON;\r
200       LED0=LED1=LED2=LED4=LED5=OFF;\r
201       break;      \r
202     case 4:\r
203       LED4=ON;\r
204       LED0=LED1=LED2=LED3=LED5=OFF;\r
205       break;      \r
206     case 5:\r
207       LED5=ON;\r
208       LED0=LED1=LED2=LED3=LED4=OFF;\r
209       break;      \r
210     }\r
211     led_number++;\r
212 \r
213     off_set = AD0.ADDRA*1000;\r
214     for (pause = off_set; pause != 0; pause --);\r
215   }\r
216 }\r
217 \r
218 /* scrolls the LED's from high to low */\r
219 void ScrollLedsHighLow()\r
220 {\r
221   signed char led_number = 3;\r
222 \r
223   while (GetKey == SW2)\r
224   {\r
225     if (led_number < 0)\r
226       led_number = 5;\r
227     \r
228     switch(led_number)\r
229     {\r
230     case 0:\r
231       LED0=ON;\r
232       LED1=LED2=LED3=LED4=LED5=OFF;\r
233       break;      \r
234     case 1:\r
235       LED1=ON;\r
236       LED0=LED2=LED3=LED4=LED5=OFF;\r
237       break;      \r
238     case 2:\r
239       LED2=ON;\r
240       LED0=LED1=LED3=LED4=LED5=OFF;\r
241       break;      \r
242     case 3:\r
243       LED3=ON;\r
244       LED0=LED1=LED2=LED4=LED5=OFF;\r
245       break;      \r
246     case 4:\r
247       LED4=ON;\r
248       LED0=LED1=LED2=LED3=LED5=OFF;\r
249       break;      \r
250     case 5:\r
251       LED5=ON;\r
252       LED0=LED1=LED2=LED3=LED4=OFF;\r
253       break;      \r
254     }\r
255     led_number--;\r
256 \r
257     off_set = AD0.ADDRA*1000;\r
258     for (pause = off_set; pause != 0; pause --);\r
259   }\r
260 }\r