| /* | |
| * Copyright (c) 20010 IAR Systems AB. | |
| * | |
| * Permission to use, copy, modify, and distribute this software for any | |
| * purpose with or without fee is hereby granted, provided that the above | |
| * copyright notice and this permission notice appear in all copies. | |
| * | |
| * THE SOFTWARE IS PROVIDED "AS IS" AND THE AUTHOR DISCLAIMS ALL WARRANTIES | |
| * WITH REGARD TO THIS SOFTWARE INCLUDING ALL IMPLIED WARRANTIES OF | |
| * MERCHANTABILITY AND FITNESS. IN NO EVENT SHALL THE AUTHOR BE LIABLE FOR | |
| * ANY SPECIAL, DIRECT, INDIRECT, OR CONSEQUENTIAL DAMAGES OR ANY DAMAGES | |
| * WHATSOEVER RESULTING FROM LOSS OF USE, DATA OR PROFITS, WHETHER IN AN | |
| * ACTION OF CONTRACT, NEGLIGENCE OR OTHER TORTIOUS ACTION, ARISING OUT OF | |
| * OR IN CONNECTION WITH THE USE OR PERFORMANCE OF THIS SOFTWARE. | |
| */ | |
| /* | |
| * IAR Embedded Workbench tutorial | |
| * | |
| * Test Program for the RSKRX62N Board. | |
| * LED's perform different display according to | |
| * which switch is pressed. | |
| * Used to check that all the LED's, switches, | |
| * clock function and AD trigger are working fine. | |
| * | |
| * $Revision: 1556 $ | |
| */ | |
| #include "iorx62n.h" | |
| #include "intrinsics.h" | |
| void ScrollLedsLowHigh(void); | |
| void ScrollLedsHighLow(void); | |
| unsigned long pause; | |
| unsigned long off_set; | |
| #define ON 0 | |
| #define OFF 1 | |
| #define LED0 PORT0.DR.BIT.B2 // P02 LED0 | |
| #define LED1 PORT0.DR.BIT.B3 // P03 LED1 | |
| #define LED2 PORT0.DR.BIT.B5 // P05 LED2 | |
| #define LED3 PORT3.DR.BIT.B4 // P34 LED3 | |
| #define LED4 PORT6.DR.BIT.B0 // P50 LED4 | |
| #define LED5 PORT7.DR.BIT.B3 // P73 LED5 | |
| /* defined words used in this program */ | |
| enum { | |
| SW1, | |
| SW2, | |
| SW3, | |
| NONE | |
| }GetKey; | |
| /* SW1 ISR */ | |
| #pragma vector = 72 | |
| __interrupt void isr_sw1(void) | |
| { | |
| GetKey=SW1; | |
| CMT.CMSTR0.BIT.STR0 = 0; // stop timer | |
| ICU.IR[72].BIT.IR = 0; // clear interrupt request flag | |
| } | |
| /* SW2 ISR */ | |
| #pragma vector = 73 | |
| __interrupt void isr_sw2(void) | |
| { | |
| GetKey=SW2; | |
| CMT.CMSTR0.BIT.STR0 = 0; // stop timer | |
| ICU.IR[73].BIT.IR = 0; // clear interrupt request flag | |
| } | |
| /* SW3 ISR */ | |
| #pragma vector = 79 | |
| __interrupt void isr_sw3(void) | |
| { | |
| GetKey=SW3; | |
| CMT.CMSTR0.BIT.STR0 = 1; // start timer | |
| ICU.IR[79].BIT.IR = 0; // clear interrupt request flag | |
| } | |
| /* Timer ISR */ | |
| #pragma vector = 0x1c | |
| __interrupt void isr_cmt0(void) | |
| { | |
| // Toggle LED's | |
| LED0 = ~LED0; | |
| LED1 = ~LED1; | |
| LED2 = ~LED2; | |
| LED3 = ~LED3; | |
| LED4 = ~LED4; | |
| LED5 = ~LED5; | |
| ICU.IR[70].BIT.IR = 0; // clear interrupt request flag | |
| } | |
| /* Main program. */ | |
| void main (void) | |
| { | |
| // enable modules | |
| SYSTEM.MSTPCRA.BIT.MSTPA23 = 0; // A/D Converter (Unit 0) Module | |
| // Set up RV1 (potentiometer) | |
| AD0.ADCR.BIT.MODE = 2; // Continuous scan mode | |
| AD0.ADCSR.BIT.CH = 0; // only AD0 | |
| AD0.ADCSR.BIT.ADST = 1; // Start A/D | |
| // Set up SW1, SW2, SW3 | |
| PORT0.DDR.BIT.B0 = 0; // SW1 input on P00 | |
| PORT0.DDR.BIT.B1 = 0; // SW2 input on P01 | |
| PORT0.DDR.BIT.B7 = 0; // SW3 input on P07 | |
| PORT0.ICR.BIT.B0 = 1; // Enable input buffer | |
| PORT0.ICR.BIT.B1 = 1; // Enable input buffer | |
| PORT0.ICR.BIT.B7 = 1; // Enable input buffer | |
| // IRQ8-A used for SW1 | |
| IOPORT.PF8IRQ.BIT.ITS8 = 0; // P00 is designated as the IRQ8-A input pin. | |
| IEN(ICU,IRQ8) = 1; | |
| IPR(ICU,IRQ8) = 3; | |
| // IRQ9-A used for SW2 | |
| IOPORT.PF8IRQ.BIT.ITS9 = 0; // P01 is designated as IRQ9-A input pin. | |
| IEN(ICU,IRQ9) = 1; | |
| IPR(ICU,IRQ9) = 3; | |
| // IRQ15-A used for SW3 | |
| IOPORT.PF8IRQ.BIT.ITS15 = 0; // P07 is designated as the IRQ15-A input pin. | |
| IEN(ICU,IRQ15) = 1; | |
| IPR(ICU,IRQ15) = 3; | |
| // Set up LED's | |
| PORT0.DDR.BIT.B2 = 1; // P02 LED0 | |
| PORT0.DDR.BIT.B3 = 1; // P03 LED1 | |
| PORT0.DDR.BIT.B5 = 1; // P05 LED2 | |
| PORT3.DDR.BIT.B4 = 1; // P34 LED3 | |
| PORT6.DDR.BIT.B0 = 1; // P50 LED4 | |
| PORT7.DDR.BIT.B3 = 1; // P73 LED5 | |
| // Turn al LED's off | |
| LED0 = LED1 = LED2 = LED3 = LED4 = LED5 = OFF; | |
| // Set up Timer | |
| SYSTEM.MSTPCRA.BIT.MSTPA15 = 0; // CMT timers 0, | |
| CMT0.CMCR.BIT.CKS = 3; // 25MHz/512 = 48.8kHz | |
| CMT0.CMCR.BIT.CMIE = 1; // enable peripheral interrupt source | |
| CMT0.CMCOR = 12212; // 4 Hz operation | |
| ICU.IER[3].BIT.IEN4 = 1; // enable timer 0 interrupt | |
| IPR(CMT0,CMI0) = 1; // LED level 1 | |
| __enable_interrupt(); | |
| GetKey=SW1; | |
| for (;;) | |
| { | |
| switch (GetKey) | |
| { | |
| case SW1: | |
| ScrollLedsLowHigh(); | |
| break; | |
| case SW2: | |
| ScrollLedsHighLow(); | |
| break; | |
| case SW3: | |
| GetKey=NONE; | |
| break; | |
| } | |
| } | |
| } | |
| /* scrolls the LED's from low to high */ | |
| void ScrollLedsLowHigh() | |
| { | |
| char led_number = 0; | |
| while (GetKey == SW1) | |
| { | |
| if (led_number > 5) | |
| led_number = 0; | |
| switch(led_number) | |
| { | |
| case 0: | |
| LED0=ON; | |
| LED1=LED2=LED3=LED4=LED5=OFF; | |
| break; | |
| case 1: | |
| LED1=ON; | |
| LED0=LED2=LED3=LED4=LED5=OFF; | |
| break; | |
| case 2: | |
| LED2=ON; | |
| LED0=LED1=LED3=LED4=LED5=OFF; | |
| break; | |
| case 3: | |
| LED3=ON; | |
| LED0=LED1=LED2=LED4=LED5=OFF; | |
| break; | |
| case 4: | |
| LED4=ON; | |
| LED0=LED1=LED2=LED3=LED5=OFF; | |
| break; | |
| case 5: | |
| LED5=ON; | |
| LED0=LED1=LED2=LED3=LED4=OFF; | |
| break; | |
| } | |
| led_number++; | |
| off_set = AD0.ADDRA*1000; | |
| for (pause = off_set; pause != 0; pause --); | |
| } | |
| } | |
| /* scrolls the LED's from high to low */ | |
| void ScrollLedsHighLow() | |
| { | |
| signed char led_number = 3; | |
| while (GetKey == SW2) | |
| { | |
| if (led_number < 0) | |
| led_number = 5; | |
| switch(led_number) | |
| { | |
| case 0: | |
| LED0=ON; | |
| LED1=LED2=LED3=LED4=LED5=OFF; | |
| break; | |
| case 1: | |
| LED1=ON; | |
| LED0=LED2=LED3=LED4=LED5=OFF; | |
| break; | |
| case 2: | |
| LED2=ON; | |
| LED0=LED1=LED3=LED4=LED5=OFF; | |
| break; | |
| case 3: | |
| LED3=ON; | |
| LED0=LED1=LED2=LED4=LED5=OFF; | |
| break; | |
| case 4: | |
| LED4=ON; | |
| LED0=LED1=LED2=LED3=LED5=OFF; | |
| break; | |
| case 5: | |
| LED5=ON; | |
| LED0=LED1=LED2=LED3=LED4=OFF; | |
| break; | |
| } | |
| led_number--; | |
| off_set = AD0.ADDRA*1000; | |
| for (pause = off_set; pause != 0; pause --); | |
| } | |
| } |