📄 ups300w16f73.asm
字号:
FastShortAdc:
movf ConvStart_Timer,W
btfss STATUS,Z
return
MOVLW .8
MOVWF WR0
CLRF WR1
clrf WR2
test_short_do
BSF PORTC,0
BCF INTCON,GIE
BSF STATUS,RP0
CLRF ADCON1
BCF STATUS,RP0
MOVLW 85H ;10000101 ;RA0 V_ADC, Clock=Fosc/4
MOVWF ADCON0
FASTADDO
BTFSC ADCON0,2 ;Check EOC bit
GOTO FASTADDO
MOVF ADRES,W
BSF INTCON,GIE
ADDWF WR1,F
BTFSC STATUS,C
INCF WR2,F
CALL Delay_test
DECFSZ WR0,F
GOTO test_short_do
BCF STATUS,C
RRF WR2
RRF WR1
BCF STATUS,C
RRF WR2
RRF WR1
BCF STATUS,C
RRF WR2
RRF WR1
BCF PORTC,0
MOVF WR1,W
SUBLW SHORT_AD
BTFSC STATUS,C
GOTO test_continue_do
INCF FastShortTime,F
MOVF FastShortTime,W
SUBLW .5
BTFSS STATUS,Z
return
BSF UserFlag,ConvertShort
RETURN
test_continue_do
CLRF FastShortTime
RETURN
;--------------------------Safety_module
Safety_module:
BSF STATUS,RP0
MOVLW 88H
MOVWF OPTION_REG
BCF STATUS,RP0
MOVLW 01H ;Enable timer1
MOVWF T1CON
BSF STATUS,RP0
BSF PIE1,TMR1IE
BCF STATUS,RP0
MOVLW 0F0H
IORWF INTCON,F
RETURN
;--------------------------Input_module
Input_module:
CALL Key_Input
MOVF Startup_Timer,F
BTFSS STATUS,Z
GOTO IN_MOD_EXIT
BTFSC UserFlag,DC_OverLoad
GOTO IN_MOD_EXIT
BTFSC UserFlag,ConvertShort
GOTO IN_MOD_EXIT
CALL INPUT_VOLT_ADC
MOVF Pow_Stataus,W
XORLW POWER_220VAC
BTFSC STATUS,Z
GOTO ADC_EXIT
MOVF PWMStartFlag,W
XORLW PWM_START
BTFSS STATUS,Z
GOTO ADC_EXIT
CALL OUTPUT_VOLT_ADC
CALL FastShortAdc ;检测逆变时短路信号
ADC_EXIT
CALL BATT_VOLT_ADC
IN_MOD_EXIT
RETURN
;------------------------Key_Input
Key_Input
BCF STATUS,RP0
MOVF KeyInput_Timer,W
BTFSC STATUS,Z
GOTO KEY_INPUT_EXIT
MOVF KeyInput_Timer,W
MOVWF WR0
MOVLW THREE_SECOND
SUBWF WR0,W
BTFSC STATUS,C
GOTO LONG_PRESS_KEY
BTFSC PORTB,_KEY_INPUT
GOTO KEY_INPUT_EXIT
CLRF KeyInput_Timer
MOVLW KEY_SHORT
MOVWF KeyCode
RETURN
LONG_PRESS_KEY
BTFSC PORTB,_KEY_INPUT
GOTO LONG_PRESS_COUN
MOVF KeyCode,W
XORLW KEY_CLR
BTFSS STATUS,Z
GOTO LONG_PRESS_CLR
MOVLW KEY_LONG
MOVWF KeyCode
CLRF KeyInput_Timer
RETURN
LONG_PRESS_CLR
MOVLW KEY_CLR
MOVWF KeyCode
CLRF KeyInput_Timer
RETURN
LONG_PRESS_COUN
MOVF KeyCode,W
XORLW KEY_CLR
BTFSS STATUS,Z
GOTO LONG_PRESS_REP
MOVLW KEY_LONG
MOVWF KeyCode
RETURN
LONG_PRESS_REP
MOVLW KEY_REPEAT
MOVWF KeyCode
RETURN
KEY_INPUT_EXIT
MOVLW KEY_CLR
MOVWF KeyCode
RETURN
;---------------------------------------------------------------------
;Including Input volt AD detect,output volt AD detect,battery volt
;AD detect
;---------------------------------------------------------------------
INPUT_VOLT_ADC:
MOVLW 10H
MOVWF WR3 ;
CLRF WR8 ;进入采样总次数高位
CLRF WR9 ;低位
CLRF WR7 ;采样值累加高位
CLRF WR6 ;低位
CLRF WR1 ;采样点数高位
CLRF WR0 ;低位
VIn_loop
BCF INTCON,GIE
BSF STATUS,RP0
CLRF ADCON1
BCF STATUS,RP0
MOVLW 65H
MOVWF ADCON0 ;P0.4 V_ADC, Clock=Fosc/8
VIn_Conv_loop
BTFSC ADCON0,GO ;Check EOC bit
GOTO VIn_Conv_loop
MOVF ADRES,W
MOVWF VIn_ADValue
BSF INTCON,GIE
MOVF VIn_ADValue,W ;小信号判断
SUBLW VOLT_DC_HIGH ;LIMIT_2VHI
MOVWF WR2
BTFSC STATUS,C
GOTO Compare_c
COMF WR2
INCF WR2,F
Compare_c
MOVF WR2,W
SUBLW .2
BTFSS STATUS,C
GOTO not_base_point
BTFSS WR3,4
GOTO is_end_point
CLRF WR3
CLRF WR8
CLRF WR9
is_end_point
MOVLW HIGH MIN_SAMPLE_TIM
SUBWF WR1,W
BTFSC STATUS,Z
GOTO Low_bitComp
BTFSS STATUS,C
GOTO is_continue_sum
GOTO set_adc_over
Low_bitComp ;高位相等比较低位
MOVLW LOW MIN_SAMPLE_TIM
SUBWF WR0,W
BTFSS STATUS,C
GOTO is_continue_sum
GOTO set_adc_over
not_base_point
BTFSC WR3,4
GOTO VIn_loop
is_continue_sum
MOVLW VOLT_2VDC
SUBWF VIn_ADValue,F
BTFSC STATUS,C
GOTO add_ccongn
COMF VIn_ADValue
INCF VIn_ADValue,F
add_ccongn
MOVF VIn_ADValue,W
ADDWF WR6,F
BTFSC STATUS,C
INCF WR7,F
loading_sampSecon
INCF WR0,F
BTFSC STATUS,Z
INCF WR1,F ;次数累加
CALL Delay_test
GOTO VIn_loop
set_adc_over
MOVF WR0,W
XORWF WR1,W
BTFSS STATUS,Z
GOTO End_ACSample
_is_return_zero
CLRF VIn_ADValue
RETURN
End_ACSample
bcf STATUS,C
rrf WR1
RRF WR0
BSF PCLATH,3
CALL Div_16Bit ;(WR7,WR6)/(WR1,WR0)=(WR3,WR2)
BCF PCLATH,3
MOVF WR2,W
MOVWF VIn_ADValue
RETURN
;---------------------------------------------------------
OUTPUT_VOLT_ADC:
VOut_loop_next
MOVLW 0AH
MOVWF WR1
CLRF WR4
VOut_loop
BCF STATUS,RP0
BCF INTCON,GIE
BSF STATUS,RP0
CLRF ADCON1
BCF STATUS,RP0
MOVLW 8DH ;P0.5 V_ADC, Clock=Fosc/4
MOVWF ADCON0
VOut_Conv_loop
; CALL Delay_us
BTFSC ADCON0,GO ;Check EOC bit
GOTO VOut_Conv_loop
MOVF ADRES,0 ;Save high 8-bit
MOVWF VOut_ADValue ;First clear ADValue High/Low byte
BCF STATUS,RP0
BSF INTCON,GIE
SUBWF WR4,0
BTFSC STATUS,C
GOTO VOUT_ADC_NEXT
VOUT_ADC_EXCH
MOVF VOut_ADValue,0
MOVWF WR4
VOUT_ADC_NEXT
CALL Delay_1ms
DECFSZ WR1
GOTO VOut_loop
MOVF WR4,0
MOVWF VOut_ADValue
RETURN
;--------------------------------------------------------
BATT_VOLT_ADC
MOVLW 7
MOVWF WR2
MOVLW ADC_Buffer ;06bh
MOVWF WR0
MOVWF FSR
VBatt_loop
BCF INTCON,GIE
BSF STATUS,RP0
CLRF ADCON1
BCF STATUS,RP0
MOVLW 5DH
MOVWF ADCON0
VBatt_Conv_loop
BTFSC ADCON0,GO
GOTO VBatt_Conv_loop
MOVF ADRES,W
MOVWF VBatt_ADValue
BSF INTCON,GIE
MOVF VBatt_ADValue,W
MOVWF INDF ;6bh~71h
INCF FSR,F
DECFSZ WR2,F
GOTO VBatt_loop
CALL GET_MIDDLE
MOVF WR4,W
MOVWF VBatt_ADValue
RETURN
;============================================
GET_MIDDLE
MOVLW ADC_Buffer
MOVWF WR0
MOVWF WR1
INCF WR1,F
MOVLW 6
MOVWF WR9
SORT_NEXT_CLE
MOVF WR9,W
MOVWF WR8
SORT_NEXT_DATA
MOVF WR0,W
MOVWF FSR
MOVF INDF,W
MOVWF WR4
MOVF WR1,W
MOVWF FSR
MOVF INDF,W
MOVWF WR5
SUBWF WR4,W
BTFSC STATUS,C ;WR4>WR5?
GOTO SORT_SKIP
SORT_EXCHANGE
MOVF WR0,W
MOVWF FSR
MOVF WR5,W
MOVWF INDF
MOVF WR1,W
MOVWF FSR
MOVF WR4,W
MOVWF INDF
SORT_SKIP
INCF WR1,F
DECFSZ WR8,F
GOTO SORT_NEXT_DATA
INCF WR0,F
MOVF WR0,W
MOVWF WR1
INCF WR1,F
DECFSZ WR9,F
GOTO SORT_NEXT_CLE
MOVLW ADC_Buffer+3
MOVWF FSR
MOVF INDF,W
MOVWF WR4
RETURN
;-------------------------------------------------------
;每1秒钟运行一次,在无过载及无短路时对市电输入进行检测.
Detect_module:
MOVF Startup_Timer,F
BTFSS STATUS,Z
GOTO DETECT_MOD_EXIT
BTFSC UserFlag,DC_OverLoad
GOTO DETECT_MOD_EXIT
BTFSC UserFlag,ConvertShort
GOTO DETECT_MOD_EXIT ;过载/短路不在检测
CALL DET_AC_INPUT
CALL DET_POWER_CONV
DETECT_MOD_EXIT
RETURN
;===========================================
DET_AC_INPUT
MOVF Pow_Stataus,W
XORLW POWER_220VAC
BTFSS STATUS,Z
RETURN
MOVLW VIN_275V
SUBWF VIn_ADValue,W
BTFSS STATUS,C
GOTO DET_VIN_165V
DET_VIN_HIGH
MOVLW VOLT_HIGH
MOVWF Volt_Prot
MOVLW POWER_CONVERT
MOVWF Pow_Stataus
MOVLW CUT_START
MOVWF CutFlag
BSF UserFlag,AcTurnOff
MOVLW FOUR_SECOND
MOVWF ACDly_Timer
DET_AC_EXIT
RETURN
;==========================================
DET_VIN_RELAY3
MOVLW VIN_212V
SUBWF VIn_ADValue,W
BTFSC STATUS,C
GOTO DET_RELAY3_239V
MOVLW RelayReg3
MOVWF RelayState
RETURN
DET_RELAY3_239V
MOVLW VIN_242V
SUBWF VIn_ADValue,W
BTFSC STATUS,C
GOTO DET_RELAY3_HIGH
MOVLW RelayReg2
MOVWF RelayState
RETURN
DET_RELAY3_HIGH
MOVLW RelayReg1
MOVWF RelayState
RETURN
;======================================
DET_VIN_165V
MOVLW VIN_165V
SUBWF VIn_ADValue,W
BTFSC STATUS,C
GOTO DET_VIN_REG
DET_VIN_LOW
MOVLW VOLT_LOW
MOVWF Volt_Prot
MOVLW POWER_CONVERT
MOVWF Pow_Stataus
MOVLW CUT_START
MOVWF CutFlag
MOVF VIn_ADValue,W
XORLW .0
BTFSS STATUS,Z
GOTO AcMoreLow
BCF UserFlag,AcTurnOff
GOTO AcNotNormal
AcMoreLow
BSF UserFlag,AcTurnOff
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -