samotor.c
来自「ICETEK-VC5416-EDULab瑞泰创新科技5416开发板的实验源程序」· C语言 代码 · 共 182 行
C
182 行
/////////////////////////////////////////////////
// Example For ICETEK-VC5416-EDU //
// CTR Version : V4 //
// Filename: SAMotor.c //
// Project : SAMotor.pjt //
// Version : 2.00 //
// Write by: Daniel Hawk //
// Company : Realtimedsp Co.Ltd. //
// //
// All Rights opened & no Onus 2005.06 //
/////////////////////////////////////////////////
#include "scancode.h"
#define TIM *(int *)0x24
#define PRD *(int *)0x25
#define TCR *(int *)0x26
#define IMR *(int *)0x0
#define IFR *(int *)0x1
#define PMST *(int *)0x1d
#define SPSA0 *(unsigned int *)0x38
#define SPSD0 *(unsigned int *)0x39
#define SPSA1 *(unsigned int *)0x48
#define SPSD1 *(unsigned int *)0x49
#define REGISTERCLKMD (*(unsigned int *)0x58)
int T46uS=0x0fff;
void Delay(unsigned int nTime);
void interrupt time(void);
char ConvertScanToChar(unsigned char cScanCode);
void TIME_init(void);
// CTR扩展寄存器定义
ioport unsigned int port8000;
ioport unsigned int port8001;
ioport unsigned int port8002;
ioport unsigned int port8003;
ioport unsigned int port8004;
ioport unsigned int port8005;
ioport unsigned int port8007;
#define CTRGR port8000
#define CTRLCDCMDR port8001
#define CTRKEY port8001
#define CTRCLKEY port8002
#define CTRLCDCR port8002
#define CTRLCDLCR port8003
#define CTRLCDRCR port8004
#define CTRLA port8005
#define CTRLR port8007
#define PWMR port8007
unsigned int uWork,nCount;
unsigned int pwm1[8]={ 0x8e,0x8c,0x8d,0x89,0x8b,0x83,0x87,0x86 };
unsigned int pwm2[8]={ 0x86,0x87,0x83,0x8b,0x89,0x8d,0x8c,0x8e };
int nAddStep,nStep;
main()
{
unsigned int nScanCode,uWork1;
unsigned char cKey;
REGISTERCLKMD=0;
nStep=0; nAddStep=1;
CTRGR=0; // 初始化ICETEK-CTR
CTRGR=0x80;
CTRGR=0;
CTRLR=0; // 关闭东西方向的交通灯
CTRLR=0x40; // 关闭南北方向的交通灯
CTRLR=0x0c2; // 使能步进电机
SPSA1=1; // set McBSP1's SPCR2
uWork=SPSD1;
uWork&=0xfffe; // set XRST=0
SPSD1=uWork;
SPSA1=0x0e; // set McBSP1's PCR1
uWork=SPSD1;
uWork|=0x2400; // set XIOEN=1 FSXM=1, Enable IO,FSR for output
SPSD1=uWork;
SPSA0=0; // set McBSP0's SPCR1
uWork=SPSD0;
uWork&=0xfffe; // set RRST=0
SPSD0=uWork;
SPSA0=0x0e; // set McBSP0's PCR1
uWork=SPSD0;
uWork|=0x1101; // set RIOEN=1 FSXM=1, Enable IO,CLKR for output,set Motor's direction to 1
SPSD0=uWork;
uWork1= PMST;
PMST = uWork1&0xff;
asm(" ssbx INTM");
TIME_init();
IMR = 0x8;
IFR = 0x100;
asm(" rsbx INTM");
while ( 1 )
{
if ( nCount>16 )
{
nCount=0;
nScanCode=CTRKEY;
nScanCode&=0x0ff;
uWork=CTRCLKEY;
if ( nScanCode!=0 )
{
if ( nScanCode==SCANCODE_Enter ) break;
else
switch(nScanCode)
{
case SCANCODE_4: // Motor Turn Forward
nAddStep=1;
break;
case SCANCODE_6: // Motor Turn Backward
nAddStep=-1;
break;
case SCANCODE_Minus: // Motor Speed Down
T46uS+=0x400;
if(T46uS>=0x8000)
T46uS=0x8002;
asm( " ssbx INTM");
TIME_init();
asm(" rsbx INTM");
break;
case SCANCODE_Plus: // Motor Speed up
T46uS-=0x400;
if(T46uS<=0xC00)
T46uS=0xC02;
asm( " ssbx INTM");
TIME_init();
asm(" rsbx INTM");
break;
}
}
}
}
CTRLR=0x0c0;
}
void Delay(unsigned int nDelay)
{
int i,j,k=0;
for ( i=0;i<nDelay;i++ )
for ( j=0;j<64;j++ )
k++;
}
void interrupt time(void)
{
PWMR=pwm2[nStep];
nStep+=nAddStep;
if ( nStep<0 ) nStep=7;
else if ( nStep>7 ) nStep=0;
nCount++;
}
void TIME_init(void)
{
TCR = 0x412;
TIM = 0;
PRD = T46uS;
TCR = 0x422;
}
char ConvertScanToChar(unsigned char cScanCode)
{
char cReturn;
cReturn=0;
switch ( cScanCode )
{
case SCANCODE_0: cReturn='0'; break;
case SCANCODE_1: cReturn='1'; break;
case SCANCODE_2: cReturn='2'; break;
case SCANCODE_3: cReturn='3'; break;
case SCANCODE_4: cReturn='4'; break;
case SCANCODE_5: cReturn='5'; break;
case SCANCODE_6: cReturn='6'; break;
case SCANCODE_7: cReturn='7'; break;
case SCANCODE_8: cReturn='8'; break;
case SCANCODE_9: cReturn='9'; break;
}
return cReturn;
}
⌨️ 快捷键说明
复制代码Ctrl + C
搜索代码Ctrl + F
全屏模式F11
增大字号Ctrl + =
减小字号Ctrl + -
显示快捷键?