📄 f6.asm
字号:
btfss STATUS,C
goto PI1
bsf SEC1
clrf C_SEC ; 记满20是1秒
PI1:
;正在接收标志是否超时
btfss RECEIVING
goto PT2
;正在接收
incf OVERTIME,F
movlw RevTime
subwf OVERTIME,W ;OVERTIME-RevTime->W
btfss STATUS,C
goto PT2
bcf RECEIVING ;若ByteReceived<>0持续 RevTime则中断该次通信
clrf OVERTIME
clrf ByteReceived
call TxmtFinished
PT2:
; ******************************************************************************************
bsf STATUS,RP0 ; select page 1
bcf PIE1,TMR1IE ; disable Timer1中断
bcf STATUS,RP0 ; select page 1
movlw RB0_I1
movwf I
movlw I_sample_low
movwf J
movlw D'6'
movwf tempCount
bcf PCLATH,3 ; Prog page 0
call S1_S0
bsf PCLATH,3 ; Prog page 1
bsf STATUS,RP0 ; select page 1
bsf PIE1,TMR1IE ; enable Timer1中断
bcf STATUS,RP0 ; select page 1
;累加I
call DataAdded_I
;累加V
call DataAdded_V
incf VI_CSamp,F
btfsc CorrCH2
goto RI1
btfsc DetectBatt
goto TV1
;------------------------------------------
ACTION:
btfsc Charging
goto Charg
btfsc disCharging
goto DisCharg
;
goto PT_OUT ;没有流程
; --------------------------------------------------------------------
Charg:
bsf _BANK1
movf J_H,W
bcf _BANK1
movwf TEMP
movlw 0x48
xorwf TEMP,W
btfsc _Z
goto CG ; 恒压电压,
movlw 0x4A
xorwf TEMP,W
btfsc _Z
goto ConvertV ; 截止电压
goto CG ; 谁也不是
ConvertV:
bsf _BANK1
movf ConstantV_HI,W
subwf V_Waveform3,W ; 比较大小
bcf _BANK1
btfss _Z
goto CA4
;V_Waveform3 = ConstantV_HI
bsf _BANK1
movf ConstantV_MID,W
subwf V_Waveform2,W ; 比较大小
bcf _BANK1
btfsc _Z
goto CNM
btfsc _C
goto CompleteCharge2
goto CA4
CNM:
;V_Waveform2 >= ConstantV_MID
bsf _BANK1
movf ConstantV_LOW,W
subwf V_Waveform1,W ; 比较大小
bcf _BANK1
btfss _Z
goto CNN
goto CompleteCharge2
CNN:
btfsc _C
goto CompleteCharge2
goto CA4
;不是化成(截止电压)
CG:
movlw StartDelay
subwf SecsPassed,W
btfss _C
goto CA2
btfss Pass_1s ;StartDelay之后,每秒判一次
goto CA2
bcf Pass_1s
bsf STATUS,RP0
movf I_Waveform3,W
bcf STATUS,RP0
btfss _Z
goto CA3
bsf STATUS,RP0
movf ChargeTermI_MID,W
subwf I_Waveform2,W ; Δ = I_Waveform2 - ChargeTermI_MID
bcf STATUS,RP0
btfsc _Z
goto CompleteCharge
btfsc _C
goto CA3
;小于截止电流
;先认为第二字节相等即可,以后也要判Δ在一个范围内
CompleteCharge:
incf C_LowerTerm,F
movlw C_arrived
subwf C_LowerTerm,W
btfss _C
goto CA2
CompleteCharge2:
; ---- 占空比置为 0
call ClosePWM
clrf C_LowerTerm
bsf CH
bsf DISCH
bsf RedLed ;有电池亮桔灯
bsf GreenLed
bcf CMD_Charge ;写回24c02
bcf Charging
; bsf Standing ;置静置标志
clrf Minutes
goto PT_OUT
; 大于截止电流,继续判断 Δ 在那个范围内
CA3:
clrf C_LowerTerm
;实测电流跟随化成电流
CA2:
;到截止/恒压电压?
bsf _BANK1
movf ConstantV_HI,W
bcf _BANK1
subwf V_sample_high,W ; 比较大小
btfss _Z
goto CV
;V_sample_high = ConstantV_HI
bsf _BANK1
movf ConstantV_MID,W
bcf _BANK1
subwf V_sample_middle,W ; 比较大小
btfss _Z
goto CV
;V_sample_middle = ConstantV_MID
bsf _BANK1
movf ConstantV_LOW,W
bcf _BANK1
subwf V_sample_low,W ; 比较大小
btfss _Z
goto CAA
goto PT_OUT
CAA:
btfsc _C
goto FineDec ;略大于4.2V:微调减小
goto FineInc ;略小于4.2V:微调增大
;恒压控制
CV:
btfsc _C
goto DEC_DutyCycle ;大于4.2V:粗调减小
;小于4.2V:恒流控制
CA4:
bsf STATUS,RP0
movf Current_LOW,W
bcf STATUS,RP0
movwf KeepValue_LOW
bsf STATUS,RP0
movf Current_MID,W
bcf STATUS,RP0
movwf KeepValue_MID
bsf STATUS,RP0
movf Current_HI,W
bcf STATUS,RP0
movwf KeepValue_HI
goto JUDGE
; --------------------------------------------------------------------
; 放电
DisCharg:
bsf STATUS,RP0
movf Current_LOW,W
bcf STATUS,RP0
movwf KeepValue_LOW
bsf STATUS,RP0
movf Current_MID,W
bcf STATUS,RP0
movwf KeepValue_MID
bsf STATUS,RP0
movf Current_HI,W
bcf STATUS,RP0
movwf KeepValue_HI
SC1:
; 是否小于截止电压?
movlw V_StartDelay
subwf SecsPassed,W
btfss _C
goto SC3
; btfss Pass_1s ;StartDelay之后,每秒判一次
; goto JUDGE
; bcf Pass_1s
bsf STATUS,RP0
movf DisCHTermV_HI,W
subwf V_Waveform3,W
bcf STATUS,RP0
btfss _Z
goto SC0
bsf STATUS,RP0
movf DisCHTermV_MID,W
subwf V_Waveform2,W
bcf STATUS,RP0
btfsc _Z
goto CompleteDisC
btfsc _C
goto SC3
goto CompleteDisC
SC0: btfsc _C
goto SC3
CompleteDisC:
;V_sample小于截止电压
;先认为第二字节相等即可,以后也要判Δ在一个范围内
call ClosePWM
bsf CH
bsf DISCH
bsf RedLed ;有电池亮桔灯
bsf GreenLed
bcf CMD_DisCharge
bcf disCharging
clrf Minutes
goto PT_OUT
SC3:
;是放电流程,实测电流跟随放电电流
clrf C_LowerTerm
; --------------------------------------------------------------------
JUDGE:
movf KeepValue_HI,W
subwf I_sample_high,W ; 比较大小
btfsc _Z
goto AT30
btfsc _C
goto AT20B
;I_sample_high小
; movf I_sample_high,W
; subwf KeepValue_HI,W
; movwf insd3
; movlw D'2'
; subwf insd3,W
; btfsc _C
; goto INC_DutyCycle ;高字节误差 >= 2
;W=1
movf I_sample_low,W
subwf KeepValue_LOW,W
movwf insd1
btfsc _C
goto JG10
movlw D'1'
subwf KeepValue_MID,F
btfsc _C
goto JG10
movlw D'1'
subwf KeepValue_HI,F
JG10:
movf I_sample_middle,W
subwf KeepValue_MID,W
movwf insd2
btfsc _C
goto JG20
movlw D'1'
subwf KeepValue_HI,F
JG20:
movf I_sample_high,W
subwf KeepValue_HI,W
movwf insd3
btfss _Z
goto INC_DutyCycle ;高字节误差 >= 2
movf insd2,W
goto AT30A
;I_sample_high大
AT20B:
movf KeepValue_LOW,W
subwf I_sample_low,W
movwf insd1
btfsc _C
goto JG30
movlw D'1'
subwf I_sample_middle,F
btfsc _C
goto JG30
movlw D'1'
subwf I_sample_high,F
JG30:
movf KeepValue_MID,W
subwf I_sample_middle,W
movwf insd2
btfsc _C
goto JG40
movlw D'1'
subwf I_sample_high,F
JG40:
movf KeepValue_HI,W
subwf I_sample_high,W
movwf insd3
btfss _Z
goto DEC_DutyCycle ;高字节误差 >= 2
movf insd2,W
goto AT30B1
AT30:
movf KeepValue_MID,W
subwf I_sample_middle,W ; 比较大小
btfsc _Z
goto AT40
btfsc _C
goto AT30B
;I_sample_middle小
AT30C:
movf I_sample_low,W
subwf KeepValue_LOW,W ; KeepValue_LOW - I_sample_low
movwf insd1 ; backup
btfsc _C
goto JD30
incf I_sample_middle,W
goto JD31
JD30:
movf I_sample_middle,W
JD31:
subwf KeepValue_MID,W ; 比较大小
movwf insd2 ; backup
AT30A:
btfsc _Z
goto AT40A ; insd2 = 0
;
sublw high FineADJ ; FineADJ(高字节) - Δ
btfss _Z
goto AT3_3
movf insd1,W
sublw low FineADJ ; FineADJ(高字节) - Δ
AT3_3:
btfsc _C
goto FineInc ; FineADJ >= insd2,微调
; FineADJ < insd2,粗调,
; goto INC_DutyCycle
btfss TopPoint
goto INC_DutyCycle
goto PT_OUT
;I_sample_middle大
AT30B:
movf KeepValue_LOW,W
subwf I_sample_low,W ; Δ = I_sample_low - KeepValue_LOW
movwf insd1 ; backup
btfsc _C
goto JD32
incf KeepValue_MID,W
goto JD33
JD32:
movf KeepValue_MID,W
JD33:
subwf I_sample_middle,W ; 比较大小
movwf insd2 ; backup
AT30B1:
btfsc _Z
goto AT40B ; insd2 = 0
;
sublw high FineADJ ; FineADJ(高字节) - Δ
btfss _Z
goto AT3_4
movf insd1,W
sublw low FineADJ ; FineADJ(高字节) - Δ
AT3_4:
btfsc _C
goto FineDec ; FineADJ >= insd2,微调
; FineADJ < insd2,粗调,
goto DEC_DutyCycle
AT40:
movf KeepValue_LOW,W
subwf I_sample_low,W ; Δ = I_sample_low - KeepValue_LOW
movwf insd1 ; backup
btfsc _Z
goto PT_OUT ; Δ = 0
btfsc _C
goto AT40B
;I_sample_low小
comf insd1,W
addlw D'1'
movwf insd1
AT40A:
movf insd1,W
sublw Accord ; Accord - Δ
btfsc _C
goto PT_OUT ; Accord >= Δ
goto FineInc ; Accord < Δ
;I_sample_low大
AT40B:
movf insd1,W
sublw Accord ; Accord - Δ
btfsc _C
goto PT_OUT ; Accord >= Δ
; goto FineDec ; Accord < Δ
; -----------------------------------------------
;占空比微减
FineDec:
movf ResistNet,W
btfsc _Z
goto FD3 ; =0,要向DC借位
decf ResistNet,F
movlw B'00000011'
andwf ResistNet,F
btfsc ResistNet,0
goto FD0
bsf STATUS,RP0
bcf TRISA,0
bcf STATUS,RP0
goto FD1
FD0:
bsf STATUS,RP0
bsf TRISA,0
bcf STATUS,RP0
FD1:
btfsc ResistNet,1
goto FD2
bsf STATUS,RP0
bcf TRISA,1
bcf STATUS,RP0
goto PT_OUT
FD2:
bsf STATUS,RP0
bsf TRISA,1
bcf STATUS,RP0
goto PT_OUT
FD3:
movlw B'00000011'
movwf ResistNet
bsf STATUS,RP0 ; Bank 1
bsf R46_TRIS
bsf R47_TRIS
bcf STATUS,RP0 ; bank 0
goto DEC_DutyCycle ;减高十位
; -----------------------------------------------
;占空比微增
FineInc:
incf ResistNet,F
movlw B'00000011'
andwf ResistNet,F
movf ResistNet,W
btfsc _Z
goto FI3 ; C=1,要向DC进位
btfsc ResistNet,0
goto FI0
bsf STATUS,RP0
bcf TRISA,0
bcf STATUS,RP0
goto FI1
FI0:
bsf STATUS,RP0
bsf TRISA,0
bcf STATUS,RP0
FI1:
btfsc ResistNet,1
goto FI2
bsf STATUS,RP0
bcf TRISA,1
bcf STATUS,RP0
goto PT_OUT
FI2:
bsf STATUS,RP0
bsf TRISA,1
bcf STATUS,RP0
goto PT_OUT
FI3:
bsf STATUS,RP0 ; Bank 1
bsf R46_TRIS
bsf R47_TRIS
bcf STATUS,RP0 ; bank 0
goto INC_DutyCycle
; --------------------------------------------------------------------
DEC_DutyCycle:
bcf TopPoint
movlw D'1'
subwf PWM_LOW,F ;dec PWM_HI
btfsc STATUS,C
goto RI1 ; C=1:>=
;
movf PWM_HI,W
btfsc STATUS,Z
goto RR1
decf PWM_HI,F
goto RI1
RR1:
clrf PWM_LOW ;00 00000000送给CCPR1L两次
; bcf TopPoint
goto RI1
INC_DutyCycle:
movlw D'1'
addwf PWM_LOW,F
btfss STATUS,C
goto RI1
incf PWM_HI, F ;inc PWM_HI
;now load the values into the Duty Cycle registers
btfss PWM_HI,2
goto RI1
;PWM_HI=0
movlw 0x03 ;11 11111111送给CCPR1L两次
movwf PWM_HI
movlw 0xFF
movwf PWM_LOW ;11 11111111
bsf TopPoint
goto RI1
; --------------------------------------------------------------------
TV1:
movf PWM_LOW,W
btfss _Z
goto TV1A
movf PWM_HI,W
btfss _Z
goto TV1A
bsf STATUS,RP0
movf V_Start_LOW,W
bcf STATUS,RP0
btfss _Z
goto DT6
bsf STATUS,RP0
movf V_Start_MID,W
bcf STATUS,RP0
btfss _Z
goto DT6
bsf STATUS,RP0
movf V_Start_HI,W
bcf STATUS,RP0
btfss _Z
goto DT6
movf V_sample_low,W
bsf STATUS,RP0
movwf V_Start_LOW
bcf STATUS,RP0
movf V_sample_middle,W
bsf STATUS,RP0
movwf V_Start_MID
bcf STATUS,RP0
movf V_sample_high,W
bsf STATUS,RP0
movwf V_Start_HI
bcf STATUS,RP0
goto DT6
TV1A:
movf PWM_LOW,W
xorlw low HalfScope
btfss _Z
goto DT6
movf PWM_HI,W
xorlw high HalfScope
btfss _Z
goto DT6
movf V_sample_low,W
bsf STATUS,RP0
movwf V_Half_LOW
bcf STATUS,RP0
movf V_sample_middle,W
bsf STATUS,RP0
movwf V_Half_MID
bcf STATUS,RP0
movf V_sample_high,W
bsf STATUS,RP0
movwf V_Half_HI
bcf STATUS,RP0
DT6:
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -