📄 spmc65_sfr.asm
字号:
;==================================================================================
; The information contained herein is the exclusive property of
; Sunplus Technology Co. and shall not be distributed, reproduced,
; or disclosed in whole in part without prior written permission.
; (C) COPYRIGHT 2004 SUNPLUS TECHNOLOGY CO.
; ALL RIGHTS RESERVED
; The entire notice above must be reproduced on all authorized copies.
;==================================================================================
;==================================================================================
; Project Name : SPMC65P2404A for BLDC motor demo board
; Applied Body : SPMC65P2404A
; Firmware version: V1.0
; Programer :
; Date : 2006/09/15
; Description : interrupt service routine
; Hardware Connect: SPMC65 BLDC demo board
; IDE Version : v1.6.8
; BODY Version : v1.0.2A
;==================================================================================
;****************************************
;* *
;* System Register Define *
;* *
;****************************************
.SYNTAX 6502 ; Process standard 6502 addressing syntax
.LINKLIST ; Generate linklist information
.SYMBOLS ; Generate symbolic debug information
;==================================================================================
;****************************************
;* *
;* System Register Define *
;* *
;****************************************
.INCLUDE SPMC65P2404A.inc ; Define all hardware,Registers and ports.
.INCLUDE SPMC65_CON.inc
.INCLUDE SPMC65_PWM.inc
.EXTERNAL F_SixStepWave
.page0
.PUBLIC V_NMI
.PUBLIC V_IRQ
.PUBLIC F_ReadHall
.PUBLIC F_Spd_MontCtrl
.PUBLIC F_Brake_Control
.PUBLIC F_Motor_StopUp_Control
.PUBLIC F_MotorStop_Control
.PUBLIC F_DutyCmdUpdate
.PUBLIC F_Pwm_Renew_Process
.PUBLIC F_BatteryCharge_Control
.PUBLIC F_Close_Timer2
.PUBLIC F_Open_Timer2
.PUBLIC F_Close_Timer0
.PUBLIC F_Open_UN_VN_WN
.PUBLIC F_Close_UP_VP_WP
.PUBLIC G_Monitor
.PUBLIC G_RunState
.PUBLIC G_Hall_Pos
.PUBLIC G_Hall_old
.PUBLIC G_Hall_Flag
.PUBLIC G_Hall1_Num
.PUBLIC G_Hall_Temp
.PUBLIC G_Hall_Alarm_Pos
.PUBLIC G_POS_fifo
.PUBLIC G_PhaseCmd
.PUBLIC G_PhaseCtrlFilter
.PUBLIC G_Temp
.PUBLIC G_ADC4_Buf
.PUBLIC G_ADC6_Buf
.PUBLIC G_MotorStopUp_Time
.PUBLIC G_MotorStop_Cnt
.PUBLIC G_SpeedMode
.PUBLIC G_SpeedComand
.PUBLIC G_5S_Count
.PUBLIC G_PwmRenew_Time
.PUBLIC G_SpeedRenew_Time
.PUBLIC G_SpdCtrl_Cnt
.PUBLIC G_Iover_Buf
.PUBLIC G_BrakeError_Buf
.PUBLIC G_PwmDelay_Buf
.PUBLIC G_Reverse_Cnt
.PUBLIC G_Time_Flag
.PUBLIC G_SYS_Control_Flag
;==================
;Motor area
;==================
G_Monitor DS 1 ;system monitor
G_RunState DS 1 ;motor run state
;
;==================
;hall area
;==================
G_Hall_Pos DS 1 ;current hall sensor position
G_Hall_old DS 1 ;last hall sensor position
G_Hall_Temp DS 1 ;IOc data buffer temp
G_Temp DS 1 ;temp buffer
G_Hall_Alarm_Pos DS 1
;
;==================
;phase area
;==================
G_PhaseCmd DS 2 ;phase command, LSB byte : MSB higher 4 bits
G_PhaseCtrlFilter DS 2 ;PWM duty filter
;
;==================
;ad area
;==================
G_ADC6_Buf DS 1 ;I ad result
G_ADC4_Buf DS 1 ;speed ad
;
;==================
;hall detect area
;==================
G_Hall1_Num DS 1 ;hall 1 number
G_Hall_Flag DS 1 ;hall flag
G_Reverse_Cnt DS 1 ;used for motor stopup reverse
G_PwmDelay_Buf DS 1 ;PWM comprense delay buffer
;
;==================
;PWM area
;==================
G_POS_fifo DS 2 ;position period fifo
G_SpeedComand DS 2 ;speed comand
;
G_SpdCtrl_Cnt DS 1 ;speed control slice counter
G_PwmRenew_Time DS 1 ;change mode PWM renew time
G_SpeedRenew_Time DS 1 ;constant mode PWM renew time
;
G_MotorStopUp_Time DS 1 ;used for moto stopup time
G_MotorStop_Cnt DS 1 ;used for moto stopup time
;
G_BrakeError_Buf DS 1 ;used set brake,I over,batter low flag
;
G_Iover_Buf DS 1 ;used for I over control
;
G_5S_Count DS 1 ;used for constant speed delay
G_SpeedMode DS 1 ;used for speed mode slect
;
G_PWM0_Duty DS 1 ;20 <G_PWM0_Duty <140D
G_Time_Flag DS 1 ;used for set time flag
G_SYS_Control_Flag DS 1 ;system control flag
;
;
;****************************************
;* *
;* Data memory Define *
;* *
;****************************************
.DATA ; define data storage section
.CODE
;****************************************
; Applied Body : SPMC65P2404A
; Firmware version: V1.0
; Programer :
; Date : 2006/09/15
; Description : chongdian process
; Hardware Connect: SPMC65 BLDC demo board
; IDE Version : v1.6.8
; BODY Version : v1.0.2A
;****************************************
F_BatteryCharge_Control:
tst G_SYS_Control_Flag,CB_BatterOver_Flag
bne L_ChongDian_Control1
tst G_Monitor,CB_MotorBrake_Flag;brake?
bne L_Close_Chongdian_Led0
tst G_Hall_Flag,CB_HelpMode_Flag;is help mode?
bne L_ChongDian_Control1
lda G_SpeedMode ;xunhang mode?
bne L_ChongDian_Control1
lda G_POS_fifo+1 ;speed is large>18k/m?
cmp #C_Charge_SpeedHigh
bcs L_ChongDian_Control1 ;no
lda G_ADC4_Buf ;speed change mode?
cmp #C_SpeedLmit_AD ;
bcc L_ChongDian_Process
;
L_ChongDian_Control1:
jsr F_Close_ChongDian_PWM0
jsr F_Close_Timer0
jsr F_Open_Timer2
L_Close_Chongdian_Led:
clr G_SYS_Control_Flag,CB_ChargeMode_Flag
L_Close_Chongdian_Led0:
clr G_DISP_FLAG,CB_DispCharge_Flag
jmp L_ChongDian_Contrl_End
L_ChongDian_Process:
jsr F_Close_Timer2
lda #40
sta G_PWM0_Duty
jsr F_Open_ChongDian_PWM0
set G_SYS_Control_Flag,CB_ChargeMode_Flag
;set chongdian mode flag
set G_DISP_FLAG,CB_DispCharge_Flag
;set chongdian display flag
L_ChongDian_Contrl_End:
rts
;
F_Brake_Control:
;
tst P_IOB_Data,BRAKE ;brake?
bne L_NoBrake_Control ;brake=1 to L_NoBrake_Control
;
set G_Monitor,CB_MotorBrake_Flag ;Set brake flag
set G_DISP_FLAG,CB_DispBrake_Flag ;Set brake display flag
;
clr G_DISP_FLAG,CB_DispConstant_Flag;clear xunhang led
clr G_DISP_FLAG,CB_DispHelp_Flag ;clear help led
clr G_DISP_FLAG,CB_DispCharge_Flag ;clear Chongdian led
lda #0
sta G_SpeedMode
sta G_5S_Count
sta G_MotorStopUp_Time
clr G_BrakeError_Buf,CB_MotorStopUp_Flag;
tst G_BrakeError_Buf,CB_EbsEnable_Flag
;slect EBS brake or not ?
bne L_EBS_Brake_Control ; moto brake process
jmp L_Brake_Control_End
L_EBS_Brake_Control:
tst G_SYS_Control_Flag,CB_ChargeMode_Flag
bne L_SetEBS_Led0
lda G_PhaseCtrlFilter+1
cmp #0fh
bne L_Brake_Control_End
lda G_PhaseCtrlFilter
cmp #f0h
bcc L_Brake_Control_End
L_SetEBS_Led0:
tst G_BrakeError_Buf,CB_MotorStop_Flag
beq L_SetEBS_Led
clr G_DISP_FLAG,CB_DispCharge_Flag
jmp L_EBS_Brake_Control1
L_SetEBS_Led:
set G_DISP_FLAG,CB_DispCharge_Flag
L_EBS_Brake_Control1:
tst G_SYS_Control_Flag,CB_BatterOver_Flag
bne L_NoBrake_Control0 ;battery is over
jsr F_Close_Timer2
tst G_SYS_Control_Flag,CB_EbsFirstPWM0_Flag
bne L_EBS_Not_FirstLoad_PWM0
lda #40d ;initial EBS pwm0 duty
sta G_PWM0_Duty
set G_SYS_Control_Flag,CB_EbsFirstPWM0_Flag
L_EBS_Not_FirstLoad_PWM0:
tst G_Time_Flag,CB_20Ms_Flag
beq L_Not_Inc_PWM0_Duty
clr G_Time_Flag,CB_20Ms_Flag
inc G_PWM0_Duty
inc G_PWM0_Duty
inc G_PWM0_Duty
lda G_PWM0_Duty
cmp #140 ;the max pwm0 duty
BCC L_Not_Inc_PWM0_Duty
lda #140
sta G_PWM0_Duty
L_Not_Inc_PWM0_Duty:
jsr F_Open_EBS_PWM0
jmp L_Brake_Control_End
L_NoBrake_Control:
clr G_Monitor,CB_MotorBrake_Flag
clr G_DISP_FLAG,CB_DispBrake_Flag
tst G_SYS_Control_Flag,CB_ChargeMode_Flag
bne L_Brake_Control_End
L_NoBrake_Control0:
clr G_SYS_Control_Flag,CB_EbsFirstPWM0_Flag
jsr F_Close_EBS_PWM0
jsr F_Close_Timer0
jsr F_Open_Timer2
L_Brake_Control_End:
rts
;
;
F_Open_EBS_PWM0:
tst G_SYS_Control_Flag,CB_EbsFirstInput_Flag
bne L_EBS_Not_FirstInput ;CB_EbsFirstInput_Flag=1 to L_EBS_Not_FirstInput
lda #ffh
sec
sbc G_PWM0_Duty
sta P_TMR0_Preload ;
;
jsr F_Open_Time0
jsr F_Close_UP_VP_WP ;Close Up,Vp,Wp
TurnOnIPM
jsr F_Open_UN_VN_WN ;Open Un,Vn,Wn
set G_BrakeError_Buf,CB_EbsPwmLevel_Flag
set G_SYS_Control_Flag,CB_EbsFirstInput_Flag
L_EBS_Not_FirstInput:
rts
;
;
F_Open_ChongDian_PWM0:
tst G_SYS_Control_Flag,CB_ChargeMode_Flag
bne L_ChongDian_Not_FirstInput
lda #ffh
sec
sbc G_PWM0_Duty
sta P_TMR0_Preload ;
;
jsr F_Open_Time0
jsr F_Close_UP_VP_WP ;close up,vp,wp
TurnOnIPM
jsr F_Open_UN_VN_WN ;open un,vn,wn
set G_BrakeError_Buf,CB_EbsPwmLevel_Flag
set G_SYS_Control_Flag,CB_ChargeMode_Flag
L_ChongDian_Not_FirstInput:
rts
F_Close_ChongDian_PWM0:
tst G_SYS_Control_Flag,CB_ChargeMode_Flag
beq L_Close_ChongDian_PWM0_End
jsr F_Close_UN_VN_WN
jsr F_Close_UP_VP_WP
jsr F_Close_Timer0
clr G_SYS_Control_Flag,CB_ChargeMode_Flag
L_Close_ChongDian_PWM0_End:
rts
F_Close_EBS_PWM0:
tst G_SYS_Control_Flag,CB_EbsFirstInput_Flag
beq F_Close_EBS_PWM0_End
jsr F_Close_UN_VN_WN
jsr F_Close_UP_VP_WP
jsr F_Close_Timer0
clr G_SYS_Control_Flag,CB_EbsFirstInput_Flag
F_Close_EBS_PWM0_End:
rts
;
;
F_Close_UP_VP_WP:
lda P_IOD_Buf ;close up,vp,wp
and #f8h
sta P_IOD_Buf
rts
;
;
F_Close_UN_VN_WN:
lda P_IOA_Buf ;close vn,vn,wn
ora #07h
sta P_IOA_Buf
rts
;
;
F_Open_UN_VN_WN:
lda P_IOA_Buf ;open un,vn,wn
and #f8h
sta P_IOA_Buf
rts
;
;
F_Open_Time0:
lda P_TMR0_1_Ctrl0
and #f8h
ora #C_T08B_Timer
sta P_TMR0_1_Ctrl0 ;Open timer0, 8-bit counter mode
lda #C_INT_T0OIF
sta P_INT_Flag1
set P_INT_Ctrl1,CB_INT_T0OIE ;enable T0 interrupt
rts
;
;
F_Close_Timer0:
clr P_INT_Ctrl1,CB_INT_T0OIE ;disable T0 interrupt
lda #C_INT_T0OIF
sta P_INT_Flag1
lda P_TMR0_1_Ctrl0
and #f8h
sta P_TMR0_1_Ctrl0 ;Close timer0, Disable mode
rts
;
;
F_Open_Timer2:
lda #256-150 ;interrupt rate = 80 us
sta P_TMR2_Preload
lda P_TMR2_3_Ctrl0
and #f8h
ora #C_T28B_Timer
sta P_TMR2_3_Ctrl0 ;enable t2 time
set P_INT_Ctrl1, CB_INT_T2OIE ;enable t2 int
rts
;
;
F_Close_Timer2:
lda P_TMR2_3_Ctrl0
and #f8h
sta P_TMR2_3_Ctrl0 ;disable t2 time
lda #C_INT_T2OIF
sta P_INT_Flag1
clr P_INT_Ctrl1, CB_INT_T2OIE ;disable t2 interrupt
rts
;
F_Motor_StopUp_Control:
tst G_BrakeError_Buf,CB_BatterLow_Flag
bne L_Motor_StopUp_Cortrol_End0 ;hlp 0424
tst G_Monitor,CB_MotorBrake_Flag
bne L_Motor_StopUp_Cortrol_End
lda G_MotorStopUp_Time ; Motor stopup timer compare
cmp #C_MotorStopUp_Time
bcs L_Motor_StopOrNot ; >=0x02 to process stopup
jmp L_Motor_StopUp_Cortrol_End
;
L_Motor_StopOrNot:
lda #0
sta G_MotorStopUp_Time ;Clear MotorStopUp_Time
tst G_Monitor, CB_MotorRun_Flag
bne L_MotorStop
jmp L_Motor_StopUp_Cortrol_End
;
L_MotorStop:
set G_BrakeError_Buf,CB_MotorStopUp_Flag ;Set motor stopUp flag
clr G_DISP_FLAG,CB_DispConstant_Flag ;clear xunhang led
clr G_DISP_FLAG,CB_DispHelp_Flag ;clear help led
clr G_DISP_FLAG,CB_DispCharge_Flag ;clear Chongdian led
L_Motor_StopUp_Cortrol_End:
rts
L_Motor_StopUp_Cortrol_End0:
clr G_BrakeError_Buf,CB_MotorStopUp_Flag
rts
;
F_MotorStop_Control:
lda G_MotorStop_Cnt
cmp #C_MotorStop_Time
beq L_MotorStopOrNot ;
jmp L_MotorStopCortrol_End
;
L_MotorStopOrNot:
lda #0
sta G_MotorStop_Cnt
L_MotorStop0:
set G_BrakeError_Buf,CB_MotorStop_Flag
L_MotorStopCortrol_End:
rts
;;
;
;******************************************************************************
; F_ReadHall : read hall sensor signal respective rotating direction
; output : Hall_Pos
;******************************************************************************
hall_tab: ;0 1 2 3 4 5 6 7
db 5,1,2,3,4,5,6,2
hall60_120_tab:
db 1,0,2,0,0,2,0,1
HallTransTab1:
db 0
db 6 ;1
db 5 ;2
db 4 ;3
db 3 ;4
db 2 ;5
db 1 ;
LastHallStateTab:
db 0 ;no use
db 5 ;1
db 3 ;2
db 1 ;3
db 6 ;4
db 4 ;5
db 2 ;6
LastHallStateTab2:
db 0 ;no use
db 3 ;1
db 6 ;2
db 2 ;3
db 5 ;4
db 1 ;5
db 4 ;6
F_ReadHall:
lda P_IOC_Data ; P_IOA_Data
and #HALL_MASK1
sta G_Hall_Temp ; read HU(PC2),HV(PC1),HW(PC0)
;
tst G_Hall_Flag,CB_120_60_Checked
bne ?ok_checked
;还不知道是60度 or 120度电机
ldx G_Hall_Temp
lda hall_tab,x
sta G_Hall_Temp
lda hall60_120_tab,x
beq ?goon
set G_Hall_Flag,CB_120_60_Checked
cmp #1
beq ?is_60
?is_120:
set G_Hall_Flag,CB_Hall120Or60_Flag
jmp L_MotorDir
?is_60:
clr G_Hall_Flag,CB_Hall120Or60_Flag
?goon:
jmp L_MotorDir
?ok_checked:
ldx G_Hall_Temp
lda hall60_120_tab,x
tst G_Hall_Flag,CB_Hall120Or60_Flag
beq ?Hall_60
;120度:
cmp #1
beq L_HallErr ;0 ,7 error
jmp L_MotorDir
;
?Hall_60:
cmp #2
beq L_HallErr ;2,5 error
lda hall_tab,x
sta G_Hall_Temp ; 7---->2 , 0---->5
jmp L_MotorDir
L_HallErr:
set G_Monitor, CB_HallInvalid_Flag
rts
L_MotorDir:
clr G_Monitor, CB_HallInvalid_Flag
lda G_Hall_Temp
cmp G_Hall_old
bne L_PhaseChange_Cortrol ;(Jump if Difference)
set G_Hall_Flag,CB_HallSame_Flag
rts
;
;
;========================================
; check CW hall vs. position
;======================================== ;CW 1,5,4,6,2,3
L_PhaseChange_Cortrol: ;CCW 5,1,3,2,6,4
clr G_Hall_Flag,CB_HallSame_Flag
ldx G_Hall_Temp
stx G_Hall_Pos
lda #2
sta G_Test_Num
;HU(PC2),HV(PC1),HW(PC0)
tst G_Hall_Flag,CB_Hall120Or60_Flag
beq ?hall60
;120
tst G_Hall_Flag,CB_RollBack
bne ?tab2
?tab1:
lda LastHallStateTab,x
jmp ?share
?hall60:
tst G_Hall_Flag,CB_RollBack
bne ?tab1
?tab2:
lda LastHallStateTab2,x
?share:
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -