⭐ 欢迎来到虫虫下载站! | 📦 资源下载 📁 资源专辑 ℹ️ 关于我们
⭐ 虫虫下载站

📄 spmc65_sfr.asm

📁 sunplus e_bike demo
💻 ASM
📖 第 1 页 / 共 2 页
字号:
;==================================================================================
; 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 + -