📄 pw48akmbrf5.asm
字号:
movwf COUNTERDZ
movwf COU_TEMP
movlw 0X4D
subwf SPBUF,0
btfsc STATUS,C
goto SETHX
bsf FLAG1,FZ
movlw 0X54
movwf PORTB
;------------------------------------------------------------
SETHX movf PC_TEMP,0 ;save current state
movwf PC_TEMP2
movf IBUF,0
sublw 0X10 ;YIN1.14 0X09
btfsc STATUS,C
goto CLRCOU
;------------------------------------------------------------------
; movf IBUF,0
; movwf DATAI2
; bcf STATUS,C
; rrf DATAI2
; bcf STATUS,C
; rrf DATAI2
; bcf STATUS,C
; rrf DATAI2
; movf COU_TEMP,0
; btfss STATUS,Z
; goto QBP
; movlw 0X6E ;20r/m
; subwf COU_TEMP1,0
; btfsc STATUS,C
; goto QBP
; movlw 0X49 ;30r/m
; subwf COU_TEMP1,0
; btfsc STATUS,C
; goto HLP2
; movlw 0X37 ;40r/m
; subwf COU_TEMP1,0
; btfsc STATUS,C
; goto HLP1
; movlw 0X09 ;0X0E
; subwf DATAI2,0
; btfss STATUS,C
; goto POVER
; movlw 0X09
; movwf DATAI2
; goto POVER
;HLP1 movlw 0X09 ;0X0D
; subwf DATAI2,0
; btfss STATUS,C
; goto POVER
; movlw 0X09
; movwf DATAI2
; goto POVER
;HLP2 movlw 0X09 ;0X0C
; subwf DATAI2,0
; btfss STATUS,C
; goto POVER
; movlw 0X09
; movwf DATAI2
; goto POVER
;QBP movlw 0X06 ;0X06
; subwf DATAI2,0
; btfss STATUS,C
; goto POVER
; movlw 0X06
; movwf DATAI2
;POVER movf DATAI2,0
; movwf PCOUNTER1
movf IBUF,0
movwf DATAI2
bcf STATUS,C
rrf DATAI2
bcf STATUS,C
rrf DATAI2
bcf STATUS,C
rrf DATAI2
bcf STATUS,C
rrf DATAI2
movf COU_TEMP,0
btfss STATUS,Z
goto QBP
movlw 0X49 ;30r/m
subwf COU_TEMP1,0
btfsc STATUS,C
goto QBP
movlw 0X2C ;50r/m
subwf COU_TEMP1,0
btfsc STATUS,C
goto HLP2
movlw 0X1F ;70r/m
subwf COU_TEMP1,0
btfsc STATUS,C
goto HLP1
movlw 0X06 ;0X0F
subwf DATAI2,0
btfss STATUS,C
goto POVER
movlw 0X06
movwf DATAI2
goto POVER
HLP1 movlw 0X05 ;0X0E
subwf DATAI2,0
btfss STATUS,C
goto POVER
movlw 0X05
movwf DATAI2
goto POVER
HLP2 movlw 0X04 ;0X0D
subwf DATAI2,0
btfss STATUS,C
goto POVER
movlw 0X04
movwf DATAI2
goto POVER
QBP movlw 0X03 ;0X09
subwf DATAI2,0
btfss STATUS,C
goto POVER
movlw 0X03
movwf DATAI2
POVER movf DATAI2,0
movwf PCOUNTER1
;-----------------------------------------------------------------
bsf FLAG1,HX1
movf CCPR1L,0
movwf CCPR1L_TEMP
clrf CCPR1L
bsf STATUS,RP0
bsf PIE1,TMR2IE
bcf STATUS,RP0
CLRCOU bsf FLAG0,ZD
;--------------------------------------------------------------------
SAME btfss FLAG2,RC ;YIN1.13
goto TBK ;YIN1.13
goto PRO_UV ;YIN1.13
TBK btfss FLAG1,BK
goto NBK
goto PRO_UV
NBK btfss FLAG1,FZ
goto HX
movlw 0X54
movwf PORTB
goto PRO_UV
HX movf PC_TEMP,0
movwf PC_TEMP1
bcf STATUS,C
rrf PC_TEMP1
rrf PC_TEMP1
rrf PC_TEMP1
movf PC_TEMP1,0
call CONVERT1
movwf PORTB
goto PRO_UV
;********************************************************************
PI
movf ILIMIT,0
subwf IBUF,0
btfss STATUS,Z
goto COCO
clrf Y
goto PIEND
COCO btfsc STATUS,C
goto EP
goto EN
;--------------------------------------------------------------------
EP
movf ILIMIT,0
subwf IBUF,0
movwf E ;E=IBUF-ILIMIT
movwf PROPOR
;--------------------------------------------------------------------
; bcf STATUS,C ;PROPOR=E/32
; rrf E
; bcf STATUS,C
; rrf E
bcf STATUS,C
rrf E
bcf STATUS,C
rrf E,0
movwf Y ;Y=PROPOR+INTERG
bsf FLAG0,FY
;--------------------------------------------------------------------
btfss FLAG0,FI
goto CE1
;--------------------------------------------------------------------
movf PROPOR,0 ;PROPOR>0,INTERG0>0
addwf INTERG0,0
movwf INTERG0
subwf L_INTERG,0
btfss STATUS,C
goto CE13
goto PIEND ;INTERG0<L_INTERG
CE13 clrf INTERG0 ;INTERG0>L_INTERG
incf Y
goto PIEND
;--------------------------------------------------------------------
CE1 movf PROPOR,0 ;PROPOR>0,INTERG0<0
subwf INTERG0,0
btfss STATUS,C
goto CE11
goto CE12
CE11 bsf FLAG0,FI
movf INTERG0,0 ;PROPOR>INTERG0&INTERG0<0&PROPOR>0
subwf PROPOR,0
movwf INTERG0
subwf L_INTERG,0
btfss STATUS,C
goto CE14
goto PIEND
CE14 clrf INTERG0
incf Y
goto PIEND
CE12 movwf INTERG0 ;PROPOR<INTERG0&INTERG0<0&PROPOR>0
goto PIEND
;--------------------------------------------------------------------
EN movf IBUF,0
subwf ILIMIT,0
movwf E ;E=ILIMIT-IBUF
movwf PROPOR
; bcf STATUS,C ;PROPOR=E/32
; rrf E
; bcf STATUS,C
; rrf E
bcf STATUS,C
rrf E
bcf STATUS,C
rrf E,0
movwf Y ;Y=PROPOR+INTRG
bcf FLAG0,FY
;--------------------------------------------------------------------
btfsc FLAG0,FI
goto CE2
;--------------------------------------------------------------------
movf PROPOR,0 ;PROPOR<0,INTERG0<0
addwf INTERG0,0
movwf INTERG0
subwf L_INTERG,0
btfss STATUS,C
goto CE23
goto PIEND
CE23 clrf INTERG0 ;INTERG0>L_INTERG
incf Y
goto PIEND
;--------------------------------------------------------------------
CE2 movf PROPOR,0 ;PROPOR<0,INTERG0>0
subwf INTERG0,0
btfss STATUS,C
goto CE21
goto CE22
CE21 bcf FLAG0,FI
movf INTERG0,0 ;PROPOR>INTERG0&INTERG0>0&PROPOR<0
subwf PROPOR,0
movwf INTERG0
subwf L_INTERG,0
btfss STATUS,C
goto CE24
goto PIEND
CE24 clrf INTERG0
incf Y
goto PIEND
CE22 movwf INTERG0 ;PROPOR<INTERG0&INTERG0>0&PROPOR<0
PIEND return
;********************************************************************
CONVERT1 bcf PCLATH,0
bcf PCLATH,1
bsf PCLATH,2
addwf PCL
TABLE retlw 0X54
retlw 0X64
retlw 0X16
retlw 0X46
retlw 0X58
retlw 0X70
retlw 0X1C
retlw 0X54
;********************************************************************
CONVERT
bcf PCLATH,0
bcf PCLATH,1
bsf PCLATH,2
addwf PCL
TABLE1 retlw 0X4B ;0
retlw 0X4B ;1
retlw 0X4C ;2
retlw 0X4C ;3
retlw 0X4D ;4
retlw 0X4E ;5
retlw 0X51 ;6
retlw 0X55 ;7
retlw 0X58 ;8
retlw 0X5B ;9
retlw 0X5E ;10
retlw 0X62 ;1
retlw 0X65 ;2
retlw 0X68 ;3
retlw 0X6B ;4
retlw 0X6F ;5
retlw 0X72 ;6
retlw 0X74 ;7
retlw 0X76 ;8
retlw 0X78 ;9
retlw 0X7B ;20
retlw 0X7E ;1
retlw 0X81 ;2
retlw 0X85 ;3
retlw 0X88 ;4
retlw 0X8B ;5
retlw 0X8F ;6
retlw 0X92 ;7
retlw 0X95 ;8
retlw 0X98 ;9
retlw 0X9C ;30
retlw 0X9F ;1
retlw 0XA2 ;2
retlw 0XA5 ;3
retlw 0XA8 ;4
retlw 0XAB ;5
retlw 0XAD ;6
retlw 0XAF ;7
retlw 0XB2 ;8
retlw 0XB5 ;9
retlw 0XB8 ;40
retlw 0XBB ;1
retlw 0XBF ;2
retlw 0XC2 ;3
retlw 0XC5 ;4
retlw 0XC9 ;5
retlw 0XCC ;6
retlw 0XCF ;7
retlw 0XD2 ;8
retlw 0XD5 ;9
retlw 0XD8 ;50
retlw 0XDB ;1
retlw 0XDF ;2
retlw 0XE1 ;3
retlw 0XE3 ;4
retlw 0XE5 ;5
retlw 0XEC ;6
retlw 0XEE ;7
retlw 0XF0 ;8
retlw 0XF2 ;9
retlw 0XF4 ;60
retlw 0XF6 ;1
retlw 0XF8 ;2
retlw 0XFA ;3
retlw 0XFC ;4
retlw 0XFE ;5
retlw 0XFF ;6
retlw 0XFF ;7
retlw 0XFF ;8
retlw 0XFF ;9
retlw 0XFE ;70
retlw 0XFF ;1
retlw 0XFF ;2
retlw 0XFF ;3
retlw 0XFF ;4
;********************************************************************
ISUB bcf PCLATH,0 ;I=9~12A
bcf PCLATH,1
bsf PCLATH,2 ;YIN1.14
addwf PCL
TABLE2 retlw 0X5F ;0------120r/m
retlw 0X5E ;1------110r/m
retlw 0X5D ;2------100r/m
retlw 0X5C ;3------90r/m
retlw 0X5B ;4
retlw 0X5A ;5------80r/m
retlw 0X59 ;6
retlw 0X58 ;7------70r/m
retlw 0X57 ;8
retlw 0X56 ;9------60r/m
retlw 0X55 ;10
retlw 0X54 ;1
retlw 0X54 ;2
retlw 0X53 ;3------50r/m
retlw 0X53 ;4
retlw 0X52 ;5
retlw 0X52 ;6
retlw 0X52 ;7
retlw 0X51 ;8------40r/m
retlw 0X51 ;9
retlw 0X51 ;20
retlw 0X51 ;1
retlw 0X51 ;2
retlw 0X50 ;3
retlw 0X50 ;4
retlw 0X50 ;5
retlw 0X50 ;6
retlw 0X50 ;7
retlw 0X50
;ISUB bsf PCLATH,0 ;I=10~12A
; bsf PCLATH,1
; addwf PCL
;TABLE2 retlw 0X60 ;0
; retlw 0X5E ;1
; retlw 0X5C ;2
; retlw 0X5A ;3
; retlw 0X58 ;4
; retlw 0X57 ;5
; retlw 0X56 ;6
; retlw 0X55 ;7
; retlw 0X54 ;8
; retlw 0X53 ;9
; retlw 0X53 ;10
; retlw 0X52 ;1
; retlw 0X52 ;2
; retlw 0X52 ;3
; retlw 0X52 ;4
; retlw 0X51 ;5
; retlw 0X51 ;6
; retlw 0X51 ;7
; retlw 0X51 ;8
; retlw 0X51 ;9
; retlw 0X50 ;20
; retlw 0X50 ;1
; retlw 0X50 ;2
; retlw 0X50 ;3
; retlw 0X50 ;4
; retlw 0X50 ;5
; retlw 0X50 ;6
; retlw 0X50 ;7
; retlw 0X50 ;8
; retlw 0X50 ;9
;********************************************************************
; A/D interrup service subroutine
;--------------------------------------------------------------------
AD_INT_SER bcf PIR1,ADIF ;Clear A/D flag
incf ROTACHAN ;Current channel flag
movlw 0X04 ;(00-AD0-POWER;01-AD1-SP;10-AD2-SL;11-AD3-I)
subwf ROTACHAN,0
btfss STATUS,Z
goto CH1
clrf ROTACHAN ;read channel 0 result (ROTACHAN=0)
CH0 movf ADRES,0
movwf ADBUF36V ;A/D result load to power source buffer
bsf FLAG0,V36 ;Set the voltage source sample over flag
movlw 0X89 ;Select channel 1
movwf ADCON0
goto FINSH0
;---------------------------------------------------------------------------------
;read channel 1 result (ROTACHAN=1)
CH1 movlw 0X01
subwf ROTACHAN,0
btfss STATUS,Z
goto CH2
movf ADRES,0
movwf ADBUFSPV ;A/D result load to speed buffer
bsf FLAG0,SPV
movlw 0X91 ;select current channel 2
movwf ADCON0
goto FINSH0
;---------------------------------------------------------------------------------
;read channel 2 result (ROTACHAN=2)
CH2 movlw 0X02
subwf ROTACHAN,0
btfss STATUS,Z
goto CH3
movf ADRES,0
movwf PWMSPL ;A/D result load to speed buffer
bsf FLAG0,SPL
movlw 0X99 ;select current channel 3
movwf ADCON0
goto FINSH0
;---------------------------------------------------------------------------------
;read channel 3 result (ROTACHAN=3)
CH3 movf ADRES,0
movwf ADBUFI ;A/D result load to current buffer
bsf FLAG0,I ;Set the current sample over flag
movlw 0X81 ;Select channel 0
movwf ADCON0
;---------------------------------------------------------------------------------
FINSH0 swapf STATUS_TEMP,W
movwf STATUS
swapf W_TEMP,F
swapf W_TEMP,W
retfie
;******************************************************************
INT_SER
bcf INTCON,INTE
bcf INTCON,INTF
;------------------------------------------------------------------
bsf STATUS,RP0
btfss OPTION_REG,INTEDG
goto NORMAL
bcf OPTION_REG,INTEDG
bcf STATUS,RP0
movf COM1,0
subwf TW1,0
btfsc STATUS,Z
goto COMTW
btfsc STATUS,C
goto OV1
goto TWOV
COMTW movf COM,0
subwf TW,0
btfsc STATUS,C
goto OV1
TWOV movf TIMER3,0
movwf ASPD
bcf FLAG1,T_OV ;Plus with is too wide
clrf T_BASE ;Time small than T_BASE is equal to speed
movf TEMP_T3,0 ;Move the initial PWM duty value to TEMP_T3
movwf TIMER3
OV1 clrf TW
clrf TW1
goto INTOUT
;------------------------------------------------------------------
NORMAL bsf OPTION_REG,INTEDG
bcf STATUS,RP0
movf TW,0
movwf COM
clrf TW
movf TW1,0
movwf COM1
clrf TW1
INTOUT bsf INTCON,INTE ;open INT interrupt
swapf STATUS_TEMP,W
movwf STATUS
swapf W_TEMP,F
swapf W_TEMP,W
retfie
;******************************************************************
TMR0_INT bcf INTCON,T0IF
bsf ADCON0,GO ;start A/D
;------------------------------------------------------------------
btfss FLAG2,DZIN
goto DECOUT
incf COUNTERDZ1 ;DZ counter
btfss STATUS,Z
goto INTW
movlw 0XFF
subwf COUNTERDZ,0
btfsc STATUS,Z
goto INTW
incf COUNTERDZ
movf COUNTERDZ,0
movwf COU_TEMP
goto INTW
DECOUT incf COUNTERDZ1 ;DZ counter
btfss STATUS,Z
goto INTW
movf COUNTERDZ,0
btfss STATUS,Z
decf COUNTERDZ
;------------------------------------------------------------------
INTW incf TW ;use in assist to judje F/R
btfss STATUS,Z
goto OUT
movlw 0XF0
subwf TW1,0
btfsc STATUS,C
goto OUT
incf TW1 ;plus period counter
OUT swapf STATUS_TEMP,W
movwf STATUS
swapf W_TEMP,F
swapf W_TEMP,W
retfie
;******************************************************************
TMR1_INT bcf PIR1,TMR1IF
movf TEMP_L,0 ;Load TIMER1_L value
movwf TMR1L
movf TEMP_H,0 ;Load TIMER1_H value
movwf TMR1H ;T1 delay about 6ms
;------------------------------------------------------------------
TWCOV btfsc FLAG1,T_OV ;judge if have T_BASE delay over flag
goto DECRE
incf T_BASE
movf T_V_COM,0 ;judge if T_BASE delay over
subwf T_BASE,0
btfss STATUS,Z
goto NOTSUB
bsf FLAG1,T_OV
DECRE movf TIMER3,0 ;decrease PWM duty cycle
btfss STATUS,Z
goto DEC
movf ASPD,0
btfss STATUS,Z
decf ASPD
goto NOTSUB
DEC decf TIMER3 ;decrease speed
movf ASPD,0 ;if TIMER3 less than CCPR1L
subwf TIMER3,0 ;decrease now speed
btfsc STATUS,C
goto NOTSUB
movf ASPD,0
btfss STATUS,Z
decf ASPD
NOTSUB swapf STATUS_TEMP,W
movwf STATUS
swapf W_TEMP,F
swapf W_TEMP,W
retfie
;********************************************************************
TMR2_INT bcf PIR1,TMR2IF
decfsz PCOUNTER
goto T2OVER
bsf STATUS,RP0
bcf PIE1,TMR2IE
bcf STATUS,RP0
movf PCOUNTER1,0
movwf PCOUNTER
movf CCPR1L_TEMP,0
movwf CCPR1L
bcf FLAG1,HX1
T2OVER swapf STATUS_TEMP,W
movwf STATUS
swapf W_TEMP,F
swapf W_TEMP,W
retfie
;********************************************************************
INT_RB movf PORTB,0
bcf INTCON,RBIF
incf COUNTERB0
btfss STATUS,Z
goto RBOV
incf COUNTERB1
movlw 0X04
subwf COUNTERB1,0
btfsc STATUS,C
goto EOR
RBOV swapf STATUS_TEMP,W
movwf STATUS
swapf W_TEMP,F
swapf W_TEMP,W
retfie
;********************************************************************
;delay subroutine
DELA clrf D1
clrf D2
L2 decfsz D2
goto L1
goto DELAOV
L1 decfsz D1
goto L1
clrwdt
goto L2
DELAOV
return
;********************************************************************
;Delay X*DELA subroution
DELAY movlw 0X04
movwf DEAT
call DELA
clrwdt
decfsz DEAT
goto $-3
return
;******************************************************************
end ; directive 'end of program'
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -