⭐ 欢迎来到虫虫下载站! | 📦 资源下载 📁 资源专辑 ℹ️ 关于我们
⭐ 虫虫下载站

📄 pw48akmbrf5.asm

📁 这是电动自行车控制程序
💻 ASM
📖 第 1 页 / 共 3 页
字号:
		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 + -