You cannot select more than 25 topics
Topics must start with a letter or number, can include dashes ('-') and can be up to 35 characters long.
261 lines
6.2 KiB
C
261 lines
6.2 KiB
C
/*
|
|
* 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 --);
|
|
}
|
|
}
|