dcmotor.c

来自「ICETEK-VC5416-EDULab瑞泰创新科技5416开发板的实验源程序」· C语言 代码 · 共 217 行

C
217
字号
/////////////////////////////////////////////////
//  Example For ICETEK-VC5416-EDU              //
//          CTR Version : V4                   //
//  Filename: DCMotor.c                        //
//  Project : DCMotor.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)

#define T46uS		0x0200

//  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

void Delay(unsigned int nTime);
void interrupt time(void);
char ConvertScanToChar(unsigned char cScanCode);

unsigned int uWork,nCount,uN,nCount1,nDir,nTest;

main()
{
	unsigned int nSpeed,nScanCode,uWork1,uN1;
	unsigned char cKey,cOldKey;
	nTest=0;

	REGISTERCLKMD=0;
	CTRGR=0;
	CTRGR=0x80;
	CTRGR=1;
	CTRLR=0;			    // 关闭东西方向的交通灯
	CTRLR=0x40;	            // 关闭南北方向的交通灯
	uWork1=CTRCLKEY;	    // 清除键盘缓冲区
	REGISTERCLKMD=0x1007;	// DSP主频改为两倍PLL时钟=32MHz
	uN=30; nCount=nCount1=0; nDir=0; cKey=cOldKey=0;
	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;
	asm("	ssbx	INTM");	// 关中断,进行关键设置时不许打扰
	uWork1= PMST; 		      
	PMST = uWork1&0xff;
	IMR = 0x8;
	TCR = 0x411;
	TIM = 0;
	PRD = T46uS;
	nSpeed=T46uS;
	TCR = 0x422;
	IFR = 0x8;
	asm("	rsbx	INTM");
	while ( 1 )
	{
		if ( nCount>16 )
		{
			CTRGR=1;
			nCount=0;
			nScanCode=CTRKEY;	// 读扫描码
			nScanCode&=0x0ff;	// 低8位
			//uWork1=CTRCLKEY;	// 清除键盘缓冲区
			if ( nScanCode!=0 )
			{
				if ( nScanCode==SCANCODE_Enter )	break;
				else
				{
					cKey=ConvertScanToChar(nScanCode);
					if ( cKey!=0 && cOldKey!=cKey )
					{
						cOldKey=cKey;
						switch ( cKey )
						{
							case '0': uN=100; break;
							case '1': uN=70; break;
							case '2': uN=50; break;
							case '3': uN=30; break;
							case '4': uN=10; break;
							case '5': uN=1; break;
							case '+':
								uN1=uN;
								uN=60;		// 降速
								Delay(1024);
								SPSA0=0;	
								uWork1=SPSD0;
								uWork1&=0xfffe;	
								SPSD0=uWork1;
								SPSA0=0x0e;
								uWork1=SPSD0;
								uWork1|=0x1101;	//set Motor's direction to 1
								SPSD0=uWork1;
								PRD=nSpeed; 
				 			 	nDir=0; 
								Delay(1024);
								uN=uN1;
								break;
							case '-':
								uN1=uN;
								uN=60;		// 降速
								Delay(1024);
								SPSA0=0;	
								uWork1=SPSD0;
								uWork1&=0xfffe;	
								SPSD0=uWork1;
								SPSA0=0x0e;
								uWork1=SPSD0;
								uWork1|=0x1100;	//set Motor's direction to 0
								uWork1&=0xfffe;
								SPSD0=uWork1;
								PRD=nSpeed; 
				 			 	nDir=1;
								Delay(1024);
								uN=uN1;
								break;
						}
					}
				}
			}
		}
	}
	TCR = 0x412;
	REGISTERCLKMD=0;
	CTRGR=0;
	CTRGR=0x80;
	CTRGR=0;
	exit(0);
}               

void Delay(unsigned int nDelay)
{
	int i,j,k=0;
	for ( i=0;i<nDelay;i++ )
		for ( j=0;j<1024;j++ )
			k++;
}

void interrupt time(void)
{
		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
		if ( nCount1>uN )	uWork|=4;
		else	uWork&=0x0fffb;
		SPSD1=uWork;
		nCount++;
		nCount1++; nCount1%=100;
}

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;
		case SCANCODE_Plus: cReturn='+'; break;
		case SCANCODE_Minus: cReturn='-'; break;
	}
	 
	return cReturn;
}

⌨️ 快捷键说明

复制代码Ctrl + C
搜索代码Ctrl + F
全屏模式F11
增大字号Ctrl + =
减小字号Ctrl + -
显示快捷键?