📄 pw48akmbrf5.asm
字号:
#include <P16F73.inc>
;***** VARIABLE DEFINITIONS**************************************
W_TEMP EQU 0X20 ;variable used for context saving
STATUS_TEMP EQU 0X21 ;variable used for context saving
;----------------------------------------------------------------
SPBUF EQU 0X22 ;use in ADJUST subroution
SPBUF1 EQU 0X23 ;pre-buffer of speed
ADBUFSPV EQU 0X24 ;result of A/D(speed)
;----------------------------------------------------------------
ASPD EQU 0X25 ;assist value
ASPD0 EQU 0X26 ;old state of ASPD
TEMP_T3 EQU 0X27 ;initial value of TIMER3
TIMER3 EQU 0X28 ;sensor speed counter
T_BASE EQU 0X29 ;timer base counter
T_V_COM EQU 0X2A ;timer base counter compare
;----------------------------------------------------------------
ROTACHAN EQU 0X30 ;rotate A/D
ADBUF36V EQU 0X31 ;result of voltage A/D
PWMHL EQU 0X32
;----------------------------------------------------------------
DATAI1 EQU 0X35 ;old state
DATAI2 EQU 0X36
IBUF EQU 0X37 ;after filter
ILIMIT EQU 0X38 ;current limit
ADBUFI EQU 0X39 ;Current A/D result
;---------------------------------------------------------------
V36H EQU 0X3A ;used in voltage display
V36M EQU 0X3B
V36L EQU 0X3C
V36UV EQU 0X3D
;----------------------------------------------------------------
PWMSPL EQU 0X3E ;speed limit
PWMXZ EQU 0X3F ;PWM limit
DEAT EQU 0X40 ;used in time delay
TEMP_H EQU 0X41 ;T1H temporary buffer
TEMP_L EQU 0X42 ;T1L temporary buffer
PWM_TEMP EQU 0X43 ;the large of SPBUF and ASPD temporary buffer
PWM_TEMP0 EQU 0X44 ;the old state of PWM_TEMP
PWM_LM EQU 0X45 ;PWM_TEMP low limit
PWMC EQU 0X46 ;PWM out put value
PWM_V EQU 0X47 ;under voltage process
PWMSP EQU 0X48
PC_TEMP EQU 0X49 ;PORTC temporary value(hull singal)
PC_TEMP1 EQU 0X4A ;old state of PC_TEMP
PC_TEMP2 EQU 0X4B
TW EQU 0X4C ;T0 counter L
TW1 EQU 0X4D ;T0 counter H
COM EQU 0X4E ;old state of TW
COM1 EQU 0X4F ;old state of TW1
CCPR1L_TEMP EQU 0X50
;----------------------------------------------------------------
PROPOR EQU 0X51
INTERG0 EQU 0X52
L_INTERG EQU 0X53 ;limit INTERG
E EQU 0X54
Y EQU 0X55
;----------------------------------------------------------------
D1 EQU 0X56 ;used in delay
D2 EQU 0X57
D3 EQU 0X58
COUNTER1 EQU 0X59 ;used in break
COUNTER2 EQU 0X5A ;used in wl
COUNTER3 EQU 0X5B
COUNTER4 EQU 0X5C
COUNTER5 EQU 0X5D
COUNTER6 EQU 0X5E
COUNTERB0 EQU 0X5F
COUNTERB1 EQU 0X60
SAMCOUNT EQU 0X61 ;convert phase
C_FUN1 EQU 0X62 ;used in function convert
COUNTERDZ EQU 0X63
COUNTERDZ1 EQU 0X64
COU_TEMP EQU 0X65
COU_TEMP1 EQU 0X66
COUPASE EQU 0X67
PCOUNTER EQU 0X68
PCOUNTER1 EQU 0X69
COUNTERBK0 EQU 0X6A
COUNTERBK1 EQU 0X6B
COUNTERREA EQU 0X6C
;----------------------------------------------------------------
DISPR EQU 0X6D
DAS EQU 0 ;display electric
DEL EQU 1 ;display assist
DSC EQU 2 ;display scurise
DVHH EQU 3
DVH EQU 4
DVM EQU 5
DVL EQU 6
DVU EQU 7
;----------------------------------------------------------------
FLAG0 EQU 0X6E ;A/D and normal flag
SPV EQU 0 ;speed voltage a/d detect
V36 EQU 1 ;power voltage a/d detect
I EQU 2 ;current a/d detect
WL EQU 3 ;stabilify current flag
FI EQU 4 ;INTERG P/N flag
FY EQU 5 ;PI out P/N flag
ZD EQU 6
SPL EQU 7
;----------------------------------------------------------------
FLAG1 EQU 0X6F
AE EQU 0 ;AE=1,assist;AE=0,electric
FUN EQU 1
FUNCON EQU 2
FC EQU 3
BK EQU 4 ;break flag
T_OV EQU 5 ;T_BASE counter over flag
HX1 EQU 6
FZ EQU 7
;----------------------------------------------------------------
FLAG2 EQU 0X70 ;ALARM
ASPV EQU 0
ABK EQU 1
ABUTTON EQU 2
AASSIST EQU 3
ADZ EQU 4
DZIN EQU 5
RC EQU 6 ;REA YIN1.10
VHC EQU 7 ;voltage stagnant flag
;----------------------------------------------------------------
COUNTV36HN EQU 0X71
COUNTV36MN EQU 0X72
COUNTV36LN EQU 0X73
COUNTV36UN EQU 0X74
COUNTV36UL EQU 0X75
COUNTV36UV EQU 0X76
COUNCBK EQU 0X77
;****************************************************************
ORG 0X0000 ; processor reset vector
clrf PCLATH ; ensure page bits are cleared
goto MAIN ; go to beginning of program
nop
goto EOR
;****************************************************************
ORG 0X0004 ; interrupt vector location
movwf W_TEMP ; save W regist
swapf STATUS,W ; save STATUS regist
clrf STATUS
movwf STATUS_TEMP
;----------------------------------------------------------------
;judge interrupt
btfsc INTCON,RBIF ;YIN1.11
goto INT_RB
btfsc INTCON,INTF
goto INT_SER ;goto external interrupt routing
btfsc INTCON,T0IF
goto TMR0_INT ;goto TIMER0 interrupt routing
btfsc PIR1,TMR1IF
goto TMR1_INT ;goto TIMER1 interrupt routing
btfsc PIR1,ADIF
goto AD_INT_SER ;goto A/D interrupt routing
btfsc PIR1,TMR2IF
goto TMR2_INT ;goto TIMER2 interrupt routing
EOR bcf STATUS,RP0
bcf INTCON,GIE
movlw 0X54
movwf PORTB
movlw 0XFF
movwf CCPR1L
clrf CCPR2L
clrwdt
goto EOR
;****************************************************************
org 0X30
MAIN
;****************************************************************
;initializing ports
bsf STATUS,RP0 ;select bank 1
movlw 0X1F ;configure RA pins direction
movwf TRISA ;set RA2 output,othes input
movlw 0X81
movwf TRISB ;set RB0 and RB7 input,othes output
movlw 0X39
movwf TRISC
bcf STATUS,RP0 ;select bank0
clrf PORTA
movlw 0X54
movwf PORTB
bsf PORTC,2
;*****************************************************************
;initializing usart
bsf STATUS,RP0
movlw 0XB4
movwf TXSTA
movlw 0X04
movwf SPBRG
bcf STATUS,RP0
movlw 0XA0
movwf RCSTA
movlw 0XFF
movwf TXREG
;****************************************************************
;initializing interrupt
bcf STATUS,RP0 ;select band0
clrf INTCON ;close all interrupt,mask INTE,RBIE
bsf STATUS,RP0 ;select bank1
clrf PIE1
clrf PIE2
;*****************************************************************
;initializing timer
bsf STATUS,RP0
movlw 0X84 ;Prescaler is assigned to the T0 and rate is 1:16
movwf OPTION_REG ;interrupt on rising edge of RB0 pin
bcf STATUS,RP0 ;increment T0 when low-to-high transition on RA4 pin
clrf T1CON ;internal clock(Fosc/4)
clrf T2CON ;T2 prescale is 1:1
clrf TMR1L
clrf TMR1H
;****************************************************************
;initializing a/d convert
bsf STATUS,RP0
movlw 0X00 ;a/d port configuration
movwf ADCON1 ;RA0(A) RA1(A) RA2(A) RA3(A) Vref=Vdd
bcf STATUS,RP0
movlw 0X81 ;configuration a/d modle
movwf ADCON0 ;Conversion clock=Fosc/32 select channel0(36V)
movlw 0X03
movwf ROTACHAN
clrf ADRES ;clear A/D result Reg
;*****************************************************************
;initializing pwm
bsf STATUS,RP0
movlw 0XB3
movwf PR2
bcf STATUS,RP0
movlw 0X0C
movwf CCP1CON ;Set CCP module to PWM mode
movwf CCP2CON
clrf TMR2 ;clear Timer2
movlw 0XFF
movwf CCPR1L
movwf CCPR1H
movwf CCPR1L_TEMP
clrf CCPR2L
;*****************************************************************
;initializing regist
bcf STATUS,RP0
movlw 0XA5 ;YIN1.14 initializing power voltage reference point
movwf V36H ;0XA5-51V 0X7B-38V
movlw 0X9B ;0X9B-48V 0X74-36V
movwf V36M
movlw 0X91 ;0X91-45V 0X6D-34V
movwf V36L
movlw 0X86 ;0X86-41.5V 0X64-31.5V
movwf V36UV
movlw 0X4B
movwf PWM_LM
movlw 0X60
movwf ILIMIT
movlw 0X05
movwf L_INTERG
movlw 0X02
movwf PCOUNTER
movwf PCOUNTER1
movlw 0X0C
movwf COUPASE
movlw 0X01
movwf COUNTERDZ
movwf COU_TEMP
movlw 0X4B
movwf SPBUF
movlw 0X10
movwf TEMP_L
movwf TEMP_H
clrf PWM_V
clrf FLAG0
clrf FLAG1
clrf FLAG2
clrf TIMER3
clrf ASPD
clrf ASPD0
clrf COUNTER1
clrf COUNTER2
clrf COUNTER3
clrf COUNTER6
clrf COUNTERB0
clrf COUNTERB1
clrf SAMCOUNT
clrf DATAI1
clrf COUNTERBK0
clrf COUNTERBK1
clrf COUNTERREA
clrf COUNTV36HN
clrf COUNTV36MN
clrf COUNTV36LN
clrf COUNTV36UN
clrf COUNTV36UL
clrf COUNTV36UV
movlw 0XFF
movwf TXREG
movwf DISPR
movlw 0XE0
movwf COUNCBK
;******************************************************************
;Power on initial detect
DETECT
bsf STATUS,RP0
movlw 0X41
movwf PIE1 ;mask T2,openT1 and A/D
bcf STATUS,RP0
bsf INTCON,T0IE
bsf INTCON,PEIE
bsf INTCON,INTE ;open INT interrupt
clrf PIR1 ;clear a/d flag
clrf PIR2 ;clear a/d flag
bcf INTCON,T0IF
bcf INTCON,INTF
bcf INTCON,RBIF
bsf INTCON,GIE ;Open the globe interrupt enable
bsf INTCON,RBIE ;YIN1.11
movlw 0XFF
movwf CCPR1L ;PWM duty cycle register
movwf CCPR1H
movlw 0X5A
movwf CCPR2L
bsf T2CON,TMR2ON ;turn on Timer2
bsf T1CON,TMR1ON
call DELAY
;****************************************************************************
BK_DETECT btfsc PORTC,0
goto BKOVER
incf C_FUN1
movlw 0X30
subwf C_FUN1,0
btfss STATUS,Z
goto BK_DETECT
bsf FLAG2,ABK
BKOVER clrf C_FUN1
SP_DETECT btfss FLAG0,SPV ;Judge speed adjust voltage sample flag
goto $-1
bcf FLAG0,SPV
movf ADBUFSPV,0
movwf SPBUF1 ;Read speed adjust value to SPBUF1
movlw 0X50 ;If speed voltage is high than 1.5V,than alarm
subwf SPBUF1,0
btfsc STATUS,C
bsf FLAG2,ASPV
BUTTON btfsc PORTA,4
goto ASSIST
incf C_FUN1
movlw 0X30
subwf C_FUN1,0
btfss STATUS,Z
goto BUTTON
bsf FLAG2,ABUTTON
ASSIST movf ASPD,0
btfss STATUS,Z
goto SETA
goto RESETA
SETA bsf FLAG2,AASSIST
goto A_OUT
RESETA bcf FLAG2,AASSIST
A_OUT clrf C_FUN1
movf FLAG2,0
btfsc STATUS,Z
goto START
;------------------------------------------------------------------
movlw 0XFF
movwf COUNTER3
movlw 0X10
movwf COUNTER4
DILVER0 movf DISPR,0
movwf TXREG
SP_DISPLAY movlw 0X4C ;If speed voltage is high than 1.5V,than alarm
subwf ADBUFSPV,0
btfsc STATUS,C
goto RIGHT
bsf DISPR,DVH
goto SPOVER
RIGHT decfsz COUNTER2
goto SPOVER
incf SPBUF1
btfss STATUS,Z
goto SPOVER
movf ADBUFSPV,0
movwf SPBUF1 ;Read speed adjust value to SPBUF1
btfsc DISPR,DVH
goto INV_DVH
bsf DISPR,DVH
movf DISPR,0
movwf TXREG
goto SPOVER
INV_DVH bcf DISPR,DVH
movf DISPR,0
movwf TXREG
SPOVER
;------------------------------------------------------------------
BK_DISPLAY btfss PORTC,0 ;break detect
goto SETB
btfss DISPR,DEL
goto DILVER1
goto BT_DISPLAY
DILVER1 bsf DISPR,DEL
movf DISPR,0
movwf TXREG
goto BT_DISPLAY
SETB btfsc DISPR,DEL
goto DILVER2
goto BT_DISPLAY
DILVER2 bcf DISPR,DEL
movf DISPR,0
movwf TXREG
;------------------------------------------------------------------
BT_DISPLAY btfss PORTA,4 ;button detect
goto SETB1
btfss DISPR,DSC
goto DILVER3
goto AS_DISPLAY
DILVER3 bsf DISPR,DSC
movf DISPR,0
movwf TXREG
goto AS_DISPLAY
SETB1 btfsc DISPR,DSC
goto DILVER4
goto AS_DISPLAY
DILVER4 bcf DISPR,DSC
movf DISPR,0
movwf TXREG
;------------------------------------------------------------------
AS_DISPLAY
; clrwdt ;YIN1.13
btfss PORTB,0 ;assist detect
goto SETB2
btfss DISPR,DAS
goto DILVER5
goto DLY
DILVER5 bsf DISPR,DAS
movf DISPR,0
movwf TXREG
goto DLY
SETB2 btfsc DISPR,DAS
goto DILVER6
goto DLY
DILVER6 bcf DISPR,DAS
movf DISPR,0
movwf TXREG
DLY decfsz COUNTER1
goto SP_DISPLAY
decfsz COUNTER3
goto DILVER1
decfsz COUNTER4
goto SP_DISPLAY
;******************************************************************
START clrf PWMC
clrf PWM_TEMP
clrf PWMSP
clrf ASPD
clrf ASPD0
clrf SAMCOUNT
bsf FLAG1,FZ
DIGIN0 movf PORTC,0 ;read PORTC to W
andlw 0X38
xorwf PC_TEMP
btfss STATUS,Z
goto NSAME0
movwf PC_TEMP
incf SAMCOUNT
movlw 0X03
subwf SAMCOUNT,0
btfsc STATUS,Z
goto FIND0
goto DIGIN0
NSAME0 movwf PC_TEMP
clrf SAMCOUNT
goto DIGIN0
FIND0 movf PC_TEMP,0
movwf PC_TEMP2
;******************************************************************
PRO_UV btfss FLAG0,V36 ;Test power source sample flag
goto VEND
bcf FLAG0,V36
;------------------------------------------------------------------
movf V36UV,0 ;Compare now source voltage with reference voltage
subwf ADBUF36V,0
btfss STATUS,C
goto LNEXT1 ;Now under voltage reference
goto LNEXT2 ;Now not under voltage reference
;------------------------------------------------------------------
LNEXT1
; incf COUNTV36UL ;zhj
; clrf COUNTV36UV ;zhj
; movlw 0X10 ;zhj
; subwf COUNTV36UL,0 ;zhj
; btfss STATUS,C ;zhj
; goto ZHJBZ1 ;zhj
; clrf COUNTV36UL ;zhj
bcf DISPR,DVU ;Turn on under voltage LED
bsf DISPR,DVL
ZHJBZ1 movlw 0XB4
subwf PWM_V,0
btfss STATUS,Z ;YIN1.16 ;PWM_V<0XB4
incf PWM_V
goto UVOVER
LNEXT2
; incf COUNTV36UV ;zhj
; clrf COUNTV36UL ;zhj
; movlw 0X10 ;zhj
; subwf COUNTV36UV,0 ;zhj
; btfss STATUS,C ;zhj
; goto ZHJBZ2 ;zhj
; clrf COUNTV36UV ;zhj
bsf DISPR,DVU ;Turn off under voltage LED
bcf DISPR,DVL
ZHJBZ2 movf PWM_V,0
btfss STATUS,Z ;PWM_V>=0
decf PWM_V
UVOVER
;********************************************************************************
VOLT_DISP
movf DISPR,0
movwf TXREG
movf V36H,0
subwf ADBUF36V,0
btfss STATUS,C
goto VOLMID
VOLHIG ;voltage greate then 38V
; incf COUNTV36HN ;zhj
; clrf COUNTV36MN ;zhj
; clrf COUNTV36LN ;zhj
; clrf COUNTV36UN ;zhj
; movlw 0X10 ;zhj
; subwf COUNTV36HN,0 ;zhj
; btfss STATUS,C ;zhj
; goto ZHJBZ3 ;zhj
; clrf COUNTV36HN ;zhj
bcf DISPR,DVHH
bcf DISPR,DVH
bcf DISPR,DVM
ZHJBZ3 movlw 0XD2 ;75%
movwf TEMP_T3
movlw 0X1B
movwf T_V_COM
movlw 0XD0
movwf TEMP_H
movlw 0X43
movwf TEMP_L
goto VEND
VOLMID ;voltage greate then 36V
movf V36M,0
subwf ADBUF36V,0
btfss STATUS,C
goto VOLLOW
; incf COUNTV36MN ;zhj
; clrf COUNTV36HN ;zhj
; clrf COUNTV36LN ;zhj
; clrf COUNTV36UN ;zhj
; movlw 0X10 ;zhj
; subwf COUNTV36MN,0 ;zhj
; btfss STATUS,C ;zhj
; goto ZHJBZ4 ;zhj
; clrf COUNTV36MN ;zhj
bsf DISPR,DVHH
bcf DISPR,DVH
bcf DISPR,DVM
ZHJBZ4 movlw 0XDB ;80%
movwf TEMP_T3
movlw 0X1D
movwf T_V_COM
movlw 0XD3
movwf TEMP_H
movlw 0X4F
movwf TEMP_L
goto VEND
VOLLOW ;voltage greate then 34V
movf V36L,0
subwf ADBUF36V,0
btfss STATUS,C
goto UNDER
; incf COUNTV36LN ;zhj
; clrf COUNTV36HN ;zhj
; clrf COUNTV36MN ;zhj
; clrf COUNTV36UN ;zhj
; movlw 0X10 ;zhj
; subwf COUNTV36LN,0 ;zhj
; btfss STATUS,C ;zhj
; goto ZHJBZ5 ;zhj
; clrf COUNTV36LN ;zhj
bsf DISPR,DVHH
bsf DISPR,DVH
bcf DISPR,DVM
ZHJBZ5 movlw 0XE4 ;85%
movwf TEMP_T3
movlw 0X1F
movwf T_V_COM
movlw 0XD5
movwf TEMP_H
movlw 0XFF
movwf TEMP_L
goto VEND
UNDER ;voltage great then 32V
; incf COUNTV36UN ;zhj
; clrf COUNTV36HN ;zhj
; clrf COUNTV36MN ;zhj
; clrf COUNTV36LN ;zhj
; movlw 0X10 ;zhj
; subwf COUNTV36UN,0 ;zhj
; btfss STATUS,C ;zhj
; goto ZHJBZ6 ;zhj
; clrf COUNTV36UN ;zhj
bsf DISPR,DVHH
bsf DISPR,DVH
bsf DISPR,DVM
ZHJBZ6 movlw 0XE4 ;85%
movwf TEMP_T3
movlw 0X1F
movwf T_V_COM
movlw 0XD5
movwf TEMP_H
movlw 0XFF
movwf TEMP_L
VEND
;*****************************************************************
BREAK
btfss PORTC,0 ;Pull PORTC<0>,breaker
goto C0_LOW
C0_HIGH movf COUNTER1,0
btfss STATUS,Z
decf COUNTER1
btfss FLAG1,BK
goto BK_END
movlw 0X01 ;zhaojun
addwf COUNCBK,1 ;zhaojun
btfsc STATUS,C ;zhaojun
goto CLFLAGBK ;zhaojun 溢出
goto CBK_BAOCHI08 ;zhaojun 管子开通占空比逐渐减小
CLFLAGBK btfss FLAG1,BK
goto BK_END
bcf FLAG1,BK ;COUNTER1=0,abrogate break state
movlw 0XFF
movwf CCPR1L
clrf COUNTERBK0
clrf COUNTERBK1
clrf PWMC ;ELECTRICIZE
clrf PWM_TEMP
clrf PWMSP ;ELECTRICIZE
clrf COUNTERDZ ;YIN1.13
bcf FLAG2,ADZ ;YIN1.13
movlw 0X54 ;YIN1.13
movwf PORTB ;YIN1.13
movlw 0XE0 ;zhj
movwf COUNCBK ;zhj
bcf PORTA,5 ;zhj
goto BK_END ;zhj
C0_LOW movlw 0X30
subwf COUNTER1,0
btfss STATUS,Z
goto BNEXT2
btfsc FLAG1,BK
goto CBK
bcf FLAG2,ADZ
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -