📄 f6.asm
字号:
bsf STATUS,RP0
movf I_Waveform3,W
bcf STATUS,RP0
btfss _Z
goto IT1
bsf STATUS,RP0
movf I_Waveform2,W
bcf STATUS,RP0
sublw high I_Code ;high I_Code-I_sample_middle->W
btfsc _Z
goto DT9
btfss _C
goto IT1
clrf C_IVariety
goto DT9 ; C=1:>
;I_Waveform2 > I_Code
IT1:
incf C_IVariety,F
movlw D'10'
subwf C_IVariety,W
btfss _C
goto DT9
;连续十次满足电流大于起始电流,认为有电池
clrf C_IVariety
DT7:
bcf DetectBatt
bsf BattOn
bsf RedLed ;有电池亮桔灯
bsf GreenLed
goto PT_OUT
DT9:
btfss Rise_Down
goto Rise_INC
Down_DEC:
movlw D'1'
subwf PWM_LOW,F
btfsc STATUS,C
goto RRA
;
movf PWM_HI,W
btfsc STATUS,Z
goto RR0
decf PWM_HI,F
goto RI1
RR0:
clrf PWM_LOW ;00 00000000送给CCPR1L两次
bcf Rise_Down ;做上升波形
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 BATT
RRA:
btfss _Z
goto RI1
movf PWM_HI,W
btfss _Z
goto RI1
goto RR0
Rise_INC:
movlw D'1'
addwf PWM_LOW,F
btfsc STATUS,C
incf PWM_HI, F ;inc PWM_HI
;now load the values into the Duty Cycle registers
movlw high TriScope
subwf PWM_HI,W
btfss _Z
goto RI1
movlw low TriScope
subwf PWM_LOW,W
btfss _Z
goto RI1
;PWM_LOW =low TriScope
bsf Rise_Down ;做下降波形
movf V_sample_low,W
bsf STATUS,RP0
movwf V_Full_LOW
bcf STATUS,RP0
movf V_sample_middle,W
bsf STATUS,RP0
movwf V_Full_MID
bcf STATUS,RP0
movf V_sample_high,W
bsf STATUS,RP0
movwf V_Full_HI
bcf STATUS,RP0
;对是否有电池的电压判断
BATT:
;高点与中点电压比较
bsf STATUS,RP0
movf V_Full_HI,W
subwf V_Half_HI,W
btfsc _Z ;
goto HighEqual
btfsc _C ;
goto Half_Large
Full_Large:
movf V_Half_LOW,W
subwf V_Full_LOW,W
bcf STATUS,RP0
movwf insd1
bsf STATUS,RP0
btfsc _C
goto OL1
incf V_Half_MID,W
goto OL2
OL1:
movf V_Half_MID,W
OL2:
subwf V_Full_MID,W
bcf STATUS,RP0
movwf insd2
bsf STATUS,RP0
btfsc _C
goto OL3
incf V_Half_HI,W
goto OL4
OL3:
movf V_Half_HI,W
OL4:
subwf V_Full_HI,W
bcf STATUS,RP0
movwf insd3
; bsf STATUS,RP0
Compare:
;变化量放到 insd3,insd2,insd1
movf insd3,W
btfss _Z
goto RI1 ; 最高字节不为零,直接跳到DT5
movf insd2,W
btfsc _Z
goto DT4 ;Δ<1mV
sublw high V_Region ;电压的变化量与额定值比较
btfsc _Z
goto DT4
btfsc _C
goto DT4 ;Δ<1mV
goto RI1
Half_Large:
movf V_Full_LOW,W
subwf V_Half_LOW,W
bcf STATUS,RP0
movwf insd1
bsf STATUS,RP0
btfsc _C
goto OL5
incf V_Full_MID,W
goto OL6
OL5:
movf V_Full_MID,W
OL6:
subwf V_Half_MID,W
bcf STATUS,RP0
movwf insd2
bsf STATUS,RP0
btfsc _C
goto OL7
incf V_Full_HI,W
goto OL8
OL7:
movf V_Full_HI,W
OL8:
subwf V_Half_HI,W
bcf STATUS,RP0
movwf insd3
goto Compare
HighEqual:
movf V_Full_MID,W
subwf V_Half_MID,W
btfsc _Z ;
goto DT4
btfsc _C ;
goto Half_Large
goto Full_Large
; ------------------------------------------
DT4:
bsf STATUS,RP0
movf V_Start_HI,W
subwf V_Half_HI,W
btfsc _Z ;
goto HighEqual2
btfsc _C ;
goto Half_Large2
Start_Large:
movf V_Half_LOW,W
subwf V_Start_LOW,W
bcf STATUS,RP0
movwf insd1
bsf STATUS,RP0
btfsc _C
goto OL9
incf V_Half_MID,W
goto OL10
OL9:
movf V_Half_MID,W
OL10:
subwf V_Start_MID,W
bcf STATUS,RP0
movwf insd2
bsf STATUS,RP0
btfsc _C
goto OL11
incf V_Half_HI,W
goto OL12
OL11:
movf V_Half_HI,W
OL12:
subwf V_Start_HI,W
bcf STATUS,RP0
movwf insd3
Compare2:
;变化量放到 insd3,insd2,insd1
movf insd3,W
btfss _Z
goto RI1 ; 最高字节不为零,直接跳到DT5
movf insd2,W
btfsc _Z
goto DT3 ;Δ<1mV
sublw high V_Region ;电压的变化量与额定值比较
btfsc _Z
goto DT3
btfsc _C
goto DT3 ;Δ<1mV
goto RI1
Half_Large2:
movf V_Start_LOW,W
subwf V_Half_LOW,W
bcf STATUS,RP0
movwf insd1
bsf STATUS,RP0
btfsc _C
goto OL13
incf V_Start_MID,W
goto OL14
OL13:
movf V_Start_MID,W
OL14:
subwf V_Half_MID,W
bcf STATUS,RP0
movwf insd2
bsf STATUS,RP0
btfsc _C
goto OL15
incf V_Start_HI,W
goto OL16
OL15:
movf V_Start_HI,W
OL16:
subwf V_Half_HI,W
bcf STATUS,RP0
movwf insd3
goto Compare2
HighEqual2:
movf V_Start_MID,W
subwf V_Half_MID,W
btfsc _Z ;
goto DT3
btfsc _C ;
goto Half_Large2
goto Start_Large
DT3:
bcf STATUS,RP0
bsf STATUS,RP0
movf V_Waveform3,W
bcf STATUS,RP0
btfss _Z
goto DT7 ;有电池
movlw high V_Code
bsf STATUS,RP0
; movf ChargeTermI_MID,W
subwf V_Waveform2,W
bcf STATUS,RP0
btfsc _C
goto DT7 ;有电池
;电压低:电流线没接
; ****************************************************************
RI1:
clrf T1use ;T1use = mask for pw1dcl
movf PWM_HI,W
movwf DC_HI
movf PWM_LOW,W
movwf DC_LOW
rrf DC_HI,F
rrf DC_LOW,F ;get duty cyl. hi byte
rrf T1use,F ;rotate into lo byte
rrf DC_HI,F ;repeat for 2nd lsb
rrf DC_LOW,F
rrf T1use,F ;
rrf T1use,F ;
rrf T1use,F ;bit5,bit4
movlw B'00110000' ;mask ccp1X(bit5),ccp1Y(bit4) bits
andwf T1use,F
movlw B'00001100'
iorwf T1use,F ;CCP1CON byte ready
;This code segment ensure that all PWM values (period and duty cycle)
;are updated at the same time. This is done by ensuring that the Timer
;is at least PWM_WIN (0Dh) cycles before the PR1 value
;(PR1 - PWM_WIN > TMR1).If not a “glitch” could occur in the PWM wave
;form. When only the 1st duty cycle register is latched for this PWM
;cycle, and the following PWM periodwill latch the 2nd duty cycle
;register.
PWM1_UD:
MOVF TMR2, W ;Load W reg. with Timer1 value
SUBWF PR2, W ;PR1 - TMR1 -> W reg.
sublw PWM_WIN ;Check if Timer1 is about to overflow
;PWM_WIN - W
btfss STATUS,C ;PR2 - TMR2 =< PWM_WIN ?
GOTO PU ;yes,Overflow would have occurred during
;PWM updates, Delay a few cycles
nop
nop
nop
nop
nop
nop
nop
nop
PU:
;在TMR2IF=1之前更新CCPR1L、CCP1CON,when TMR1=PR2,the new DC value latched
bcf INTCON,GIE
movf DC_LOW,W
movwf CCPR1L ;Loaded in duty cycle buffer
movf T1use,W
movwf CCP1CON ;Your New PWM LSB
bsf INTCON,GIE
PT_OUT:
bcf TimerArrived
return
;----------------------------------------------------------
Average:
movf VI_CSamp,W
btfsc _Z
goto FT2 ;=0
movlw Iaddend1
movwf I
movlw AARGB3
movwf J
movlw D'4'
movwf tempCount
bcf PCLATH,3 ; Prog page 0
call S1_S0
bsf PCLATH,3 ; Prog page 1
movf VI_CSamp,W
movwf BARGB1
clrf BARGB0
call FXD3216U
movlw AARGB3
movwf I
movlw I_Waveform1
movwf J
movlw D'3'
movwf tempCount
bcf PCLATH,3 ; Prog page 0
call S0_S1
bsf PCLATH,3 ; Prog page 1
;4字节除以1字节,应该只剩3字节
FT2:
movf VI_CSamp,W
btfsc _Z
goto FT3 ;=0
movlw Vaddend1
movwf I
movlw AARGB3
movwf J
movlw D'4'
movwf tempCount
bcf PCLATH,3 ; Prog page 0
call S1_S0
bsf PCLATH,3 ; Prog page 1
movf VI_CSamp,W
movwf BARGB1
clrf BARGB0
call FXD3216U
movlw AARGB3
movwf I
movlw V_Waveform1
movwf J
movlw D'3' ;4字节除以1字节,应该只剩3字节
movwf tempCount
bcf PCLATH,3 ; Prog page 0
call S0_S1
bsf PCLATH,3 ; Prog page 1
FT3:
return
; -----------------------------------------------------------------------------------
Transmit:
movlw 0x80
iorwf CCODE,F
call CHECKSUM
movwf TEMP
movlw DI0
addwf SBL,W
movwf FSR
movf TEMP,W
movwf INDF
incf FSR,F
movlw 0x16
movwf INDF
; movlw D'9' ;FE,68,A0,A1,A2,CODE,L,CS,16
movlw D'8' ;68,A0,A1,A2,CODE,L,CS,16
addwf SBL,W
movwf ByteNumber ;发送字节数
; 发送
bsf STATUS,RP0 ; select page 1
bcf PIE1,RCIE ;关闭接收中断
bcf STATUS,RP0 ; select page 1
bcf RCSTA,CREN ;不允许连续接收
; movlw (SERIALBUFFER-1)
movlw SERIALBUFFER
movwf FSR
SEND1:
clrwdt
bsf STATUS,RP0 ; SFR bank 0
bsf TXSTA,TXEN ;打开发送允许位
bcf STATUS,RP0 ; SFR bank 0
movf INDF,W
call GenParity ;计算偶校验位
bsf STATUS,RP0 ; SFR bank 1
bcf TXSTA,TX9D
btfsc PARITY,0
bsf TXSTA,TX9D
bcf STATUS,RP0 ; SFR bank 0
bcf Enable485 ;如果是485,打开485发送
movf INDF,W
movwf TXREG
btfss PIR1,TXIF
goto $-1
call Delay1ms ;用延时1ms代替字节间延时
incf FSR,F
decfsz ByteNumber,F
goto SEND1
bsf STATUS,RP0 ; SFR bank 0
btfss TXSTA,TRMT
goto $-1
bcf STATUS,RP0 ; SFR bank 0
bcf PCLATH,3 ; Prog page 0
call DELAY10ms
bsf PCLATH,3 ; Prog page 0
; bcf RECEIVING ;若ByteReceived<>0持续 RevTime则中断该次通信
clrf OVERTIME
clrf ByteReceived
call TxmtFinished
bcf PCLATH,3 ; Prog page 0
goto OK_OUT
TxmtFinished:
movf RCREG,W
BCF RCSTA,CREN
BCF RCSTA,OERR ;清错误标志
BSF RCSTA,CREN
bcf RCSTA,FERR
bsf Enable485 ; 处于接收状态
bsf STATUS,RP0 ; SFR bank 0
bcf TXSTA,TXEN ;打开发送允许位
bsf PIE1,RCIE ; 打开接收中断
bcf STATUS,RP0 ; SFR bank 0
return
Delay1ms:
; 5.0688MHz crystal,延时1.83ms,周期数 T=D'3' tc=2320,delay=1.83ms
movlw D'3'
movwf J
movlw 0xFF
movwf I
DY1:
decfsz I,F ;1/2tc
goto DY1
clrwdt
decfsz J,F
goto DY1
nop
return
; -----------------------------------------------------------------------------------
;计算校验和(结果存放A中)
CHECKSUM:
movlw D'6'
addwf SBL,W
movwf J
movlw SERIALBUFFER
movwf FSR
clrw
CK:
addwf INDF,W
incf FSR,F
decfsz J,F
goto CK
return
;*********************************************************************************************************
; Generate Parity for the Value in WREG
;
; The parity bit is set in _parityBit
; Common Routine For Both Transmission & Reception
;
;*********************************************************************************************************
GenParity:
movwf RevTemp ;save data
movlw .8
movwf J
clrw
Parityloop:
btfsc RevTemp,0 ;put data in carry bit
xorlw 01h ;parity calculated by XORing all data bits
rrf RevTemp,F
decfsz J,F
goto Parityloop ;decrement count
; Parity bit is in Bit 0 of EvenUse1
;
; 偶校验,IF 偶数个1,parityBit=0
bsf STATUS,RP0 ; SFR bank 1
movwf PARITY
bcf STATUS,RP0
return
;*********************************************************************************************************
#include <MATH2.ASM>
;Debug record
; 12.16 更新PWM_HI,PWM_LOW时,40%V不成功是因为电压的判断出错
; 12.20 为什么进入化成电流就到最大值?因为CH改为输出0(原为高阻态)
; 1.8 状态回送慢,并不是因为电池判断慢,1 是原来的200mA保持一分钟,
; 2 是流程的PWM正从小上升,却被判为到了截止电流
; 3 to change:if not corrected, not start Detect procedure
; 1.9 1.发充电命令40秒之后,若电流线还未夹上,则会转入静置流程。
; 2.关闭PWM的步骤:清CCPR1L,等待CCPR1H清零,清PWM_LOW、PWM_HI,清CCP1CON
; PWM输出腿置低,清TMR2、T2CON
; 手工夹放电线,因打火出现大电流(从静置向放电转换的一瞬间),具体数据见:充-静-放.txt
; 3.CHxOS总读错:SPIRX的wordlen入口要求与SPIDX不一样;给SPI发的是写(spi.7=1)
; 1.17 1.correct the module DataAdded bug.
; 2.correct charging can't terminate.
; 1.20 1.注意:指标值的中字节不能有00H或FFH
; 2.ClosePWM 时没有关闭R46,R47,导致有小电流
; 3.FineINC时,对PORTA重新初始化,导致CH,DISCH被关闭
; 4.Read_I没有等待刷新就读,在10A充放电时,高字节有时读错(01H->02H)
;
; 2.7 1.delete PWM1_UD:
; 2.the most fast sample
; 2.28 1.In IDE,use Open project,not Recent workspace,can display color key words.
; 3.3 1.P_TIMER中,goto PT2误作goto PM2,导致WorkFlag被破坏
; 3.4 1.use stopwatch test:P-Timer:9.03ms;P_SEC:1.00284S;P_MIN:60.002S
; 2.停止了静置,不能再用启动命令启动它
; 3.21 1.增大判有电池的电压阀值,这样改了之后,上电桔灯亮一下可能会消失,因为以前就是电压判据满足了导致亮的。
; 2.读CH1,CH2失调值时,未清外存的存储值
; 3.以前漏帧:超时的时限过长
;
;
END ; directive indicating the end of code
;*********************************************************************************************************
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -