?? cmd6.asm
字號:
; ***********************************************************************************************
; 命令處理模塊
CMD:
bcf aFRAME
bsf PCLATH,3 ; Prog page 1
call CHECKSUM
bcf PCLATH,3 ; Prog page 0
movwf TEMP
movf SBL,W
addlw DI0
movwf FSR
movf INDF,W
subwf TEMP,W
btfss STATUS,Z
return ;累加和不等
movlw A0
movwf FSR
movlw .3
movwf J
CMD2:
movf INDF,W
sublw 0xFF ;是全網(wǎng)廣播?
btfss STATUS,Z
goto Command1
incf FSR,F
decfsz J,F
goto CMD2
goto Command2
Command1:
; ---- 讀出通道號 ---------------------------------
I2C_READ_SUB 0x03, (BFIIC+1), AT_DeviceNO
movlw .3
movwf J
movlw (BFIIC+1)
movwf FSR
IF_EQ:
movf INDF,W ;取出通道號
andlw 0x0F
movwf TEMP
movlw B'01110000'
xorwf FSR,F ;21H-->61H 指向A0
movf INDF,W ;地址碼->W
andlw 0x0F
subwf TEMP,F
btfss STATUS,Z ;通道號比較
goto IF_0F
EQ1:
movlw B'01110000'
xorwf FSR,F ;61H-->21H 指向通道號low
movf INDF,W ;取出通道號
andlw 0xF0
movwf TEMP
movlw B'01110000'
xorwf FSR,F ;21H-->61H 指向A0
movf INDF,W ;地址碼->W
incf FSR,F ;指向A1
andlw 0xF0
subwf TEMP,F
btfss STATUS,Z ;通道號比較
goto IF_F0
EQ10:
movlw B'01110000'
xorwf FSR,F ;62H-->22H 指向通道號high
EQ1A:
decfsz J,F
goto IF_EQ
goto Command2
IF_0F:
sublw 0x0F
btfsc STATUS,Z ;=統(tǒng)配符?
goto EQ1 ;=
return
IF_F0:
sublw 0xF0
btfsc STATUS,Z ;=統(tǒng)配符?
goto EQ10 ;=
return
; -----------------------------------------------------------------------------------
Command2: ;從站地址吻合或?yàn)閺V播發(fā)送
clrwdt
movlw 0x01
subwf CCODE,W
btfsc STATUS,Z
goto READ_REPLY ;讀數(shù)據(jù)
movlw 0x08
subwf CCODE,W
btfsc STATUS,Z
goto CollectData ;數(shù)據(jù)巡采
movlw 0x04
subwf CCODE,W
btfsc STATUS,Z
goto SET_REPLY ;寫數(shù)據(jù)
btfsc BUTTON
return ;編程允許鍵未按下(=1)為不允許編程
movlw 0x0A
subwf CCODE,W
btfsc STATUS,Z
goto SetDeviceNO
return
; -----------------------------------------------------------------------------------
;讀數(shù)據(jù)
READ_REPLY:
movlw 0x95
subwf DI1,W
btfsc STATUS,Z
goto FILL95
movlw 0xA3
subwf DI1,W
btfsc STATUS,Z
goto FILLA3
return
; -----------------------------------------------------------------------------------
FILL95:
movlw 0x10
subwf DI0,W
btfsc STATUS,Z
goto ReadCH1
movlw 0x11
subwf DI0,W
btfsc STATUS,Z
goto ReadCH2
return
;單獨(dú)讀取通道值時,回送立即值
ReadCH1:
movlw RB0_I1
goto RC
ReadCH2:
movlw RB0_V1
RC:
movwf I
movlw SDATA
movwf J
movlw D'3'
movwf tempCount
call S1_S0
movlw D'5'
movwf SBL
goto PRE_DELAY
; -----------------------------------------------------------------------------------
FILLA3:
movlw 0x1F
subwf DI0,W
btfsc STATUS,Z
goto ReadREG
movlw 0x20
subwf DI0,W
btfsc STATUS,Z
goto ReadDeviceNO
return
ReadREG:
bsf STATUS,RP0 ; select page 1
bcf PIE1,TMR1IE ; disable Timer1中斷
bcf STATUS,RP0 ; select page 1
;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
movf insd1,W
movwf SDATA
;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
movf insd1,W
movwf (SDATA+1)
;read out APGain
call ReadAPGain
movf insd1,W
movwf (SDATA+2)
movf insd2,W
movwf (SDATA+3)
;;;
; bsf _BANK1
; movf APGAIN1_LOW,W
; bcf _BANK1
; movwf (SDATA+2)
; bsf _BANK1
; movf APGAIN1_HI,W
; bcf _BANK1
; movwf (SDATA+3)
bsf STATUS,RP0 ; select page 1
bsf PIE1,TMR1IE ; enable Timer1中斷
bcf STATUS,RP0 ; select page 1
movlw D'6'
movwf SBL
goto PRE_DELAY
ReadDeviceNO:
movlw D'2'
movwf SBL
goto PRE_DELAY
; -----------------------------------------------------------------------------------
;寫數(shù)據(jù)
SET_REPLY:
bsf STATUS,RP0 ; bank 1
bcf WP_TRIS ; MOT re_set to output
bcf STATUS,RP0 ; bank 0
bcf WP
movlw 0xA0
subwf DI1,W
btfsc STATUS,Z
goto SETA0
movlw 0xA3
subwf DI1,W
btfsc STATUS,Z
goto Correct7756
return
; -----------------------------------------------------------------------------------
SETA0:
movlw 0x12
subwf DI0,W
btfsc STATUS,Z
goto SetDisCharge
movlw 0x14
subwf DI0,W
btfsc STATUS,Z
goto SetCharge
movlw 0x18
subwf DI0,W
btfsc STATUS,Z
goto SetStandby
movlw 0x20
subwf DI0,W
btfsc STATUS,Z
goto SetTerminate
movlw 0x21
subwf DI0,W
btfsc STATUS,Z
goto SetStart
return
; -----------------------------------------------------------------------------------
SetCharge:
clrf LoadOn
bcf OverCapacity
bsf CMD_Charge
bcf OverTermTime ;清除超時標(biāo)志
I2C_WR_SUB 0x08, SDATA, AT_Current
I2C_WR_SUB 0x06, (SDATA+8), (AT_Current+8)
;
; I2C_READ_SUB 0x08, BFIIC, AT_Current
; nop
; nop
; I2C_READ_SUB 0x06, BFIIC, (AT_Current+8)
; nop
movlw SDATA
movwf I
movlw Current_LOW
movwf J
movlw D'11' ;未傳截止容量
movwf tempCount
call S0_S1
movf (SDATA+D'14'),W
bsf _BANK1
movwf J_H
bcf _BANK1
movlw D'2'
movwf SBL
goto REPLY_OK
; -----------------------------------------------------------------------------------
SetDisCharge:
clrf LoadOn
bcf OverCapacity
bsf CMD_DisCharge
bcf OverTermTime ;清除超時標(biāo)志
I2C_WR_SUB 0x03, SDATA, AT_Current
I2C_WR_SUB 0x03, (SDATA+3),AT_DisCHTermV
I2C_WR_SUB 0x02, (SDATA+6),AT_TerminalT
movlw SDATA
movwf I
movlw Current_LOW
movwf J
movlw D'3'
movwf tempCount
call S0_S1
movlw (SDATA+3)
movwf I
movlw DisCHTermV_LOW
movwf J
movlw D'3'
movwf tempCount
call S0_S1
movlw (SDATA+6)
movwf I
movlw TerminalT_LOW
movwf J
movlw D'2'
movwf tempCount
call S0_S1
movlw D'2'
movwf SBL
goto REPLY_OK
; -----------------------------------------------------------------------------------
SetStandby:
bcf OverCapacity
bsf PCLATH,3 ; Prog page 1
call ClosePWM ; 沒有流程,暫關(guān)PWM
bcf PCLATH,3 ; Prog page 0
clrf C_LowerTerm
bsf CH ; close 充電控制
bsf DISCH ;close 放電控制
btfss BattOn
goto SS1
bsf RedLed ;有電池亮桔燈
bsf GreenLed
SS1:
I2C_WR_SUB 0x01, SDATA, AT_HandleTime ; 失調(diào)值寫入外存
movf SDATA,W
bsf STATUS,RP0
movwf StandBy
bcf STATUS,RP0 ; select page 1
clrf LoadOn
clrf WorkFlag
bsf Standing
bcf OverTermTime ;清除超時標(biāo)志
clrf Minutes
movlw D'2'
movwf SBL
goto REPLY_OK
; -----------------------------------------------------------------------------------
; 停止流程
SetTerminate:
bsf CMD_Stop
bsf PCLATH,3
call ClosePWM
bcf PCLATH,3
movlw 0x43 ;ASCII 'C'
xorwf SDATA,W
btfss _Z
goto ST0
bsf OverCapacity
goto ST2
ST0:
bcf OverCapacity
ST2:
bsf CH
bsf DISCH
btfss BattOn
goto ST1
bsf RedLed ;有電池亮桔燈
bsf GreenLed
ST1:
clrf WorkFlag
movlw D'3'
movwf SBL
goto PRE_DELAY
; -----------------------------------------------------------------------------------
; 啟動流程
SetStart:
; bsf CMD_Start
bcf CMD_Stop
bcf OverCapacity
movlw D'2'
movwf SBL
goto PRE_DELAY
; ***********************************************************************************
Correct7756:
movlw 0x10
subwf DI0,W
btfsc STATUS,Z
goto CorrectCH1OS
movlw 0x11
subwf DI0,W
btfsc STATUS,Z
goto CorrectCH1
movlw 0x12
subwf DI0,W
btfsc STATUS,Z
goto CorrectCH2
movlw 0x13
subwf DI0,W
btfsc STATUS,Z
goto CorrectCH2OS
movlw 0x1A
subwf DI0,W
btfsc STATUS,Z
goto StepCorrect
movlw 0x1F
subwf DI0,W
btfsc STATUS,Z
goto ClearREG
return
; -----------------------------------------------------------------------------------
; 通道1失調(diào)校正
CorrectCH1OS:
bsf STATUS,RP0 ; select page 1
bcf PIE1,TMR1IE ; disable Timer1中斷
bcf STATUS,RP0 ; select page 1
;first clear CH1OS
clrf outd1
movlw B'10001000' ; command to write to ch1os register(通道1失調(diào)校正寄存器)
movwf spi ; call spi control write to ch1os reg
movlw D'8' ; number of bits
movwf wordlen
CALL SPIDX ; output outd1 to 7756
I2C_WR_SUB 0x01, outd1, AT_CH1OS
;clear APGain
; clrf outd1
clrf outd2
call W_APGain
I2C_WR_SUB 0x02, outd1, AT_APGAIN
bsf _BANK1
clrf APGAIN1_LOW
clrf APGAIN1_HI
bcf _BANK1
movlw low MODE_INIT
iorlw B'00000001'
movwf outd1 ; lower eight bits
movlw high MODE_INIT
andlw B'11011111' ; change to CH1
iorlw B'01000001' ; 內(nèi)部短接模擬地CH1與AGND
movwf outd2 ; higher eight bits
call WriteMODE
CALL ReadWafeForm
;
goto CT2
; -----------------------------------------------------------------------------------
; 通道2失調(diào)校正
CorrectCH2OS:
bsf STATUS,RP0 ; select page 1
bcf PIE1,TMR1IE ; disable Timer1中斷
bcf STATUS,RP0 ; select page 1
;first clear CH2OS
clrf outd1
movlw B'10001001' ; command to write to ch2os register
movwf spi ; call spi control write to ch2os reg
movlw D'8' ; number of bits
movwf wordlen
CALL SPIDX ; output outd1 to 7756
I2C_WR_SUB 0x01, outd1, AT_CH2OS
movlw low MODE_INIT
iorlw B'00000001'
movwf outd1 ; lower eight bits
movlw high MODE_INIT
andlw B'11111110' ; 內(nèi)部短接模擬地CH2與AGND
iorlw B'01100010' ; 內(nèi)部短接模擬地CH2與AGND
movwf outd2 ; higher eight bits
call WriteMODE
CALL ReadWafeForm
;
CT2:
;失調(diào)值送給手抄器
movf insd1,W
movwf SDATA
movf insd2,W
movwf (SDATA+1)
movf insd3,W
movwf (SDATA+2)
; 恢復(fù)工作寄存器
movlw low MODE_INIT
movwf outd1 ; lower eight bits
movlw high MODE_INIT
movwf outd2 ; higher eight bits
call WriteMODE
bcf Mode_0CH1_1CH2
;
bsf STATUS,RP0 ; select page 1
bsf PIE1,TMR1IE ; enable Timer1中斷
bcf STATUS,RP0 ; select page 1
?? 快捷鍵說明
復(fù)制代碼
Ctrl + C
搜索代碼
Ctrl + F
全屏模式
F11
切換主題
Ctrl + Shift + D
顯示快捷鍵
?
增大字號
Ctrl + =
減小字號
Ctrl + -