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

📄 motor_28.asm

📁 pic得电机控制程序
💻 ASM
📖 第 1 页 / 共 3 页
字号:
	BTFSC	STATUS,CARRY	; >27				13
	GOTO	PWM28		;				14-15
	GOTO	$+1		;				15-16
	GOTO	$+1		;				17-18
;.PWM2................................................................
	MOVF	PWM2,0		;				19
	MOVWF	GPIO		;				20
;^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^
	MOVF	GPIOOUT,0	;......PWM.....PWM1....PWM2.....21
	MOVWF	PWM1		;		ON		22
	MOVWF	PWM2		;			ON	23
	IORLW	(MOTOR1|MOTOR2)	;				24
	MOVWF	PWM		;	OFF			25
	NOP			;011____________________________26
	GOTO	EXOR		;				27-28
;---------------------------------------------------------------------
PWM1_19	MOVLW	00001101b	; (10+3)			8
	SUBWF	SOLL,0		;				9
	BTFSS	STATUS,CARRY	; <10				10
	GOTO	PWM1_9		;				11-12
	BTFSC	STATUS,ZERO	;				12
	GOTO	PWM10		;				13-14
	MOVWF	PWM_ON		; timer				14
	DECF	PWM_ON		;				15
	GOTO	$+1		;				16-17
	NOP			;				18
;.PWM2................................................................
	MOVF	PWM2,0		;				19
	MOVWF	GPIO		;				20
;^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^
	MOVF	GPIOOUT,0	;......PWM.....PWM1....PWM2.....21
	MOVWF	PWM		;	ON			22
	MOVWF	PWM1		;		ON		23
	IORLW	(MOTOR1|MOTOR2)	;				24
	MOVWF	PWM2		;			OFF	25
	NOP			;110____________________________26
	GOTO	EXOR		;				27-28
;---------------------------------------------------------------------
PWM1_9	MOVLW	00000011b	; (1+2)				13
	SUBWF	SOLL,0		;				14
	BTFSS	STATUS,CARRY	;				15
	GOTO	STOP		;				16-17
	MOVWF	PWM_ON		; timer				17
	NOP			;				18
;.PWM2................................................................
	MOVF	PWM2,0		;				19
	MOVWF	GPIO		;				20
;^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^
	MOVF	GPIOOUT,0	;......PWM.....PWM1....PWM2.....21
	MOVWF	PWM		;	ON			22
	IORLW	(MOTOR1|MOTOR2)	;				23
	MOVWF	PWM1		;		OFF		24
	MOVWF	PWM2		;			OFF	25
	NOP			;100____________________________26
	GOTO	EXOR		;				27-28
;---------------------------------------------------------------------
PWM10	GOTO	$+1		;				15-16
	GOTO	$+1		;				17-18
;.PWM2................................................................
	MOVF	PWM2,0		;				19
	MOVWF	GPIO		;				20
;^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^
	MOVF	GPIOOUT,0	;......PWM.....PWM1....PWM2.....21
	MOVWF	PWM1		;		ON		22
	IORLW	(MOTOR1|MOTOR2)	;				23
	MOVWF	PWM		;	OFF			24
	MOVWF	PWM2		;			OFF	25
	NOP			;100____________________________26
	GOTO	EXOR		;				27-28
;---------------------------------------------------------------------
PWM28	NOP			;				16
	GOTO	$+1		;				17-18
;.PWM2................................................................
	MOVF	PWM2,0		;				19
	MOVWF	GPIO		;				20
;^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^
	MOVF	GPIOOUT,0	;......PWM.....PWM1....PWM2.....21
	MOVWF	PWM		;	ON			22
	MOVWF	PWM1		;		ON		23
	MOVWF	PWM2		;			ON	24
	GOTO	$+1		;111____________________________25-26
	GOTO	EXOR		;				27-28
;---------------------------------------------------------------------
STOP	NOP			;				18
;.PWM2................................................................
	MOVF	PWM2,0		;				19
	MOVWF	GPIO		;				20
;^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^
	MOVF	GPIOOUT,0	;......PWM.....PWM1....PWM2.....21
	BTFSS	SOLL,1		;				22
	IORLW	(MOTOR1|MOTOR2)	; <-STOP			23
	BTFSC	SOLL,1		;				24
	ANDLW	(255-(MOTOR1|MOTOR2)) ;11111100b	; <-BREAK			25
	MOVWF	PWM		;	OFF			26
	MOVWF	PWM1		;		OFF		27
	MOVWF	PWM2		;			OFF	28
				;000____________________________
;---------------------------------------------------------------------

EXOR	NOP			;				1.
	GOTO	$+1		;				2.-3.
;.....................................................................
	CALL	PWMTAB		;				4.-2
;^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^
	MOVF	BT1,0		;				3
	XORWF	BT2,0		;				4
	XORWF	BT3,0		;				5
	XORWF	BT4,0		;				6
	XORWF	BT5,0		;				7
	XORWF	BT6,0		;				8
	BTFSS	STATUS,ZERO	; all Bytes ok?			9
	GOTO	START12		;				10-11

	DECF	FSR,1		; auf vorletztes Byte		11

	GOTO	$+1		;				12-13
	GOTO	$+1		;				14-15
	GOTO	$+1		;				16-17
	NOP			;				18
;.PWM2................................................................
	MOVF	PWM2,0		;				19
	MOVWF	GPIO		;				20
;^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^
;-------------------------------- wait for PWM -----------------------
	MOVLW	3		;		21
	MOVWF	BT6		; help register	22
LOOP2	DECFSZ	BT6,1		;		23	26	1.
	GOTO	LOOP2		;		24-25	27-28	2.
	NOP			;				3.
;.....................................................................
	CALL	PWMTAB		;				4.-2
;^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^

;....................................................................
CV	BSF	FSR,5		; rampage to 0x30..		3
;--------------------------------
	MOVF	BT1,0		;				4
	BTFSS	BT1,7		; >0<AAA AAAA			5
	GOTO	SHORTA		; short adress			6-7
	XORWF	CV17,0		;				7
	BTFSS	STATUS,ZERO	;				8
	GOTO	CHKPROG		;				9-10
	MOVF	BT2,0		;				10
	XORWF	CV18,0		;				11
	BTFSS	STATUS,ZERO	;				12
	GOTO	CHKPROG		;				13
	MOVLW	0x2C		; BT3				14
	MOVWF	FSR		; to 3. byte			15
	BTFSS	LADRE		; long adress enabled?		16
	GOTO	CHKPROG		;				17
	BTFSC	CONSIST		;				18
	GOTO	CHKPROG		;				19
	GOTO	CVNEXT		;				20-21
;--------------------------------
	GOTO	$+1		;				11-12
	GOTO	$+1		;				13-14
BCAST	GOTO	OVER1		;				15-16

OVER	BTFSC	CONSIST		;				15
	GOTO	START		;				16

OVER1	NOP			;				17
	GOTO	BCBCK		;				18-19
;--------------------------------
CHKPROG	MOVF	BT1,0		;
	ANDLW	11110000b	; untere 3bit ausblenden
	XORLW	01110000b	; >= 120 (120=CV1 121=CV2 ...)
	BTFSS	STATUS,ZERO	;
	GOTO	START		;
	BSF	STATUS,SEITE	;
	GOTO	PROG		; register mode (CV1-CV8)
;--------------------------------
SHORTA	BTFSC	STATUS,ZERO	; address = 0			8
	GOTO	BCAST		;				9-10
	BTFSS	LADRE		; long Adress enabled?		10
	XORWF	CV1,0		;				11
	BTFSC	STATUS,ZERO	;				12
	GOTO	OVER		;				13-14
	MOVF	CV19,0		;				14
	ANDLW	0  ;01111111b	; bugfix: cv19 deactivated !!!	15
	BCF	CONSIST		;				16
	BTFSS	STATUS,ZERO	;				17
	BSF	CONSIST		;				18
	XORWF	BT1,0		; consist?			19
BCBCK	BTFSS	STATUS,ZERO	;				20
	GOTO	CHKPROG		;				21-22
	MOVLW	0x2B		; BT2 + FSR,5			22
	MOVWF	FSR		; to 2. byte			23
CVNEXT	BCF	FSR,5		;				24
;.PWM2................................................................
	MOVF	PWM2,0		;				19
	MOVWF	GPIO		;				20
;^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^
	BSF	FSR,5		; rampage to 0x30..		21
	BSF	STATUS,SEITE	;				22
	GOTO	DECOD		;				23-24
;^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^


;.....................................................................
START1.	NOP			;				1.
START2.	NOP			;				2.
START3.	NOP			;				3.
;.....................................................................
START4.	CALL	PWMTAB		;				4.-2
;^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^
START3	NOP			;				3
START4	NOP			;				4
START5	NOP			;				5
START6	NOP			;				6
START7	NOP			;				7
START8	NOP			;				8
START9	NOP			;				9
START10	NOP			;				10
START11	NOP			;				11
START12	NOP			;				12
START13	NOP			;				13
START14	NOP			;				14
START15	NOP			;				15
START16	NOP			;				16
START17	GOTO	START		;				17
START18	BCF	FSR,5		;				18
;PWM2 ................................................................
START19	MOVF	PWM2,0		;				19
	MOVWF	GPIO		;				20
;^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^
;.....................................................................
START21	NOP			;				21
	INCF	NOADR		; for IB with M*		22
	BTFSS	NOADR,7		; counts if no			23
	GOTO	START26		; DCC signal is 		24
	GOTO	INIT		; readable			25
;^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^
START26	NOP			;				26
START27	GOTO	START1.		;				27-28
;^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^

;*******************************************************************
	ORG	0200h

	TITLE "PIC with EEPROM Data Memory Interface"
	LIST	P=12CE519

SCL	EQU	0x07		; EEPROM Clock, SCL (I/O bit 7)
SDA	EQU	0x06		; EEPROM Data,  SDA (I/O bit 6)

OK	EQU	1
NO	EQU	0
EE_OK	EQU	7		; Bit 7 in PC_OFFSET used as OK flag for EE

PC_OFFSET	EQU	0x35	; PC offset register (low order 4 bits),
				; value based on operating mode of EEPROM.
				; Also, bit 7 used for EE_OK flag
COUNTER		EQU	0x08	; Bit counter for serial transfer
EEBYTE		EQU	0x09	; Byte sent to or received from
				; EEPROM (control, address, or data)
EEADDR		EQU	0x0A	; EEPROM Address
EEDATA		EQU	0x0F	; EEPROM Data

;********************** Set up EEPROM control bytes ************************

READ_CURRENT
	MOVLW	B'10000100'	; PC offset for read current addr. EE_OK bit7='1'
	MOVWF	PC_OFFSET	; Load PC offset
	GOTO	INIT_READ_CONTROL

WRITE_BYTE
	MOVLW	B'10000000'	; PC offset for write byte. EE_OK: bit7 = '1'
	GOTO	INIT_WRITE_CONTROL

READ_RANDOM
	MOVLW	B'10000011'	; PC offset for read random. EE_OK: bit7 = '1'

INIT_WRITE_CONTROL
	MOVWF	PC_OFFSET	; Load PC offset register, value preset in W
	MOVLW	B'10100000'	; Control byte with write bit, bit 0 = '0'

START_BIT
	BCF	GPIO,SDA	; Start bit, SDA and SCL preset to '1'

;******* Set up output data (control, address, or data) and counter ********

PREP_TRANSFER_BYTE
	MOVWF	EEBYTE		; Byte to transfer to EEPROM already in W
	MOVLW	8		; Counter to transfer 8 bits
	MOVWF	COUNTER

;************ Clock out data (control, address, or data) byte ************

OUTPUT_BYTE
	BCF	GPIO,SCL	; Set clock low during data set-up
	RLF	EEBYTE,1	; Rotate left, high order bit into carry bit
	BCF	GPIO,SDA	; Set data low, if rotated carry bit is
	BTFSC	STATUS,CARRY	;(SKPNC) a '1', then:
	BSF	GPIO,SDA	; reset data pin to a one, otherwise leave low
	NOP
	NOP	; extra NOP
	NOP	; extra NOP
	BSF	GPIO,SCL	; clock data into EEPROM
	DECFSZ	COUNTER,1	; Repeat until entire byte is sent
	GOTO	OUTPUT_BYTE
	NOP			; Needed to meet Timing (Thigh=4000nS)
	NOP	; extra NOP
	NOP	; extra NOP

;************************** Acknowkedge Check *****************************

	BCF	GPIO,SCL	; Set SCL low, 0.5us < ack valid < 3us
	NOP			; Needed to meet Timing (Tlow= 4700nS)
	NOP	; extra NOP
	NOP	; extra NOP
	BSF	GPIO,SDA
	NOP			; Necessary for SCL Tlow at low voltage,
	NOP	; extra NOP
	NOP	; extra NOP
	NOP			; Tlow=4700nS
	BSF	GPIO,SCL	; Raise SCL, EEPROM acknowledge still valid
	BTFSC	GPIO,SDA	; Check SDA for acknowledge (low)
	BCF	PC_OFFSET,EE_OK	; If SDA not low (no ack), set error flag
	BCF	GPIO,SCL	; Lower SCL, EEPROM release bus
	BTFSS	PC_OFFSET,EE_OK	; If no error continue, else stop bit
	GOTO	STOP_BIT

;***** Set up program counter offset, based on EEPROM operating mode *****

	MOVF	PC_OFFSET,0
	ANDLW	B'00001111'
	ADDWF	PC
	GOTO	INIT_ADDRESS		;PC offset=0, write control done, send address
	GOTO	INIT_WRITE_DATA		;PC offset=1, write address done, send data
	GOTO	STOP_BIT		;PC offset=2, write done, send stop bit
	GOTO	INIT_ADDRESS		;PC offset=3, write control done, send address
	GOTO	INIT_READ_CONTROL	;PC offset=4, send read control
	GOTO	READ_BIT_COUNTER	;PC offset=5, set counter and read byte
	GOTO	STOP_BIT		;PC offset=6, random read done, send stop

;********** Initalize EEPROM data (address, data, or control) bytes ******

INIT_ADDRESS
	INCF	PC_OFFSET,1	; Increment PC offset to 2 (write) or to 4 (read)
	MOVF	EEADDR,W	; Put EEPROM address in W, ready to send to EEPROM
	GOTO	PREP_TRANSFER_BYTE

INIT_WRITE_DATA
	INCF	PC_OFFSET,1	; Increment PC offset to go to STOP_BIT next
	MOVF	EEDATA,0	; Put EEPROM data in W, ready to send to EEPROM
	GOTO	PREP_TRANSFER_BYTE

INIT_READ_CONTROL
	BSF	GPIO,SCL	; Raise SCL
	NOP	; extra NOP
	NOP	; extra NOP
	BSF	GPIO,SDA	; raise SDA
	INCF	PC_OFFSET,1	; Increment PC offset to go to READ_BIT_COUNTER next
	MOVLW	B'10100001'	; Set up read control byte, ready to send to EEPROM
	GOTO	START_BIT	; bit 0 = '1' for read operation

;************************** Read EEPROM data *****************************

READ_BIT_COUNTER
	BSF	GPIO,SDA	; set data bit to 1 so we're not pulling bus down.
	NOP
	NOP			; extra NOP
	NOP	; extra NOP
	BSF	GPIO,SCL
	MOVLW	8		; Set counter so 8 bits will be read into EEDATA
	MOVWF	COUNTER

READ_BYTE
	BSF	GPIO,SCL	; Raise SCL, SDA valid. SDA still input from ack
	SETC			; Assume bit to be read = 1
	BTFSS	GPIO,SDA	; Check if SDA = 1
	BCF	STATUS,CARRY	;(CLRC) if SDA not = 1 then clear carry bit
	RLF	EEDATA,1	; rotate carry bit (=SDA) into EEDATA;
	BCF	GPIO,SCL	; Lower SCL
	bsf	GPIO,SDA	; reset SDA
	DECFSZ	COUNTER,1	; Decrement counter
	GOTO	READ_BYTE	; Read next bit if not finished reading byte
	BSF	GPIO,SCL
	NOP
	NOP	; extra NOP
	NOP	; extra NOP
	BCF	GPIO,SCL

;****************** Generate a STOP bit and RETURN ***********************

STOP_BIT
	BCF	GPIO,SDA	; SDA=0, on TRIS, to prepare for transition to '1'
	BSF	GPIO,SCL	; SCL = 1 to prepare for STOP bit
	GOTO	$+1		; equivalent 4 NOPs neccessary for I2C spec Tsu:sto = 4.7us
	GOTO	$+1
	NOP	; extra NOP
	NOP	; extra NOP
	BSF	GPIO,SDA	; Stop bit, SDA transition to '1' while SCL high
	BTFSS	PC_OFFSET,EE_OK ; Check for error
	RETLW	NO		; if error, send back NO
	RETLW	OK		; if no error, send back OK

;************************ End EEPROM Subroutines **************************

;XXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXX
;XXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXX
;XXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXX
;XXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXX
;XXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXX
;XXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXX
;XXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXX
;XXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXX

PWMTAB1;..............................................................
	BCF	FSR,5		;				5.
#INCLUDE PWM.INC		;				6.-28
	BSF	FSR,5		;				1
	RETLW	0		;				2-3
;^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^

;.....................................................................
DECOD	SWAPF	INDF,0		;				25
	MOVWF	BT6		;				26
	RRF	BT6,0		;				27
	ANDLW	00000111b	;				28
	ADDWF	PC		;				29
	GOTO	DECCON		; 000				1.-2.
	GOTO	ADVAN		; 001
	GOTO	FORWARD		; 010
	GOTO	REVERSE		; 011
	GOTO	FTION		; 100
	GOTO	FTION1		; 101
	GOTO	TELNEW		; 110

	MOVF	BT2,0		;--------------------------------
	XORLW	11111001b	; old acknowledge mode
	BTFSC	STATUS,ZERO	;
	GOTO	OLDACK		;--------------------------------

	MOVF	INDF,0		; OTM mode -copy bytes
	MOVWF	BT1		; 
	INCF	FSR,1		; 
	MOVF	INDF,0		; CV to pogram
	MOVWF	BT2		;
	INCF	FSR,1		; DATA for cv
	MOVF	INDF,0		; INDF looks to data
	MOVWF	BT3		;
	GOTO	PROGOTM		; 111
;^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^

;.....................................................................
BITMAN	MOVWF	FSR		;
	MOVLW	00000111b	;
	ANDWF	BT3,0		;
	CALL	BITPOS		;
	BTFSS	BT3,4		;
	GOTO	VBIT		; verify bit
	BTFSC	BT3,3		;
	IORWF	INDF,1		; set bit
	XORLW	0XFF		;
	BTFSS	BT3,3		;
	ANDWF	INDF,1		; clear bit

⌨️ 快捷键说明

复制代码 Ctrl + C
搜索代码 Ctrl + F
全屏模式 F11
切换主题 Ctrl + Shift + D
显示快捷键 ?
增大字号 Ctrl + =
减小字号 Ctrl + -