📄 f6.asm
字号:
incf I,F
incf J,F
decfsz tempCount,F
goto S1_S0
return
;*********************************************************************************************************
#include <ADE6.ASM>
#include <CMD6.ASM>
#include <IIC.ASM>
;*********************************************************************************************************
org High2k ; Page 1
ReadDelayInINT:
; 5.0688MHz crystal,tc=4*90=360,delay=360*0.789us=284us
movlw D'90'
movwf M
RT1:
btfsc INTCON,INTF
return
decfsz M,F
goto RT1
return
;***********************************************************************
; Timer1 overflow interrupt
;
KeepValue_LOW set DC_LOW
;KeepValue_MID defined
KeepValue_HI set DC_HI
T1OVFL:
bcf PIR1, TMR1IF
movlw low T1_TICK
movwf TMR1L ; set Timer1 Low byte
movlw high T1_TICK
movwf TMR1H ; set Timer1 high byte
incf C_T,F
movlw D'2'
subwf C_T,W
btfss _C
goto RW0
bsf TimerArrived
clrf C_T
;*********************************************************************
RW0:
btfsc Mode_0CH1_1CH2
goto Mode_CH2
bcf INTCON,INTF
call ReadDelayInINT
btfsc INTCON,INTF
goto RWF1
call ReadDelayInINT
btfsc INTCON,INTF
goto RWF1
; 还不能更新
goto ErrorProcedure
RWF1:
movlw B'00000001' ; 波形寄存器地址
movwf spi ; output to spi read active energy and reset
movlw b'00000100' ; number of bytes to download B'000(5)(4)(3)(2)(1)'
movwf wordlen ; wordlen is 24 bits. reg is actually 24 bits
bcf PCLATH,3
CALL SPIRX ; CALL SPI read 24 bit word data will be in
; insd1,2,3. 3 being msb 1 being lsb
call START ;求补
bsf PCLATH,3
bsf ReadedCH1
movf insd3,W ; mov in serial data (insd1-3) to sample low to high
bsf STATUS,RP0 ; select page 1
movwf RB0_I3
bcf STATUS,RP0
movf insd2,W
bsf STATUS,RP0 ; select page 1
movwf RB0_I2
bcf STATUS,RP0
movf insd1,W
bsf STATUS,RP0 ; select page 1
movwf RB0_I1
bcf STATUS,RP0
; swap
movlw low MODE_INIT
movwf outd1 ; lower eight bits
movlw high MODE_INIT
iorlw B'01100000' ; change to ch2
; iorlw B'00000100' ; swap
movwf outd2 ; higher eight bits
; 写工作模式寄存器
bcf PCLATH,3
call WriteMODE
;;;*****************************************************
; bsf _BANK1
; movf APGAIN2_LOW,W
; bcf _BANK1
; movwf outd1
; bsf _BANK1
; movf APGAIN2_HI,W
; bcf _BANK1
; movwf outd2
; call W_APGain
;;;*****************************************************
bsf PCLATH,3
bsf Mode_0CH1_1CH2
goto T1OUT
Mode_CH2:
bcf INTCON,INTF
call ReadDelayInINT
btfsc INTCON,INTF
goto RWF2
call ReadDelayInINT
btfsc INTCON,INTF
goto RWF2
; 还不能更新
goto ErrorProcedure
RWF2:
movlw B'00000001' ; 波形寄存器地址
movwf spi ; output to spi read active energy and reset
movlw b'00000100' ; number of bytes to download B'000(5)(4)(3)(2)(1)'
movwf wordlen ; wordlen is 24 bits. reg is actually 24 bits
bcf PCLATH,3
CALL SPIRX ; CALL SPI read 24 bit word data will be in
; insd1,2,3. 3 being msb 1 being lsb
call START ;求补
bsf PCLATH,3
bsf ReadedCH2
movf insd3,W ; mov in serial data (insd1-3) to sample low to high
bsf STATUS,RP0 ; select page 1
movwf RB0_V3
bcf STATUS,RP0
movf insd2,W
bsf STATUS,RP0 ; select page 1
movwf RB0_V2
bcf STATUS,RP0
movf insd1,W
bsf STATUS,RP0 ; select page 1
movwf RB0_V1
bcf STATUS,RP0
; switch back to CH1
movlw low MODE_INIT
movwf outd1 ; lower eight bits
movlw high MODE_INIT
movwf outd2 ; higher eight bits
bcf PCLATH,3
call WriteMODE ; 写工作模式寄存器
;;;*****************************************************
; bsf _BANK1
; movf APGAIN1_LOW,W
; bcf _BANK1
; movwf outd1
; bsf _BANK1
; movf APGAIN1_HI,W
; bcf _BANK1
; movwf outd2
; call W_APGain
;;;*****************************************************
bsf PCLATH,3
bcf Mode_0CH1_1CH2
T1OUT:
bcf PCLATH,3
goto END_ISR
; --------------------------------------------------------------------
; 应为中断中也调用ClosePWM,所以靠判TMR2IF来传递CCPR1L到CCPR1H,
; 可能会有问题
ClosePWM:
clrwdt
; bsf STATUS,RP0 ; select page 1
; bcf PIE1,TMR1IE ; disable Timer1中断
; bcf STATUS,RP0 ; select page 1
; ---- 占空比置为 0
clrf CCPR1L ; Duty Cycle is 50% of PWM Period
movlw B'00000011'
movwf ResistNet
bsf STATUS,RP0 ; Bank 1
bsf R46_TRIS
bsf R47_TRIS
bcf STATUS,RP0 ; bank 0
CC1:
movf CCPR1H,W
btfss _Z
goto CC1
; ---- close PWM
clrf PWM_LOW
clrf PWM_HI
bcf TopPoint
clrf CCP1CON ; close CCP2
bcf PWM
clrf TMR2 ; Clear Timer2
clrf T2CON ; stop Timer2
;
; bsf STATUS,RP0 ; select page 1
; bsf PIE1,TMR1IE ; disable Timer1中断
; bcf STATUS,RP0 ; select page 1
clrf SecsPassed
return
; --------------------------------------------------------------------------------------
; 7756 mode register was changed,can't read out data from wafeform register
ErrorProcedure:
nop
goto ErrorProcedure ; wait DOG reset
;***************************************************************************
; 串口接收中断
RCINT:
; 读出接收到的第9位数据
bcf RX9D_copy
btfsc RCSTA,RX9D
bsf RX9D_copy
; 计算偶校验位,与RX9D_copy比较 ......
; 清除OERR
; 判断FERR
; ------------------------------------------------------------------------
movf RCREG,W ; 读出接收到的数据
movwf RevTemp ; 暂存->RevTemp
movf ByteReceived,W
addlw SERIALBUFFER
movwf FSR
movlw .5
subwf ByteReceived,W ;ByteReceived-5
btfsc STATUS,Z
goto REC8 ;Z=1,=5
btfss STATUS,C
goto REC8 ;C=0,<5
;>5
movf SBL,W
addlw D'7' ;68,A0,A1,A2,CODE,L,CS
subwf ByteReceived,W ;ByteReceived-(BSL+11)->W
btfss STATUS,Z
goto RR_SAV
;Z=1
movlw 0x16
subwf RevTemp,W ; RevTemp-0x16->W
;等于结束符?
btfss STATUS,Z
goto RC_OUT ; not equal 0x16
;等于
movf RevTemp,W
movwf INDF
;收到一帧
bsf aFRAME
goto RC_OUT
REC8:
movlw high ADR
movwf PCLATH
movlw low ADR
addwf ByteReceived,W
movwf PCL
ADR: goto RR68
goto RR_SAV
goto RR_SAV
goto RR_SAV
goto R_CMD
goto RR69
RR68:
movf RevTemp,W
sublw 0x68
btfss STATUS,Z
goto SerialOut
bsf RECEIVING
goto RR_SAV
R_CMD:
btfss RevTemp,7 ; 与上海规约相反
goto RR_SAV
RC_OUT:
bcf RECEIVING ; 清正在接收标志
clrf OVERTIME
clrf ByteReceived
goto SerialOut
RR69:
movlw DataLength
subwf RevTemp,W ; RevTemp-DataLength->W
btfsc STATUS,C
goto RC_OUT ;大于最大长度
RR_SAV:
movf RevTemp,W
movwf INDF
incf ByteReceived,F
SerialOut:
bcf PCLATH,3
goto END_ISR
;***************************************************************************
; Configure internal peripherals (except LCD) for operation.
; Also configures interrupts.
;
;***************************************************************************
; Inputs: none
; Outputs: none
InitPeriph:
movlw PORTA_LATCH
movwf PORTA
movlw PORTB_LATCH
movwf PORTB
movlw PORTC_LATCH
movwf PORTC
bsf STATUS,RP0 ; Bank 1
movlw PORTA_TRIS
movwf TRISA ;
movlw PORTB_TRIS
movwf TRISB
movlw PORTC_TRIS
movwf TRISC
bcf STATUS,RP0 ; bank 0
movlw B'00000000' ;set up spi as master fos/4 idle state high
movwf SSPCON ;mov W to spi control register
movlw B'00000000'
bsf STATUS,RP0 ; set to bank 1
movwf SSPSTAT ; set up clk edges
bcf STATUS,RP0 ; set to bank 0
bsf SSPCON,5 ; Synchronous Serial Port Enable
;---------------------------------------------------------------------------------
;配置USART
movlw RCSTA_INIT ; 8-bit receive, receiver enabled,
movwf RCSTA ; serial port enabled
bsf STATUS,RP0 ; Bank 1
movlw TXSTA_INIT
movwf TXSTA
;配置波特率
movlw SPBRG_INIT
movwf SPBRG
; set A0-A4 to digital
movlw 0x06
movwf ADCON1
bcf STATUS,RP0 ; Bank 0
; close A/D
clrf ADCON0
; -------------------------------------------------------------
; PWM Initialization
;PWMInit:
clrf CCP1CON ; close CCP2
clrf TMR2 ; Clear Timer2
clrf T2CON ; stop Timer2
movlw PR2_INIT
bsf STATUS,RP0 ; Bank 1
movwf PR2
bcf STATUS,RP0 ; Bank 0
movlw CCPR1L_INIT ; 8 bits of DC
movwf CCPR1L ; Duty Cycle is 50% of PWM Period
movlw CCP1CON_INIT ; PWM mode, 2 LSbs of Duty cycle = 00
movwf CCP1CON ; Duty Cycle is 00% of PWM Period
BCF PIR1, TMR2IF ; Clear the TRM2 = PR2 flag
movlw T2CON_INIT
movwf T2CON ; 1:1 prescale, 1:1 postscale
bsf T2CON,TMR2ON ; TMR2 on
return
;***************************************************************************
ConfigInt: ; configure interrupts
movf PORTB,W ; required to clear interrupt on PORTB change
clrf PIR1 ; clear all pending peripheral interrupts
clrf INTCON ; clear all remaining interrupts and
; some interrupt enable flags
bsf STATUS,RP0 ; select page 1
movlw OPTION_INIT ; Interrupt on RB0/INT falling edge
movwf OPTION_REG ; TMR0 in Timer mode
bsf PIE1,RCIE ; 允许SCI接收中断
bsf PIE1,TMR1IE ; 允许Timer1中断
bcf STATUS,RP0 ; select page 0
; T1 setup
movlw low T1_TICK
movwf TMR1L ; set Timer1 Low byte
movlw high T1_TICK
movwf TMR1H ; set Timer1 high byte
movlw T1CON_INIT
movwf T1CON
; enable GIE,PEIE,T0IE,INTE,RBIE
; movlw INTCON_INIT
; movwf INTCON
; bsf INTCON,RBIE
bcf INTCON,RBIE
bcf INTCON,INTE
bcf INTCON,T0IE
bsf INTCON,PEIE
bsf INTCON,GIE
return
; ***************************************************************************
; clear 20H--7FH(bank0),A0H--FFH(bank1)
ClearRAM: ; This was a cold start, clear memory
movlw BFIIC ; start of GPRs
movwf FSR
CR:
clrf INDF ; clear GPR
incf FSR,F ; increment POINTER
movf FSR,W ; get POINTER
xorlw 0x80 ; test for first GPR to not clear
btfss STATUS,Z ; was there a match?
goto CR ; no, clear another GPR
movlw 0xA0 ; start of GPRs
movwf FSR
bsf STATUS,RP0
CR1:
clrf INDF ; clear GPR
incf FSR,F ; increment POINTER
movf FSR,W ; get POINTER
xorlw 0xFF ; test for first GPR to not clear
btfss STATUS,Z ; was there a match?
goto CR1 ; no, clear another GPR
bcf STATUS,RP0
return
;----------------------------------------------------------
P_Charge:
btfss BattOn
return
btfsc CMD_Stop
return ;处停止状态
movf WorkFlag,W
btfss _Z
return
;流程寄存器 = 0:没有其他流程
bsf Charging
bsf RedLed ;正在充电,亮红灯
bcf GreenLed
bcf CH ; enable
bsf DISCH ; disable
P_OUT:
clrf C_TermT_LOW
clrf C_TermT_HI
; 重新启动PWM
movlw CCPR1L_INIT ; 8 bits of DC
movwf CCPR1L ; Duty Cycle is 50% of PWM Period
movlw CCP1CON_INIT ; PWM mode, 2 LSbs of Duty cycle = 00
movwf CCP1CON ; Duty Cycle is 00% of PWM Period
movlw T2CON_INIT
movwf T2CON ; 1:1 prescale, 1:1 postscale
bsf T2CON,TMR2ON ; TMR2 on
;关闭电阻网络
bsf STATUS,RP0 ; Bank 1
bsf R46_TRIS
bsf R47_TRIS
bcf STATUS,RP0 ; bank 0
; clrf ResistNet
movlw B'00000011'
movwf ResistNet
bsf T1CON,TMR1ON
return
;----------------------------------------------------------
P_DisChar:
btfss BattOn
return
btfsc CMD_Stop
return ;处停止状态
movf WorkFlag,W
btfss _Z
return
;流程寄存器 = 0:没有其他流程
bsf disCharging
bcf RedLed ; close红灯
bsf GreenLed ; on
bsf CH
bcf DISCH ; 输出0放电
goto P_OUT
;----------------------------------------------------------
DataAdded_I:
bcf _C
movf I_sample_low,W
bsf STATUS,RP0
addwf Iaddend1,F
btfss _C
goto ADD2
movlw D'1'
addwf Iaddend2,F
btfss _C
goto ADD2
movlw D'1'
addwf Iaddend3,F
btfss _C
goto ADD2
movlw D'1'
addwf Iaddend4,F
ADD2:
bcf STATUS,RP0
movf I_sample_middle,W
bsf STATUS,RP0
addwf Iaddend2,F
btfss _C
goto ADD3
movlw D'1'
addwf Iaddend3,F
btfss _C
goto ADD3
movlw D'1'
addwf Iaddend4,F
ADD3:
bcf STATUS,RP0
movf I_sample_high,W
bsf STATUS,RP0
addwf Iaddend3,F
btfss _C
goto DA_OUT
movlw D'1'
addwf Iaddend4,F
DA_OUT:
bcf STATUS,RP0
return
; --------------------------------------------------------
DataAdded_V:
bcf _C
movf V_sample_low,W
bsf STATUS,RP0
addwf Vaddend1,F
btfss _C
goto VDD2
movlw D'1'
addwf Vaddend2,F
btfss _C
goto VDD2
movlw D'1'
addwf Vaddend3,F
btfss _C
goto VDD2
movlw D'1'
addwf Vaddend4,F
VDD2:
bcf STATUS,RP0
movf V_sample_middle,W
bsf STATUS,RP0
addwf Vaddend2,F
btfss _C
goto VDD3
movlw D'1'
addwf Vaddend3,F
btfss _C
goto VDD3
movlw D'1'
addwf Vaddend4,F
VDD3:
bcf STATUS,RP0
movf V_sample_high,W
bsf STATUS,RP0
addwf Vaddend3,F
btfss _C
goto VA_OUT
movlw D'1'
addwf Vaddend4,F
VA_OUT:
bcf STATUS,RP0
return
; --------------------------------------------------------
P_TIMER:
incf C_SEC,F
movlw SEC1divTimer
subwf C_SEC,W
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -