www.pudn.com > DC_SpeedCtrl.rar > DCMotor.asm


//====================================================== 
//  The information contained herein is the exclusive property of 
//  Sunnnorth Technology Co. And shall not be distributed, reproduced, 
//  or disclosed in whole in part without prior written permission. 
//             (C) COPYRIGHT 2003  SUNNORTH TECHNOLOGY CO. 
//                          ALL RIGHTS RESERVED 
//  The entire notice above must be reproduced on all authorized copies. 
//======================================================== 
 
//============================================================ 
// 文件名称:DCMotor.asm 
// 实现功能:SPGT62C19B的直流电机驱动程序,使用IRQ4_4KHz中断 
// 日期:    2005/7/18 
//============================================================ 
 
//================================================ 
//	SPGT62C19B控制端口设定 
//================================================ 
 
/////-----       若使用IOA则使用下面的定义	    -----///// 
//.define P_Motor_Data	0x7000 
//.define P_Motor_Buf		0x7001 
//.define P_Motor_Dir		0x7002 
//.define P_Motor_Attr	0x7003 
 
/////-----       若使用IOB则使用下面的定义	    -----///// 
.define P_Motor_Data	0x7005 
.define P_Motor_Buf		0x7006 
.define P_Motor_Dir		0x7007 
.define P_Motor_Attr	0x7008 
 
//================================================ 
//	SPGT62C19B控制引脚设定 
//================================================ 
 
//			bit:	FEDCBA9876543210 
.define PIN_I01		0000000000001000b		//IO PIN 3 
.define PIN_I11		0000000000100000b		//IO PIN 5 
.define PIN_PH1		0000000000000001b		//IO PIN 0 
.define PIN_I02		0000000000010000b		//IO PIN 4 
.define PIN_I12		0000000001000000b		//IO PIN 6 
.define PIN_PH2		0000000000000010b		//IO PIN 1 
.define PIN_SPD		0000000000000100b		//IO PIN 2 
.define PIN_MOTOR	PIN_I01+PIN_I11+PIN_PH1+PIN_I02+PIN_I12+PIN_PH2 
 
//================================================ 
//	速度检测去抖动时间设定,单位为1/4096秒 
//================================================ 
 
.define MOTOR_DEBOUNCE	10 
 
//================================================ 
//	中断常量定义 
//================================================ 
 
.define P_INT_Mask		0x702d 
.define C_IRQ4_4KHz		0x0040 
 
//================================================ 
//	变量定义 
//================================================ 
 
.iram 
/////-----       电机驱动状态变量	    -----///// 
.var Motor_Status = 0x00ff	// b15: Enable Motor2 
							// b14: Enable Motor1 
							// b13: Motor2 Direction. 0-Fwd, 1-Bwd 
							// b12: Motor1 Direction 
							// b11\ 
							//  |   Motor2 Speed Level(0~63) 
							// b06/ 
							// b05\ 
							//  |   Motor1 Speed Level(0~63) 
							// b00/ 
.var Motor_PWM_Cnt = 0x0000	// IO模拟PWM宽度计数,b11~b6:Motor2; b5~b0:Motor1 
 
/////-----       电机速度检测相关变量	    -----///// 
.var Motor_Timer_Cnt = 0	// 定时器计数值 
.var Motor_Pulse_Cnt = 0	// 速度检测脉冲计数值 
.var Motor_Pulse_Deb = 0	// 速度检测脉冲去抖动计数 
.var Motor_Speed = 0x00		// 电机速度。 
.var Motor_SpeedRdy = 0		// 电机转速测量完成标志 
//================================================ 
//	公有函数声明 
//================================================ 
.public _DCMotor_Init 
.public F_DCMotor_Init 
.public _DCMotor_SetSpeed 
.public F_DCMotor_SetSpeed 
.public _DCMotor_Forward 
.public F_DCMotor_Forward 
.public _DCMotor_Backward 
.public F_DCMotor_Backward 
.public _DCMotor_Drive 
.public F_DCMotor_Drive 
.public _DCMotor_Stop 
.public F_DCMotor_Stop 
.public _DCMotor_GetSpeed 
.public F_DCMotor_GetSpeed 
.public _DCMotor_IsSpeedRdy 
.public F_DCMotor_IsSpeedRdy 
 
.code 
//====================================================== 
// 函数名称:	DCMotor_Init 
// C调用:		void DCMotor_Init(void) 
// 汇编调用:	F_DCMotor_Init 
// 实现功能:   直流电机驱动初始化 
// 入口参数:	无 
// 出口参数:	无 
// 破坏寄存器:	无 
//====================================================== 
_DCMotor_Init: 
F_DCMotor_Init: 
	push r1 to [sp] 
 
	r1 = [P_Motor_Attr]						// 初始化IO 
	r1 |= PIN_MOTOR 
	r1 &= ~PIN_SPD 
	[P_Motor_Attr] = r1 
	r1 = [P_Motor_Dir] 
	r1 |= PIN_MOTOR 
	r1 &= ~PIN_SPD 
	[P_Motor_Dir] = r1 
	r1 = [P_Motor_Buf] 
	r1 |= PIN_MOTOR 
	r1 &= ~PIN_SPD 
	[P_Motor_Data] = r1 
 
	r1 = 0x0000 
	[Motor_Status] = r1 
	[Motor_PWM_Cnt] = r1 
	[Motor_Speed] = r1 
	[Motor_Pulse_Cnt] = r1 
	[Motor_Pulse_Deb] = r1 
	[Motor_Timer_Cnt] = r1 
	[Motor_SpeedRdy] = r1 
 
	r1 = [P_INT_Mask] 
	r1 |= C_IRQ4_4KHz 
	[P_INT_Mask] = r1 
	IRQ ON 
 
	pop r1 from [sp] 
retf 
 
//====================================================== 
// 函数名称:	DCMotor_SetSpeed 
// C调用:		void DCMotor_SetSpeed(unsigned Motor,unsigned Speed) 
// 汇编调用:	F_DCMotor_SetSpeed 
// 实现功能:   设定电机转速等级 
// 入口参数:	Motor(R1) - 选择对哪个直流电机接口进行转速等级设定: 
//					MOTOR_1		直流电机接口1 
//					MOTOR_2		直流电机接口1 
//				Speed(R2) - PWM占空比,范围0-63,单位1/64 
// 出口参数:	无 
// 破坏寄存器:	无 
//====================================================== 
_DCMotor_SetSpeed: 
	push r1,r2 to [sp] 
	r1 = sp + 6 
	r2 = [r1--] 
	r1 = [r1] 
	call F_DCMotor_SetSpeed 
	pop r1,r2 from [sp] 
retf 
 
F_DCMotor_SetSpeed: 
	push r3 to [sp] 
	r2 &= 0x003f 
	r3 = [Motor_Status] 
	cmp r1,1 
	je ?Motor1 
	cmp r1,2 
	je ?Motor2 
	cmp r1,3 
	jne ?Exit 
?Motor1: 
	r3 &= ~0x003f 
	r3 |= r2 
	cmp r1,3 
	jne ?Motor_SaveStatus 
?Motor2: 
	r2 = r2 LSL 4 
	r2 = r2 LSL 2 
	r3 &= ~0x0FC0 
	r3 |= r2 
?Motor_SaveStatus: 
	[Motor_Status] = r3 
	r3 = 0 
	[Motor_PWM_Cnt] = r3 
?Exit:	 
	pop r3 from [sp] 
retf 
 
//====================================================== 
// 函数名称:	DCMotor_Forward 
// C调用:		void DCMotor_Forward(unsigned Motor) 
// 汇编调用:	F_DCMotor_Forward 
// 实现功能:   使电机正向转动 
// 入口参数:	Motor(R1) - 设定正向转动的电机: 
//					MOTOR_1		电机1 
//					MOTOR_2		电机2 
// 出口参数:	无 
// 破坏寄存器:	无 
//====================================================== 
_DCMotor_Forward: 
	push r1 to [sp] 
	r1 = sp + 4 
	r1 = [r1] 
	call F_DCMotor_Forward 
	pop r1 from [sp] 
retf 
 
F_DCMotor_Forward: 
	push r2,r3 to [sp] 
	r2 = [Motor_Status] 
	cmp r1,1 
	je ?Motor1 
	cmp r1,2 
	je ?Motor2 
	cmp r1,3 
	jne ?Exit 
?Motor1: 
	r3 = [P_Motor_Buf] 
	r3 &= ~PIN_PH1 
	[P_Motor_Data] = r3 
	r2 &= ~0x1000 
	r2 |= 0x4000 
	cmp r1,3 
	jne ?Motor_SaveStatus 
?Motor2: 
	r3 = [P_Motor_Buf] 
	r3 &= ~PIN_PH2 
	[P_Motor_Data] = r3 
	r2 &= ~0x2000 
	r2 |= 0x8000 
?Motor_SaveStatus: 
	[Motor_Status] = r2 
	r2 = 0 
	[Motor_PWM_Cnt] = r2 
?Exit:	 
	pop r2,r3 from [sp] 
retf 
 
//====================================================== 
// 函数名称:	DCMotor_Backward 
// C调用:		void DCMotor_Backward(unsigned Motor) 
// 汇编调用:	F_DCMotor_Backward 
// 实现功能:   使电机反向转动 
// 入口参数:	Motor(R1) - 设定反向转动的电机: 
//					MOTOR_1		电机1 
//					MOTOR_2		电机2 
// 出口参数:	无 
// 破坏寄存器:	无 
//====================================================== 
_DCMotor_Backward: 
	push r1 to [sp] 
	r1 = sp + 4 
	r1 = [r1] 
	call F_DCMotor_Backward 
	pop r1 from [sp] 
retf 
 
F_DCMotor_Backward: 
	push r2,r3 to [sp] 
	r2 = [Motor_Status] 
	cmp r1,1 
	je ?Motor1 
	cmp r1,2 
	je ?Motor2 
	cmp r1,3 
	jne ?Exit 
?Motor1: 
	r3 = [P_Motor_Buf] 
	r3 |= PIN_PH1 
	[P_Motor_Data] = r3 
	r2 |= 0x5000 
	cmp r1,3 
	jne ?Motor_SaveStatus 
?Motor2: 
	r3 = [P_Motor_Buf] 
	r3 |= PIN_PH2 
	[P_Motor_Data] = r3 
	r2 |= 0xA000 
?Motor_SaveStatus: 
	[Motor_Status] = r2 
	r2 = 0 
	[Motor_PWM_Cnt] = r2 
?Exit:	 
	pop r2,r3 from [sp] 
retf 
 
//====================================================== 
// 函数名称:	DCMotor_Stop 
// C调用:		void DCMotor_Stop(unsigned Motor) 
// 汇编调用:	F_DCMotor_Stop 
// 实现功能:   直流电机停止转动 
// 入口参数:	Motor(R1) - 需要停转的电机 
//					MOTOR_1		电机1 
//					MOTOR_2		电机2 
// 出口参数:	无 
// 破坏寄存器:	无 
//====================================================== 
_DCMotor_Stop: 
	push r1 to [sp] 
	r1 = sp + 4 
	r1 = [r1] 
	call F_DCMotor_Stop 
	pop r1 from [sp] 
retf 
 
F_DCMotor_Stop: 
	push r2 to [sp] 
	cmp r1,1 
	je	?Motor1 
	cmp r1,2 
	je	?Motor2 
	cmp r1,3 
	jne ?Exit 
?Motor1: 
	r2 = [P_Motor_Buf] 
	r2 |= PIN_I01 + PIN_I02 
	[P_Motor_Buf] = r2 
	r2 = [Motor_Status] 
	r2 &= ~0x4000 
	[Motor_Status] = r2 
	cmp r1,3 
	jne ?ClearSpeed 
?Motor2: 
	r2 = [P_Motor_Buf] 
	r2 |= PIN_I11 + PIN_I12 
	[P_Motor_Buf] = r2 
	r2 = [Motor_Status] 
	r2 &= ~0x8000 
	[Motor_Status] = r2 
?ClearSpeed: 
	r2 = 0 
	[Motor_Speed] = r2 
?Exit: 
	pop r2 from [sp] 
retf 
 
//====================================================== 
// 函数名称:	DCMotor_Drive 
// C调用:		void DCMotor_Drive(void) 
// 汇编调用:	F_DCMotor_Drive 
// 实现功能:   产生PWM波形,在IRQ4_4KHz中断服务程序中调用 
// 入口参数:	无 
// 出口参数:	无 
// 破坏寄存器:	无 
//====================================================== 
_DCMotor_Drive: 
F_DCMotor_Drive: 
	push r1,r5 to [sp] 
	r1 = [Motor_Status] 
	test r1,0xC000 
	jnz	?Motor_ChkPulse 
	goto ?Exit 
?Motor_ChkPulse:							// 速度检测 
	r2 = [P_Motor_Data] 
	r2 &= PIN_SPD 
	jz	?Motor_Pulse 
	r2 = 0 
	[Motor_Pulse_Deb] = r2 
	jmp ?Motor_GetSpeed 
?Motor_Pulse: 
	r2 = [Motor_Pulse_Deb] 
	jnz	?Motor_Pulse_Old 
	r3 = [Motor_Pulse_Cnt] 
	r3 += 1 
	[Motor_Pulse_Cnt] = r3 
?Motor_Pulse_Old: 
	r2 += 1 
	[Motor_Pulse_Deb] = r2 
?Motor_GetSpeed: 
	r4 = [Motor_Timer_Cnt] 
	r4 += 1 
	cmp r4, 1024 
	jb ?Motor_Drive 
	r5 = [Motor_Pulse_Cnt] 
//	r5 = r5 LSR 1 
	[Motor_Speed] = r5 
	r5 = 0 
	[Motor_Pulse_Cnt] = r5 
	r5 = 1 
	[Motor_SpeedRdy] = r5 
	r4 = 0 
?Motor_Drive:								// PWM发生 
	[Motor_Timer_Cnt] = r4 
	r4 = [Motor_PWM_Cnt] 
	r5 = [P_Motor_Buf] 
?Motor1: 
	r2 = r1&0x003f 
	r3 = r4&0x003f 
	cmp r3,r2 
	jae ?Motor1_PWM_Low 
?Motor1_PWM_High: 
	r5 &= ~(PIN_I11+PIN_I01) 
	jmp ?Motor1_PWM_Next 
?Motor1_PWM_Low: 
	r5 |= (PIN_I11+PIN_I01) 
?Motor1_PWM_Next: 
	r3 += 1 
	r3 &= 0x003f 
	r4 &= ~0x003f 
	r4 |= r3 
?Motor2: 
	r2 = r1 & 0x0fc0 
	r3 = r4 & 0x0fc0 
	cmp r3,r2 
	jae ?Motor2_PWM_Low 
?Motor2_PWM_High: 
	r5 &= ~(PIN_I12+PIN_I02) 
	jmp ?Motor2_PWM_Next 
?Motor2_PWM_Low: 
	r5 |= PIN_I12+PIN_I02 
?Motor2_PWM_Next: 
	r3 += 0x0040 
	r3 &= 0x0fc0 
	r4 &= ~0x0fc0 
	r4 |= r3 
?Motor_Update: 
	[Motor_PWM_Cnt] = r4 
	[P_Motor_Data] = r5 
?Exit: 
	pop r1,r5 from [sp] 
retf 
 
//====================================================== 
// 函数名称:	DCMotor_GetSpeed 
// C调用:		unsigned DCMotor_GetSpeed(void) 
// 汇编调用:	F_DCMotor_GetSpeed 
// 实现功能:   获取电机转速 
// 入口参数:	无 
// 出口参数:	r1 - 测得的电机转速值,单位(转/秒) 
// 破坏寄存器:	无 
//====================================================== 
_DCMotor_GetSpeed: 
F_DCMotor_GetSpeed: 
	r1 = 0 
	[Motor_SpeedRdy] = r1 
	r1 = [Motor_Speed] 
retf 
 
 
//====================================================== 
// 函数名称:	DCMotor_IsSpeedRdy 
// C调用:		unsigned DCMotor_IsSpeedRdy(void) 
// 汇编调用:	F_DCMotor_IsSpeedRdy 
// 实现功能:   是否已完成一次电机转速测量 
// 入口参数:	无 
// 出口参数:	r1 - 结果, 0:否, 1:是 
// 破坏寄存器:	无 
//====================================================== 
_DCMotor_IsSpeedRdy: 
F_DCMotor_IsSpeedRdy: 
	r1 = [Motor_SpeedRdy] 
retf