📄 main0523b.c
字号:
#include "C240.h"
#define TRUE 1
#define FALSE 0
#define VELOCITY_CONST 3125000
/* define variable */
unsigned int IA_max,IB_max,IC_max; /* MAX limit for current */
unsigned int IA_min,IB_min,IC_min; /* MIN limit for current */
unsigned int ADC_channel; /* Channel for A/D convert */
int input_state;
int run_state;
int dot_state;
int inputdata_num;
unsigned long input_value;
unsigned int input_dotbit;
/* define Input/Output variable value */
ioport unsigned int port0,port1,port2,port3,port4,port5;
/* define structure type and variable value */
/*********************************************/
void dsp_setup()
{
unsigned int temp;
/*********************************************/
/* Disable watchdog timer */
/*********************************************/
temp = WDCR;
temp = temp|0x68;
WDCR = temp;
/*********************************************/
/* initialize PLL module (20 MHz XTAL1) */
/*********************************************/
CKCR1 = 0x60; /* crystal=20MHz CPUCLK = 20MHz */
/* and 1x PLL mult ratio */
CKCR0 = 0xc3; /* low–power mode 0, */
/* ACLK enabled, */
/* PLL enabled, */
/* SYSCLK=CPUCLK/2 */
SYSCR = 0x40c0;
XINT1CR=0x0006;
}
/* Initiate the event management register */
void eventmgr_init()
{
GPTCON=0x0042;
/* No period interrupt start A/D */
/* Initialize PWM */
/* Period is 100us */
ACTR=0x0fff;
COMCON=0x4a57;
/*ACTR=0x0aaa;
CMPR1=0x01f4;
CMPR2=0x01f4;
CMPR3=0x01f4;
DBTCON=0x0000;
COMCON=0x4a57;
COMCON=0xca57;*/
T1PER=0x07d0;
T1CON=0x0000;
T1CON=0x910e;
T1CON=0x914e;
/* Setup shared pins */
OCRA = 0xf800; /* pins IOPB0–IOPB3 & IOPA0–IOPA2 to I/O pins */
OCRB = 0x00f0; /* pins are: ADSOC, XF, /BIO, CAP1–CAP4 */
PCDATDIR=0x0701;
PBDATDIR = 0x0700;
/* outputs IOPB0–IOPB2, set low */
PADATDIR = 0x0707; /* outputs IOPA0–IOPA2, set high */
}
/*******************************************************************/
void disable_interrupts()
{
asm(" SETC INTM");
}
/************************************************************************/
void enable_interrupts()
{
IFR = 0xffff; /* Clear pending interrupts */
IMR = 0x0020; /* Enable CPU Interrupts:INT 2,3,6 */
IMRA = 0x0; /* Enable timer 1 period interrupts */
IMRB = 0x0; /* Enable timer 3 period */
IMRC = 0x0;
/* start ADC */
ADCTRL1=0xcb04;
ADCTRL2=0x0005;
ADCTRL1=0xeb05;
ADC_channel=2;
asm(" CLRC INTM"); /* Global interrupt enable */
}
/* initiating parameter and register */
void init_SRM()
{
input_value=0;
input_dotbit=4;
input_state=FALSE;
dot_state=FALSE;
inputdata_num=0;
run_state=0; /* 0,idle;1 while accelerate;3 while disaccelerate */
/*IA_max=IB_max=IC_max=0x8c00; /* 3.3A, Voltage from LEM is 2.738V */
/*IA_max=IB_max=IC_max=0x8800; /* 2.25A, Voltage from LEM is 2.659V */
/*IA_min=IB_min=IC_min=0x8700; /* 2A,Voltage from LEM is 2.642V */
IA_max=IB_max=IC_max=0x83c0; /* 1.024A, Voltage from LEM is 2.577V */
/*IA_min=IB_min=IC_min=0x82b0; /* 0.774A,Voltage from LEM is 2.558V */
IA_min=IB_min=IC_min=0x82c0; /* 0.774A,Voltage from LEM is 2.558V */
}
/*********************************************/
void keyboard_ISR()
{
int i;
unsigned int scan_in,scan_out,x2;
int row,column=0,key_NO; /* row=0,1,2; column=1,2,3,4 */
row=4;
for(i=0;i<5000;i++);
scan_in=port5;
x2=scan_in & 0x0f;
if (x2!=0x0f)
{
switch(x2)
{
case 0x0e: column=4;
break;
case 0x0d: column=3;
break;
case 0x0b: column=2;
break;
case 0x07: column=1;
break;
default : column=17;
}
scan_out=0x0f7;
port0=scan_out; /* scan keyboard */
for(i=0;i<1000;i++);
scan_in=port5;
while ((scan_in & 0x0f)==0x0f)
{
scan_out=scan_out>>1;
port0=scan_out;
for(i=0;i<1000;i++);
scan_in=port5;
row--;
if (row==0)
{
row=17;
break;
}
}
key_NO=4*(row-1)+column;
port0=0x00;
x2=port5;
while ((x2&0x0f)!=0x0f)
{
x2=port5;
port0=0x00;
}
for(i=0;i<7500;i++);
x2=port5;
while ((x2&0x0f)!=0x0f)
{
x2=port5;
port0=0x00;
}
switch(key_NO)
{
case 1 : /* Stop at 0 */
/*****************/
PBDATDIR=0x0701;
break;
case 2 : /* Stop at 2.5 */
/*****************/
IA_max=0x8ec0; /* 4A, Voltage from LEM is 2.792V */
IA_min=0x8e40; /* 3.75A,Voltage from LEM is 2.781V */
IC_max=0x83C0; /* 1.024A, Voltage from LEM is 2.577V */
IC_min=0x82c0; /* 0.774A,Voltage from LEM is 2.558V */
PBDATDIR=0x0705;
break;
case 3 : /* Stop at 5 */
/*****************/
IA_max=0x8ec0; /* 4A, Voltage from LEM is 2.792V */
IA_min=0x8e40; /* 3.75A,Voltage from LEM is 2.781V */
IC_max=0x8800; /* 2.25A, Voltage from LEM is 2.659V */
IC_min=0x8700; /* 2A,Voltage from LEM is 2.642V */
PBDATDIR=0x0705;
break;
case 4 : /* Stop at 7.5 */
/*****************/
IA_max=0x8ec0; /* 4A, Voltage from LEM is 2.792V */
IA_min=0x8e40; /* 3.75A,Voltage from LEM is 2.781V */
IC_max=0x8ec0; /* 4A, Voltage from LEM is 2.792V */
IC_min=0x8e40; /* 3.75A,Voltage from LEM is 2.781V */
PBDATDIR=0x0705;
break;
case 5 : /* Stop at 10 */
/*****************/
IA_max=0x8800; /* 2.25A, Voltage from LEM is 2.659V */
IA_min=0x8700; /* 2A,Voltage from LEM is 2.642V */
IC_max=0x8ec0; /* 4A, Voltage from LEM is 2.792V */
IC_min=0x8e40; /* 3.75A,Voltage from LEM is 2.781V */
PBDATDIR=0x0705;
break;
case 6 : /* Stop at 12.5 */
/*****************/
IA_max=0x83C0; /* 1.024A, Voltage from LEM is 2.577V */
IA_min=0x82c0; /* 0.774A,Voltage from LEM is 2.558V */
IC_max=0x8ec0; /* 4A, Voltage from LEM is 2.792V */
IC_min=0x8e40; /* 3.75A,Voltage from LEM is 2.781V */
PBDATDIR=0x0705;
break;
case 7 : /* Stop at 15 */
/*****************/
PBDATDIR=0x0704;
break;
case 8 :
case 9 :
case 10 : if (input_state==FALSE) /* deal with data keyboard */
break;
if (dot_state)
input_dotbit--;
input_value=input_value*10+key_NO-1;
inputdata_num++;
break;
case 11 : if (input_state==FALSE) /* deal with radix point keyboard */
break;
if (dot_state)
break;
if (inputdata_num!=0)
{
input_dotbit=3;
dot_state=TRUE;
break;
}
case 12 : break;
/***********************/
/* code for denote the reverse state */
/***********************/
case 13 : disable_interrupts();
eventmgr_init();
init_SRM();
enable_interrupts(); /* location SRM, fire phase A */
PBDATDIR = 0x0707; /* outputs IOPA0–IOPA2, IOPA0 set high */
input_state=TRUE;
break;
case 14 : break;
case 15 : run_state=1;
break;
case 16 :
break;
default : break;
}
}
}
/*************************************/
/*********************************************/
/* ISR for A/D and keyboard interrupt */
void c_int6()
{
unsigned int ADCfifo_data;
int ADCfifo_status;
IFR=0x0020;
do {
ADCfifo_data= ADCFIFO1; /* read value */
ADCfifo_status = ADCTRL2 & 0x0c0; /* read status register, mask bits */
}
while (ADCfifo_status != 0);
switch(ADC_channel)
{
case 2: if (ADCfifo_data>=IA_max)
PADATDIR=PADATDIR & 0x070e;
else if (ADCfifo_data<=IA_min)
PADATDIR=PADATDIR | 0x01;
break;
case 3: if (ADCfifo_data>=IB_max)
PADATDIR=PADATDIR & 0x070d;
else if (ADCfifo_data<=IB_min)
PADATDIR=PADATDIR | 0x02;
break;
case 4: if (ADCfifo_data>=IC_max)
PADATDIR=PADATDIR & 0x070b;
else if (ADCfifo_data<=IC_min)
PADATDIR=PADATDIR | 0x04;
break;
default:break;
}
if (PCDATDIR & 0x01)
PCDATDIR=0x0700;
else
PCDATDIR=0x0701;
ADC_channel++;
if (ADC_channel>4)
ADC_channel=2;
ADCTRL1=0xca00 + (ADC_channel<<1);
ADCTRL1=ADCTRL1 | 1;
}
/* ***************************************************************** */
/* The main program
/* ***************************************************************** */
main()
{
unsigned int INT1_status;
disable_interrupts();
dsp_setup();
eventmgr_init();
enable_interrupts();
for(;;)
{
port0=0x00;
INT1_status=XINT1CR;
if (INT1_status & 0x8000)
{
keyboard_ISR();
XINT1CR=0x0006;
}
}
}
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -