?? cmd6.asm
字號:
movlw D'5'
movwf SBL
goto PRE_DELAY
W_CHxOS:
movf TEMP,W ; command to write to chXos register(通道1失調校正寄存器)
movwf spi ; call spi control write to ch1os reg
movlw D'8' ; number of bits
movwf wordlen
CALL SPIDX ; output outd1 to 7756
return
; -----------------------------------------------------------------------------------
; 通過調整APGAIN來校準通道1
; 給10A電流,應讀出波形值 01020CH
CorrectCH1:
;;;not complete
movlw D'4'
movwf SBL
goto PRE_DELAY
ReadAPGain:
movlw B'00001011' ; command to read apgain register
movwf spi ; call spi control read apgain reg
movlw b'00000010' ; number of bytes to download B'000(5)(4)(3)(2)(1)'
movwf wordlen ; wordlen is 16 bits. Reg is actually 12 bits
CALL SPIRX ; CALL SPI read 16 bit word data will be in
return
W_APGain:
movlw B'10001011' ; command to write to apgain register
movwf spi ; call spi control write to apgain reg
movlw D'16' ; number of bits
movwf wordlen
CALL SPIDX ; output outd1 and outd2 to 7756
return
; -----------------------------------------------------------------------------------
CorrectCH2:
;;;做成百分比可設
bsf CorrCH2
movlw high TriScope
movwf PWM_HI
movlw low TriScope
movwf PWM_LOW ;11 11111111
movlw D'4'
movwf SBL
goto PRE_DELAY
; -----------------------------------------------------------------------------------
; 步進校準
StepCorrect:
bcf isCR_1OS
movlw H'01'
xorwf SDATA,W
btfsc _Z
goto CR_offset
movlw H'02'
xorwf SDATA,W
btfsc _Z
goto CR_vallue
return
CR_offset:
movlw H'01'
xorwf (SDATA+1),W
btfsc _Z
goto CR_offset1
movlw H'02'
xorwf (SDATA+1),W
btfsc _Z
goto CR_offset2
return
CR_offset1: ; correct CH1 offset
bsf isCR_1OS
bsf STATUS,RP0 ; select page 1
bcf PIE1,TMR1IE ; disable Timer1中斷
bcf STATUS,RP0 ; select page 1
;read out APGain
call ReadAPGain
movf insd1,W
movwf (BFIIC+6) ; APGain先保存起來
movf insd2,W
movwf (BFIIC+7)
clrf outd2 ; clear APGain
clrf outd1
call W_APGain
I2C_WR_SUB 0x02, outd1, AT_APGAIN
bsf _BANK1
clrf APGAIN1_LOW
clrf APGAIN1_HI
bcf _BANK1
movf (SDATA+2),W
btfsc _Z
goto CRT0 ;等于0,讀出沒有APGain的波形值即可
;read out CH1OS
movlw B'00001000'
movwf spi ; call spi control read
movlw b'00000001' ; number of bytes to download B'000(5)(4)(3)(2)(1)'
movwf wordlen ; wordlen is 8 bits.
CALL SPIRX ; read out to insd1
btfss (SDATA+2),7
goto set1a
; --------------------------------------------------------------------
; 是負值,使失調值往負的方向走
btfss insd1,5
goto set0a
;失調值為負
movlw B'00011111'
andwf insd1,F ;變正
movf (SDATA+2),W
andlw B'01111111'
addwf insd1,W
iorlw B'00100000' ;置符號位
goto set1b
;失調值為正
set0a:
movf (SDATA+2),W
andlw B'01111111'
subwf insd1,W
btfss _Z
goto FZ1 ;FZ means Fu(負) Zheng(正)
movlw H'00' ;相等
goto set1b
FZ1:
btfsc _C
goto set1b ;老的失調值大
;校正值大于失調值
;如果為負數,應變成有符號的原碼
movwf insd1
comf insd1,F
incf insd1,W
iorlw B'00100000' ;置符號位
goto set1b
; --------------------------------------------------------------------
; 是正值,使失調值往正的方向走
set1a:
btfss insd1,5
goto ZZ1
;失調值為負
movlw B'00011111'
andwf insd1,F ;變正
movf (SDATA+2),W
subwf insd1,W
btfss _Z
goto ZF1
movlw H'00' ;相等
goto set1b
ZF1:
btfsc _C
goto ZF11 ;老的失調絕對值大
;校正絕對值大于失調絕對值:減完后變正值了。例:-3減去4=+1
movf insd1,W
subwf (SDATA+2),W
goto set1b
ZF11:
iorlw B'00100000' ;置符號位
goto set1b
ZZ1:
movf (SDATA+2),W
addwf insd1,W
set1b:
movwf outd1
movlw B'10001000'
movwf TEMP
call W_CHxOS
I2C_WR_SUB 0x01, outd1, AT_CH1OS ; 失調值寫入外存
goto CRT0 ;等于0,讀出沒有APGain的波形值即可
CR_offset2: ; correct CH2 offset
bcf isCR_1OS
bsf STATUS,RP0 ; select page 1
bcf PIE1,TMR1IE ; disable Timer1中斷
bcf STATUS,RP0 ; select page 1
movf (SDATA+2),W
btfsc _Z
goto CRT1 ;等于0,讀出當前微調電阻下的波形值即可
;read out CH2OS
movlw B'00001001'
movwf spi ; call spi control read
movlw b'00000001' ; number of bytes to download B'000(5)(4)(3)(2)(1)'
movwf wordlen ; wordlen is 8 bits.
CALL SPIRX ; read out to insd1
btfss (SDATA+2),7
goto set2a
; --------------------------------------------------------------------
; 是負值,使失調值往負的方向走
btfss insd1,5
goto set3a
;失調值為負
movlw B'00011111'
andwf insd1,F ;變正
movf (SDATA+2),W
andlw B'01111111'
addwf insd1,W
iorlw B'00100000' ;置符號位
goto set2b
;失調值為正
set3a:
movf (SDATA+2),W
andlw B'01111111'
subwf insd1,W
btfss _Z
goto FZ2
movlw H'00' ;相等
goto set2b
FZ2:
btfsc _C
goto set2b ;老的失調值大
;校正值大于失調值
;如果為負數,應變成有符號的原碼
movwf insd1
comf insd1,F
incf insd1,W
iorlw B'00100000' ;置符號位
goto set2b
; --------------------------------------------------------------------
; 是正值,使失調值往正的方向走
set2a:
btfss insd1,5
goto ZZ2
;失調值為負
movlw B'00011111'
andwf insd1,F ;變正
movf (SDATA+2),W
subwf insd1,W
btfss _Z
goto ZF2
movlw H'00' ;相等
goto set2b
ZF2:
btfsc _C
goto ZF21 ;老的失調絕對值大
;校正絕對值大于失調絕對值:減完后變正值了。例:-3減去4=+1
movf insd1,W
subwf (SDATA+2),W
goto set2b
ZF21:
iorlw B'00100000' ;置符號位
goto set2b
ZZ2:
movf (SDATA+2),W
addwf insd1,W
set2b:
movwf outd1
movlw B'10001001'
movwf TEMP
call W_CHxOS
I2C_WR_SUB 0x01, outd1, AT_CH2OS ; 失調值寫入外存
CRT1:
;給的是舊值
movf V_sample_low,W
movwf SDATA
movf V_sample_middle,W
movwf (SDATA+1)
movf V_sample_high,W
movwf (SDATA+2)
goto CRT2
CR_vallue:
movlw H'01'
xorwf (SDATA+1),W
btfss _Z
return
; correct CH1 vallue
bsf STATUS,RP0 ; select page 1
bcf PIE1,TMR1IE ; disable Timer1中斷
bcf STATUS,RP0 ; select page 1
movf (SDATA+2),W
btfsc _Z
goto CRT0 ;等于0,讀出當前APGain下的波形值即可
;read out APGain
call ReadAPGain
btfss (SDATA+2),7
goto CRV1
;是負值,轉換為12位補碼
movlw B'00001111'
movwf TEMP
movlw B'01111111'
andwf (SDATA+2),F
comf (SDATA+2),F
incf (SDATA+2),F
goto CRV2
CRV1:
clrf TEMP
CRV2:
movf (SDATA+2),W
addwf insd1,W
movwf outd1
bsf _BANK1
movwf APGAIN1_LOW
bcf _BANK1
btfss _C
goto CRV3 ;無進位
incf insd2,F
movlw B'00001111'
andwf insd2,F ;‘與’掉高半字節的進位
CRV3:
movf TEMP,W
addwf insd2,F
movlw B'00001111'
andwf insd2,W ;‘與’掉高半字節的進位
movwf outd2
bsf _BANK1
movwf APGAIN1_HI
bcf _BANK1
call W_APGain
I2C_WR_SUB 0x02, outd1, AT_APGAIN
CRT0:
CALL ReadWafeForm
movf insd1,W
movwf SDATA
movf insd2,W
movwf (SDATA+1)
movf insd3,W
movwf (SDATA+2)
CRT2:
btfss isCR_1OS ;是CH1的失調校正?
goto CRT3
movf (BFIIC+6),W ;yes,恢復APGain
movwf outd1
movf (BFIIC+7),W
movwf outd2
call W_APGain
I2C_WR_SUB 0x02, outd1, AT_APGAIN
CRT3:
bsf STATUS,RP0 ; select page 1
bsf PIE1,TMR1IE ; enable Timer1中斷
bcf STATUS,RP0 ; select page 1
movlw D'5'
movwf SBL
goto REPLY_OK
; -----------------------------------------------------------------------------------
ClearREG:
bsf STATUS,RP0 ; select page 1
bcf PIE1,TMR1IE ; enable Timer1中斷
bcf STATUS,RP0 ; select page 1
clrf outd1
clrf outd2 ; clear APGain
movlw B'10001000'
movwf TEMP
call W_CHxOS
call W_APGain
I2C_WR_SUB 0x02, outd1, AT_APGAIN
bsf _BANK1
clrf APGAIN1_LOW
clrf APGAIN1_HI
bcf _BANK1
movlw B'10001001'
movwf TEMP
call W_CHxOS
bsf STATUS,RP0 ; select page 1
bsf PIE1,TMR1IE ; enable Timer1中斷
bcf STATUS,RP0 ; select page 1
;清除7756校準參數區
clrf BFIIC
clrf (BFIIC+1)
clrf (BFIIC+2)
clrf (BFIIC+3)
; clrf (BFIIC+4)
; clrf (BFIIC+5)
; clrf (BFIIC+6)
; clrf (BFIIC+7)
I2C_WR_SUB 0x08, BFIIC, AT_CH1OS
bsf STATUS,RP0
bsf WP_TRIS ;change input
bcf STATUS,RP0
bsf WP
movlw D'2'
movwf SBL
goto REPLY_OK
; -----------------------------------------------------------------------------------
;數據巡采
CollectData:
;;; movlw I_Waveform1 ;平均值
;**************************************************
bsf STATUS,RP0 ; select page 1
bcf PIE1,TMR1IE ; disable Timer1中斷
bcf STATUS,RP0 ; select page 1
movlw RB0_I1 ;立即值
movwf I
movlw DI0
movwf J
movlw D'3'
movwf tempCount
call S1_S0
;;; movlw V_Waveform1
movlw RB0_V1 ;立即值
movwf I
movlw (DI0+3)
movwf J
movlw D'3'
movwf tempCount
call S1_S0
bsf STATUS,RP0 ; select page 1
bsf PIE1,TMR1IE ; disable Timer1中斷
bcf STATUS,RP0 ; select page 1
;**************************************************
;配置狀態字
clrf (DI0+6)
clrw
btfsc BattOn
bsf (DI0+6),7
btfsc disCharging
movlw B'00100000'
btfsc Charging
movlw B'00110000'
btfsc Standing
movlw B'01000000'
btfsc CMD_Stop
movlw B'01100000'
btfss OverTermTime ;超時?
goto CL1
movlw B'01110000'
iorlw B'00001100'
CL1:
btfss OverCapacity
goto CL2
movlw B'01110000'
iorlw B'00001000'
;************************************************
; bit7 =1/0 有/無電池 *
;當前工作狀態指示 *
; bit6 bit5 bit4 =000 *
; =010 放電 *
; =011 充電 *
; =100 靜置 *
; =110 命令停止 *
; =111 異常中止 *
;當前錯誤狀態指示 *
; bit3 bit2 =00 電流異常 *
; =01 電壓異常 *
; =10 超時 *
; =11 *
; bit1 =1/0 7756已/未 校準 *
; bit0 =1/0 *
;************************************************
CL2:
iorwf (DI0+6),F
movlw D'7'
movwf SBL
goto PRE_DELAY
; -----------------------------------------------------------------------------------
;設置點號: 5位設備號+1位通道號(BCD碼)
SetDeviceNO:
bsf STATUS,RP0 ; bank 1
bcf WP_TRIS ; MOT re_set to output
bcf STATUS,RP0 ; bank 0
bcf WP
I2C_WR_SUB 0x03, DI0, AT_DeviceNO
btfss Txmt_Success
return
;寫EEPROM正確,才能回送
movlw D'0'
movwf SBL
; goto REPLY_OK
; -----------------------------------------------------------------------------------
; 數據填充之后的應答幀
PRE_DELAY:
call DELAY10ms
REPLY_OK:
I2C_READ_SUB 0x03, A0, AT_DeviceNO
bsf PCLATH,3 ; Prog page 1
goto Transmit
OK_OUT:
return
; ---------------------------------------------------------------------------------------------
; 寫工作模式寄存器
WriteMODE:
movlw B'10000110' ; command to write to mode register
movwf spi ; call spi control write to mode reg
movlw D'16' ; number of bits
movwf wordlen
CALL SPIDX ; output outd1 and outd2 to 7756
return
?? 快捷鍵說明
復制代碼
Ctrl + C
搜索代碼
Ctrl + F
全屏模式
F11
切換主題
Ctrl + Shift + D
顯示快捷鍵
?
增大字號
Ctrl + =
減小字號
Ctrl + -