?? stepmotor.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.
//========================================================
//============================================================
// 文件名稱:StepMotor.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_MOTOR PIN_I01+PIN_I11+PIN_PH1+PIN_I02+PIN_I12+PIN_PH2
//================================================
// 步進電機最高速度定義
//================================================
.define MOTOR_MAXSPEED 150 // 單位為拍/秒(P.P.S)
//================================================
// 電機工作模式定義
//================================================
.define STEP_FULL 0x0001 // 整步
.define STEP_HALF 0x0002 // 半步
.define STEP_MOHALF 0x0003 // 優化半步
//================================================
// 中斷常量定義
//================================================
.define P_INT_Mask 0x702d
.define C_IRQ4_4KHz 0x0040
//================================================
// 公有函數聲明
//================================================
.public _StepMotor_Init
.public F_StepMotor_Init
.public _StepMotor_SetMode
.public F_StepMotor_SetMode
.public _StepMotor_SetSpeed
.public F_StepMotor_SetSpeed
.public _StepMotor_Forward
.public F_StepMotor_Forward
.public _StepMotor_Backward
.public F_StepMotor_Backward
.public _StepMotor_Stop
.public F_StepMotor_Stop
.public _StepMotor_Status
.public F_StepMotor_Status
.public _StepMotor_Drive
.public F_StepMotor_Drive
//================================================
// 三種工作方式的控制時序表
//================================================
.data
Tbl_SMotor_Full: // 整步
.dw PIN_PH1+PIN_PH2
.dw PIN_PH2
.dw 0x0000
.dw PIN_PH1
.dw PIN_PH1+PIN_PH2
.dw PIN_PH2
.dw 0x0000
.dw PIN_PH1
Tbl_SMotor_Half: // 半部
.dw PIN_I11+PIN_PH1+PIN_I02+PIN_I12+PIN_PH2
.dw PIN_I11+PIN_PH1+ PIN_I12+PIN_PH2
.dw PIN_I01+PIN_I11+ PIN_I12+PIN_PH2
.dw PIN_I11+ PIN_I12+PIN_PH2
.dw PIN_I11+ PIN_I02+PIN_I12
.dw PIN_I11+ PIN_I12
.dw PIN_I01+PIN_I11+PIN_PH1+ PIN_I12
.dw PIN_I11+PIN_PH1+ PIN_I12
Tbl_SMotor_MoHalf: // 優化半部
.dw PIN_PH1+PIN_I02+PIN_I12+PIN_PH2
.dw PIN_I01+ PIN_PH1+PIN_I02+ PIN_PH2
.dw PIN_I01+PIN_I11+ PIN_PH2
.dw PIN_I01+ PIN_I02+ PIN_PH2
.dw PIN_I02+PIN_I12
.dw PIN_I01+ PIN_I02
.dw PIN_I01+PIN_I11+PIN_PH1
.dw PIN_I01+ PIN_PH1+PIN_I02
//================================================
// 變量定義
//================================================
.iram
SMotor_StartPtr: .dw 0 // 控制時序表起始地址
SMotor_CurPtr: .dw 0 // 時序表中當前拍的時序指針
SMotor_Dir: .dw 0 // 電機轉動方向
SMotor_TimerSet: .dw 0 // 定時器預置數值
SMotor_CurTimer: .dw 0 // 定時器計數值
SMotor_Steps: .dw 0 // 電機剩余轉動步數
.code
//======================================================
// 函數名稱: StepMotor_Init
// C調用: void StepMotor_Init(void)
// 匯編調用: F_StepMotor_Init
// 實現功能: 步進電機驅動初始化(將開啟IRQ4_4KHz中斷)
// 入口參數: 無
// 出口參數: 無
// 破壞寄存器: 無
//======================================================
_StepMotor_Init:
F_StepMotor_Init:
push r1 to [sp]
INT OFF
r1 = [P_Motor_Attr]
r1 |= PIN_MOTOR
[P_Motor_Attr] = r1
r1 = [P_Motor_Dir]
r1 |= PIN_MOTOR
[P_Motor_Dir] = r1
r1 = [P_Motor_Buf]
r1 |= PIN_MOTOR
[P_Motor_Data] = r1
r1 = Tbl_SMotor_Full
[SMotor_StartPtr] = r1
[SMotor_CurPtr] = r1
r1 = 0x0000
[SMotor_TimerSet] = r1
[SMotor_CurTimer] = r1
[SMotor_Steps] = r1
[SMotor_Dir] = r1
r1 = [P_INT_Mask]
r1 |= C_IRQ4_4KHz
[P_INT_Mask] = r1
INT FIQ,IRQ
pop r1 from [sp]
retf
//======================================================
// 函數名稱: StepMotor_SetMode
// C調用: void StepMotor_SetMode(unsigned ModeCode)
// 匯編調用: F_StepMotor_SetMode
// 實現功能: 設置步進電機工作模式
// 入口參數: ModeCode(r1) - 步進電機工作模式,可以是下列數值之一:
// STEP_FULL - 整步模式
// STEP_HALF - 半步模式
// STEP_MOHALF - 優化半步模式
// 出口參數: 無
// 破壞寄存器: 無
//======================================================
_StepMotor_SetMode:
push r1 to [sp]
r1 = sp + 4
r1 = [r1]
call F_StepMotor_SetMode
pop r1 from [sp]
retf
F_StepMotor_SetMode:
push r1 to [sp]
cmp r1, STEP_FULL
jne ?IsHalf
?Full:
r1 = Tbl_SMotor_Full
jmp ?SetPtr
?IsHalf:
cmp r1, STEP_HALF
jne ?IsMoHalf
?Half:
r1 = Tbl_SMotor_Half
jmp ?SetPtr
?IsMoHalf:
cmp r1, STEP_MOHALF
jne ?Full
?MoHalf:
r1 = Tbl_SMotor_MoHalf
?SetPtr:
[SMotor_StartPtr] = r1
[SMotor_CurPtr] = r1
pop r1 from [sp]
retf
//======================================================
// 函數名稱: StepMotor_SetSpeed
// C調用: void StepMotor_SetSpeed(unsigned Speed)
// 匯編調用: F_StepMotor_SetSpeed
// 實現功能: 設置步進電機轉速
// 入口參數: Speed(r1) - 轉速值,單位為拍/秒(P.P.S),范圍從1到MOTOR_MAXSPEED
// 出口參數: 無
// 破壞寄存器: 無
//======================================================
_StepMotor_SetSpeed:
push r1 to [sp]
r1 = sp + 4
r1 = [r1]
call F_StepMotor_SetSpeed
pop r1 from [sp]
retf
.external __divu1 // 除法函數,在CMacro1016.lib或CMacro.lib庫中
F_StepMotor_SetSpeed:
push r1,r2 to [sp]
r2 = r1 // TimerData=4096/pps (@4kHz Timer)
jz ?Exit
cmp r2, MOTOR_MAXSPEED
jna ?SetTimer
r2 = MOTOR_MAXSPEED
?SetTimer:
r1 = 4096
push r1,r2 to [sp]
call __divu1
sp += 2
r2 = r2 lsl 1 //余數與4096比較,四舍五入
cmp r2, 4096
jb ?NoCarry
?Carry:
r1 += 1
?NoCarry:
[SMotor_TimerSet] = r1
r1 = 0
[SMotor_CurTimer] = r1
?Exit:
pop r1,r2 from [sp]
retf
//======================================================
// 函數名稱: StepMotor_Forward
// C調用: void StepMotor_Forward(unsigned Step)
// 匯編調用: F_StepMotor_Forward
// 實現功能: 使電機正向轉動
// 入口參數: Steps(r1) - 使電機轉動的拍數,范圍從1~65535
// 當Steps設置為0時,電機將持續轉動
// 出口參數: 無
// 破壞寄存器: 無
//======================================================
_StepMotor_Forward:
push r1 to [sp]
r1 = sp + 4
r1 = [r1]
call F_StepMotor_Forward
pop r1 from [sp]
retf
F_StepMotor_Forward:
push r1 to [sp]
[SMotor_Steps] = r1
r1 = [SMotor_StartPtr]
[SMotor_CurPtr] = r1
r1 = 1
[SMotor_Dir] = r1
pop r1 from [sp]
retf
//======================================================
// 函數名稱: StepMotor_Backward
// C調用: void StepMotor_Backward(unsigned Step)
// 匯編調用: F_StepMotor_Backward
// 實現功能: 使電機反向轉動
// 入口參數: Steps(r1) - 使電機轉動的拍數,范圍從1~65535
// 當Steps設置為0時,電機將持續轉動
// 出口參數: 無
// 破壞寄存器: 無
//======================================================
_StepMotor_Backward:
push r1 to [sp]
r1 = sp + 4
r1 = [r1]
call F_StepMotor_Backward
pop r1 from [sp]
retf
F_StepMotor_Backward:
push r1 to [sp]
[SMotor_Steps] = r1
r1 = [SMotor_StartPtr]
r1 += 7
[SMotor_CurPtr] = r1
r1 = -1
[SMotor_Dir] = r1
pop r1 from [sp]
retf
//======================================================
// 函數名稱: StepMotor_Drive
// C調用: void StepMotor_Drive(void)
// 匯編調用: F_StepMotor_Drive
// 實現功能: 實現電機轉動,該函數僅被IRQ4_4KHz中斷服務程序調用
// 入口參數: 無
// 出口參數: 無
// 破壞寄存器: 無
//======================================================
_StepMotor_Drive:
F_StepMotor_Drive:
push r1,r2 to [sp]
r1 = [SMotor_TimerSet]
jz ?Exit
r2 = [SMotor_Dir]
jz ?Exit
r2 = [SMotor_CurTimer]
r2 += 1
[SMotor_CurTimer] = r2
cmp r2, r1
jb ?Exit
r1 = [SMotor_CurPtr]
r2 = [P_Motor_Buf]
r2 &= ~PIN_MOTOR
r2 |= [r1]
[P_Motor_Data] = r2
r1 += [SMotor_Dir]
r2 = [SMotor_StartPtr]
cmp r1, r2
jb ?Rewind_Tail
r2 += 7
cmp r1, r2
jna ?Save_Ptr
?Rewind_Head:
r1 = [SMotor_StartPtr]
jmp ?Save_Ptr
?Rewind_Tail:
r1 = [SMotor_StartPtr]
r1 += 7
?Save_Ptr:
[SMotor_CurPtr] = r1
r1 = [SMotor_Steps]
jz ?NextStep
r1 -= 1
[SMotor_Steps] = r1
jnz ?NextStep
r1 = 0
[SMotor_Dir] = r1
r1 = [P_Motor_Buf]
r1 |= PIN_I01 + PIN_I02 + PIN_I11 + PIN_I12
[P_Motor_Buf] = r1
?NextStep:
r1 = 0
[SMotor_CurTimer] = r1
?Exit:
pop r1,r2 from [sp]
retf
//======================================================
// 函數名稱: StepMotor_Stop
// C調用: void StepMotor_Stop(void)
// 匯編調用: F_StepMotor_Stop
// 實現功能: 使電機停止轉動
// 入口參數: 無
// 出口參數: 無
// 破壞寄存器: 無
//======================================================
_StepMotor_Stop:
F_StepMotor_Stop:
push r1 to [sp]
r1 = 0
[SMotor_Dir] = r1
[SMotor_CurTimer] = r1
[SMotor_Steps] = r1
r1 = [P_Motor_Buf]
r1 |= PIN_I01 + PIN_I02 + PIN_I11 + PIN_I12
[P_Motor_Buf] = r1
pop r1 from [sp]
retf
//======================================================
// 函數名稱: StepMotor_Status
// C調用: unsigned StepMotor_Status(void)
// 匯編調用: F_StepMotor_Status
// 實現功能: 獲取當前電機的轉動狀態(正轉、反轉或停轉)
// 入口參數: 無
// 出口參數: r1 - 電機轉動狀態,可能是下列數值:
// 0 - 停止狀態
// 1 - 正向轉動
// 0xffff - 反向轉動
// 破壞寄存器: 無
//======================================================
_StepMotor_Status:
F_StepMotor_Status:
r1 = [SMotor_Dir]
retf
?? 快捷鍵說明
復制代碼
Ctrl + C
搜索代碼
Ctrl + F
全屏模式
F11
切換主題
Ctrl + Shift + D
顯示快捷鍵
?
增大字號
Ctrl + =
減小字號
Ctrl + -