📄 main.asm
字号:
;****************************************
F_Help_Detect:
tst G_Time_Flag,CB_1250Ms_Flag ;
bne L_Hall_0and1_Compare ;every 1s compare
tst P_IOA_Data,HP_HALL ;read help hall
beq L_Hall_0_Count
;
L_Hall_1_Count:
set G_Hall_Flag,CB_HelpHall1_Flag;set read 1 flag
inc G_Help1_count ;count read 1 times
bne L_NotIncHi1
inc G_Help1_count+1
L_NotIncHi1:
jmp L_Help_Detect_End
;
L_Hall_0_Count:
tst G_Hall_Flag,CB_HelpHall1_Flag
beq L_Hall0_Count_Time
inc G_Help1_count_Time ;count read 1 times
;
L_Hall0_Count_Time:
clr G_Hall_Flag,CB_HelpHall1_Flag ;clear read 1 flag
inc G_Help0_count ;count read 0 times
bne L_NotIncHi0
inc G_Help0_count+1
L_NotIncHi0:
jmp L_Help_Detect_End
;
L_Hall_0and1_Compare: ;compare read 0 and 1 times every 1s
clr G_Time_Flag,CB_1250Ms_Flag
lda G_Help1_count
sta G_Temp_0
lda G_Help1_count+1
ror a
ror G_Temp_0
ror a
ror G_Temp_0
lda G_Temp_0
cmp #250 ;250*4=1000
bcs L_No_Help_Comand
cmp #170 ;180*4
bcc L_No_Help_Comand
;
L_Help_Comand_Process:
lda G_Help1_count_Time ;read 1 times
cmp #1
bcc L_No_Help_Comand
cmp #18
bcs L_No_Help_Comand
cmp #2
bcs L_Help_Detect_High ;1?
inc G_HallStart_Count ;help start delay
ldx G_HallStart_Count
cpx #C_HelpHallStart_Count ;
bcc L_Help_Detect_Low
;
L_Help_Detect_High: ;hlp 05/29
lda G_Help_Comand_BufferLo+2
sta G_Help_Comand_BufferLo+3
lda G_Help_Comand_BufferLo+1
sta G_Help_Comand_BufferLo+2
lda G_Help_Comand_BufferLo
sta G_Help_Comand_BufferLo+1
lda G_Help_Comand_BufferHi+2
sta G_Help_Comand_BufferHi+3
lda G_Help_Comand_BufferHi+1
sta G_Help_Comand_BufferHi+2
lda G_Help_Comand_BufferHi
sta G_Help_Comand_BufferHi+1
lda G_Help1_count_Time
sta G_Divid0
lda G_Help1_count
sta G_Divided0
lda G_Help1_count+1
sta G_Divided1
jsr F_16BitDivid8Bit
lda G_Divided0
sta G_Help_Comand_BufferLo ;G_Help_Comand
lda G_Divided1
sta G_Help_Comand_BufferHi ;G_Help_Comand+1
lda #0
sta G_Divided0
sta G_Divided1
ldx #3
L_adc_loop:
clc
lda G_Help_Comand_BufferLo,x
adc G_Divided0
sta G_Divided0
lda G_Help_Comand_BufferHi,x
adc G_Divided1
sta G_Divided1
dex
bpl L_adc_loop
lsr G_Divided1
ror G_Divided0
lsr G_Divided1
ror G_Divided0
lda G_Divided1
sta G_Help_Comand+1
lda G_Divided0
sta G_Help_Comand
lda #0
sta G_HallStart_Count
set G_Hall_Flag,CB_HelpComand_Flag
jmp L_Help_Comand0
;
L_No_Help_Comand: ;clear help comand flag
lda #0
sta G_HallStart_Count
L_Help_Detect_Low:
clr G_Hall_Flag,CB_HelpComand_Flag
L_Help_Comand0:
lda #0 ;clear help hall 1 count
sta G_Help1_count
sta G_Help1_count+1
sta G_Help0_count
sta G_Help0_count+1 ;clear help hall 0 count
sta G_Help1_count_Time
L_Help_Detect_End:
rts
;****************************************
; Applied Body : SPMC65P2404A
; Firmware version: V1.0
; Programer :
; Date : 2006/09/15
; Description : ERROR_LED ilnformation display
; Hardware Connect: SPMC65 BLDC demo board
; IDE Version : v1.6.8
; BODY Version : v1.0.2A
;****************************************
F_Led_Driver:
L_Disp_Brake_Led:
tst G_DISP_FLAG,CB_DispBrake_Flag ; brake?
beq L_Disp_Iover_Led ; no
set P_IOB_Data, ERROR_LED ;
jmp L_Disp_ChongDian_Led0
;
L_Disp_Iover_Led:
tst G_DISP_FLAG,CB_DispIOver_Flag ; I over?
beq L_Disp_Batter_Low_Led ; no
tst G_Time_Flag,CB_3S_Flag ; 3s?
beq L_Disp_ChongDian_Led
tst G_Time_Flag,CB_500Ms_Flag ; 0.5s?
beq L_Disp_ChongDian_Led ; 0.5s flash
set P_IOB_Data, ERROR_LED ;
jmp L_Disp_ChongDian_Led0
;
L_Disp_Batter_Low_Led:
tst G_DISP_FLAG,CB_DispBatterLow_Flag;batter low?
beq L_DispNoPWM_Led ; no
tst G_Time_Flag,CB_2S_Flag ; 2s?
beq L_Disp_ChongDian_Led ; no
tst G_Time_Flag,CB_500Ms_Flag
beq L_Disp_ChongDian_Led ; 0.5s flash
set P_IOB_Data, ERROR_LED ; open batter low ERROR_LED
jmp L_Disp_ChongDian_Led0
;
L_DispNoPWM_Led:
tst G_DISP_FLAG,CB_DispNoPWM_Flag ; batter low?
beq L_Disp_ChongDian_Led ; no
tst G_Time_Flag,CB_500Ms_Flag ; 0.5s?
beq L_Disp_ChongDian_Led ; no
set P_IOB_Data, LED ; open batter low led
jmp L_Disp_ChongDian_Led0
L_Disp_ChongDian_Led:
clr P_IOB_Data, ERROR_LED ; close
;
L_Disp_ChongDian_Led0: ; Display chongdian led
tst G_DISP_FLAG,CB_DispCharge_Flag
beq L_Disp_Chongdian_End
jmp L_DISP_XH_LED0
;
L_Disp_Chongdian_End:
L_DISP_XH_LED0: ; Display xunhang led
tst G_DISP_FLAG,CB_DispConstant_Flag
beq L_Disp_XH_End
jmp L_DISP_HP_LED0
L_Disp_XH_End: ; Display help led
L_DISP_HP_LED0:
tst G_DISP_FLAG,CB_DispHelp_Flag
beq L_DISP_HP_END
set P_IOA_Data,HP_LED
jmp L_Disp_Led_End
;
L_DISP_HP_END:
clr P_IOA_Data,HP_LED
L_Disp_Led_End:
rts
;
;
;****************************************
; Applied Body : SPMC65P2404A
; Firmware version: V1.0
; Programer :
; Date : 2006/09/15
; Description : Task2 : current and battery protect
; Hardware Connect: SPMC65 BLDC demo board
; IDE Version : v1.6.8
; BODY Version : v1.0.2A
;****************************************
F_Protect_Control:
tst G_Monitor, CB_IOverAlarm_Flag ; I over flag (NMI occur)
beq L_IAD_PROCESS ; Not I over arm-->L_IAD_PROCESS: compare current ovre value
;
set P_IOB_Dir, INT_OC ; Becomes PB.4 the fault indication output
clr P_INT_Ctrl0, CB_INT_IRQ0IE ; Disable INT0 interrupt
;
inc G_TMB_Delay_Cnt
lda G_TMB_Delay_Cnt
cmp #$7F
beq L_NMI_INT_OPEN
jmp L_BATTERAD_END
;
L_NMI_INT_OPEN:
inv P_IOB_Data, INT_OC ;PB.4 output data 取反
lda #$0
sta G_TMB_Delay_Cnt
;
L_Neg_PROCESS:
lda G_ADC6_Buf
cmp #C_INegtive_Data ;I is negateive?
bcc L_I_NEGTIMVE_STOPMOTO ;I is negateive to L_I_NEGTIMVE_STOPMOTO
jmp L_IAD_PROCESS
L_I_NEGTIMVE_STOPMOTO:
jsr F_Pwm_Clear
set G_BrakeError_Buf,CB_INegtive_Flag ;CB_INegative_Flag=5CH
jmp L_BATTERAD_PROCESS
;
L_IAD_PROCESS:
clr G_BrakeError_Buf,CB_INegtive_Flag ;clear negateive flag
;
L_IAD_PROCESS0:
lda G_ADC6_Buf
cmp #C_Iovre_Data ;I is Over?
bcc L_BATTERAD_PROCESS ; Cy=0 to L_BATTERAD_PROCESS
lda G_Iover_Time
cmp #C_IOver_Time
bcc L_BATTERAD_PROCESS0
lda #C_IOver_Time
sta G_Iover_Time
;
set G_DISP_FLAG,CB_DispIOver_Flag
set G_BrakeError_Buf,CB_IOver_Flag
jmp L_BATTERAD_PROCESS0
;
L_BATTERAD_PROCESS:
lda #0
sta G_Iover_Time
clr G_DISP_FLAG,CB_DispIOver_Flag
clr G_BrakeError_Buf,CB_IOver_Flag
L_BATTERAD_PROCESS0:
lda G_ADC7_Buf ;hlp 0619
cmp #C_BatterOver_Data ;hlp 0619
bcs L_BatterOver_Process
clr G_SYS_Control_Flag,CB_BatterOver_Flag
tst G_BrakeError_Buf,CB_BatterLow_Flag
beq L_BATTERAD_PROCESS01
lda G_ADC7_Buf
cmp #C_BatterLowStart_Data
bcs L_BATTERAD_END0
jmp L_BATTERAD_END
L_BATTERAD_PROCESS01:
lda #0
sta G_BatterLowStart_Time
lda G_ADC7_Buf
cmp #C_BatterMin_Data
bcc L_BATTERAD_LOW
cmp #C_BatterLow_Data
bcs L_BATTERAD_END0
lda G_Batter_Low_Time
cmp #C_BatterLow_Time
bcc L_BATTERAD_END
L_BATTERAD_LOW: ;;hlp 05/29
lda #C_BatterLow_Time
sta G_Batter_Low_Time
;
.IFDEF U_UnderVCheck
set G_BrakeError_Buf,CB_BatterLow_Flag
.ENDIF
set G_DISP_FLAG,CB_DispBatterLow_Flag
jmp L_BATTERAD_END
;
L_BATTERAD_END0:
lda #0
sta G_Batter_Low_Time
clr G_BrakeError_Buf,CB_BatterLow_Flag
clr G_DISP_FLAG,CB_DispBatterLow_Flag
L_BATTERAD_END:
rts
;
L_BatterOver_Process:
set G_SYS_Control_Flag,CB_BatterOver_Flag
jmp L_BATTERAD_END0
;****************************************
; Applied Body : SPMC65P2404A
; Firmware version: V1.0
; Programer :
; Date : 2006/09/15
; Description : analog speed command fetch open loop control
; Hardware Connect: SPMC65 BLDC demo board
; IDE Version : v1.6.8
; BODY Version : v1.0.2A
;****************************************
F_Speed_Control:
tst G_BrakeError_Buf,CB_BatterLow_Flag
beq L_Speed_Control0
jsr F_Pwm_Clear
;
jmp L_Speed_Control_End
;
L_Speed_Control0:
tst G_Monitor,CB_MotorBrake_Flag
beq L_Speed_Control1
;
jsr F_StopMotor_Control
jmp L_Speed_Control_End
;
L_Speed_Control1: ; hlp 05/29
tst G_BrakeError_Buf,CB_SpeedErrorFlag
beq L_Speed_Control2
jsr F_Pwm_Clear
jmp L_Speed_Control_End
L_Speed_Control2: ; hlp 05/29
tst G_BrakeError_Buf,CB_MotorStopUp_Flag
beq L_Slect_Speed_Mode
;
jsr F_StopMotor_Control
jsr F_ClearStopupFlag_Control
jmp L_Speed_Control_End
;
L_Slect_Speed_Mode:
lda G_SpeedMode
beq L_Speed_Change_Mode
jmp L_Speed_Constant_Mode
;
;
L_Speed_Change_Mode:
sec
lda G_ADC4_Buf
sbc G_Speed_AD_Old
cmp #C_ConstantSpeed_AD
bcc L_Constant_Speed_Delay
lda G_Speed_AD_Old
sec
sbc G_ADC4_Buf
cmp #C_ConstantSpeed_AD
bcc L_Constant_Speed_Delay
jmp L_Change_Speed
;
L_Constant_Speed_Delay:
lda G_5S_Count
cmp #C_ConstantSpeed_Time
bcc L_Change_Speed0
lda #0
sta G_5S_Count
lda G_ADC4_Buf
cmp #C_SpeedLmit_AD
bcc L_Speed_Change_Mode_End
.IFDEF U_ConsSpeed
lda #1;
sta G_SpeedMode
set G_DISP_FLAG,CB_DispConstant_Flag
.ENDIF
lda G_POS_fifo
sta G_SpeedComand
lda G_POS_fifo+1
sta G_SpeedComand+1
L_Speed_Change_Mode_End:
rts
;
L_Speed_Constant_Mode: ; speed constant mode
lda #1
sta G_SpdCtrl_Cnt ; speed constant mode,PWM control is speed time
tst G_Monitor,CB_ModeChange_Flag
beq L_Speed_Constant ; no
lda G_ADC4_Buf ; yes ,change the speed
cmp #80h ;C_LoosenHandGrip_AD
bcs L_Speed_Change
rts
;
;
L_Speed_Constant:
lda G_ADC4_Buf
cmp #C_LoosenHandGrip_AD ; loosen the handgirp ?
bcc L_Set_Speed_Change_Flag ; yes
rts
;
;
L_Set_Speed_Change_Flag: ; set loosen the handgrip flag
set G_Monitor,CB_ModeChange_Flag
rts
;
;
L_Speed_Change: ; pwm control is speed AD command
lda #0
sta G_SpeedMode ; change to speed change mode
clr G_Monitor,CB_ModeChange_Flag
L_Speed_Change_End: ; clear loosen the handgrip flag
rts
;
;
L_Change_Speed:
lda #0 ; Clear cruise delay time
sta G_5S_Count
;
L_Change_Speed0:
clr G_DISP_FLAG,CB_DispConstant_Flag ; Clear cruise flag
clr G_Monitor,CB_ModeChange_Flag
lda #0
sta G_SpdCtrl_Cnt
sta G_Speed_AD_Buf+1
;
lda G_ADC4_Buf ; save the old AD
sta G_Speed_AD_Old
cmp #C_SpeedMax_AD
bcs L_AD_limit_max
cmp #C_SpeedLmit_AD ;0x38
bcc L_AD_StopMotor_L1
lda G_ADC4_Buf
sec
sbc #35h
sta G_Speed_AD_Buf
;
asl G_Speed_AD_Buf
rol G_Speed_AD_Buf+1
asl G_Speed_AD_Buf
rol G_Speed_AD_Buf+1
;
sec
lda #FFH
sbc G_Speed_AD_Buf
sta G_PhaseCmd
lda #0Fh
sbc G_Speed_AD_Buf+1
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -