blob: 38457cc5ec596f0fd8c24547b02a9b46b4a62126 [file] [log] [blame]
/*
* 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 --);
}
}