/* | |
* 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 --); | |
} | |
} |