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

📄 gp16lf84.asm

📁 pic得电机控制程序
💻 ASM
📖 第 1 页 / 共 2 页
字号:
; D:\mplab\gp16lf84\gp_0004.asm, January-23-2002, PTB.
;
	LIST    p=16f84
	include "P16F84.INC"
	include "d:\mplab\16f84_lc.inc" ; has lower case register names.
	__config _cp_off & _wdt_off & _pwrte_on & _rc_osc
;	__idlocs 0xffff
	errorlevel -302

_opt256	equ	b'00000111'	; OK, timer 1:256
_opt128	equ	b'00000110'	; OK, timer 1:128
_opt64	equ	b'00000101'	; OK, timer 1:64
_opt32	equ	b'00000100'	; OK, timer 1:32
_opt16	equ	b'00000011'	; OK, timer 1:16
_int	equ	b'00000000'	; OK

;                 43210
a_pins	equ	b'11111'	; all tri-stated
a_tris	equ	b'00000'	; all outputs, =0
;                 |||||____ motor 1 enable
;                 ||||_____ motor 2 enable
;                 |||______ motor 3 enable
;                 ||_______ motor 4 enable
;                 |
;                 |________ tied to the 74AC245 enable pin.

;                 76543210
b_pins	equ	b'11111111'	; 1= tri-stated
b_tris	equ	b'11111001'	; 1= input, 0= output
;                 3210FPSI	  s= Speed(1) = off, 0= on.
;                 ||||||||
;                 ||||||||_ ir-input
;                 |||||||
;                 |||||||__ Speed, 0= fast, 1= slow
;                 ||||||___ PIEZO-OUTPUT(1)
;                 |||||
;                 |||||____ feeler
;                 ||||
;                 ||||_____ affects _rbif
;                 |||______ affects _rbif
;                 ||_______ affects _rbif
;                 |________ affects _rbif

bit0	equ	0
bit1	equ	1
bit2	equ	2
bit3	equ	3
bit4	equ	4
bit5	equ	5
bit6	equ	6
bit7	equ	7

#define	bank0	status,rp0
#define	bank1	status,rp0
#define	z_flag	status,z
#define	carry	status,c

#define	_gie	intcon,gie
#define	_intf	intcon,intf
#define _inte	intcon,inte
#define	_t0if	intcon,t0if	; timer overflow flag
#define	_rbie	intcon,rbie
#define	_rbif	intcon,rbif	; portb (4..7) only pin change flag

#define	_eeif	eecon1,bit5
#define	_wrerr	eecon1,bit4
#define	_wren	eecon1,bit3
#define	_wr	eecon1,bit1
#define	_rd	eecon1,bit0

#define	m1	porta,bit0	; motor 1 - 2,3 in; 17,18 out
#define	m2	porta,bit1	; motor 2 - 4,5 in; 15,16 out
#define	m3	porta,bit2	; motor 3 - 6,7 in; 13,14 out
#define	m4	porta,bit3	; motor 4 - 8,9 in; 11,12 out
#define	ena245	porta,bit4	; --> 74AC245 OE pin

#define	ir_in	portb,bit0	; IR Module Input
#define	speed	portb,bit1	; 0= fast, 1= slow
#define	piezo	portb,bit2	; piezo element
#define	feel1	portb,bit3	; 0= active
;edge change pins:
#define	limit0	portb,bit4	; CW front rotation limit
#define	limit1	portb,bit5	; CCW front rotation limit
#define	limit2	portb,bit6	; CW rear rotation limit
#define	limit3	portb,bit7	; CCW rear rotation limit

#define	mt1time	.255-.210	; front motor CW
#define	mt2time	.255-.210	; front motor CCW
#define	mt3time	.255-.210	; rear motor CW
#define	mt4time	.255-.210	; rear motor CCW

; the following works great!
#define	rt1time	.255-.120	; reverse front motor CW
#define	rt2time	.255-.120	; reverse front motor CCW
#define	rt3time	.255-.180	; reverse rear motor CW
#define	rt4time	.255-.180	; reverse rear motor CCW
;

#define	f1time	.255-.254	; fast front motor CW
#define	f2time	.255-.254	; fast front motor CCW
#define	f3time	.255-.245	; fast rear motor CW
#define	f4time	.255-.245	; fast rear motor CCW

#define	t1time	.255-.120	; turn front motor CW
#define	t2time	.255-.150	; turn front motor CCW
#define	t3time	.255-.120	; turn rear motor CW
#define	t4time	.255-.200	; turn rear motor CCW

#define	pauztim	.255-.60	; normal time between motor steps
#define	pz2tim	.255-.10	; shorter pause time
#define	pzcount	.19		; loop counter, needs odd #
#define	longtim	.0		; longest pause available

#define	walkng	_action,bit0	; b'0000000x' 
#define	runng	_action,bit1	; b'000000x0'
#define	backng	_action,bit2	; b'00000x00'

buncha	equ	5

; RAM RAM RAM RAM RAM RAM RAM RAM RAM
;
	CBLOCK	0x0C	; to 0x4F inclusive

; from EEPROM at Power-Up:
	 _mt1time, _mt2time, _mt3time, _mt4time	; forward 0C..0F
	 _rt1time, _rt2time, _rt3time, _rt4time	; reverse 10..13
	 _f1time,  _f2time,  _f3time,  _f4time	; fast    14..17
	 _time1,   _time2,   _time3,   _time4	; setup   18..1B
	 _action	; 0=normal, 2=fast, 4=reverse, 6=fast_reverse
	 _loops		; reverse counter

; locals:
	 _sqkvar, _sqkvar2, _sqkvar3, _count
	 _timer, _rand, _temp, _pauzer, _random
	 _goto, _goto2, _speeds, _loop
	 _eeadr, _eedata
	 _wtemp, _status, _wiggle, _eeloop

	ENDC

;@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@
;     @@@@
;    @   .@
;    @  . @
;    @ .  @
;    @.   @
;     @@@@
;@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@
;
	org	0

	b	Cold
;
;44444444444444444444444444444444
;         4
;    4    4
;    4    4
;    444444
;         4
;         4
;44444444444444444444444444444444
;
	org	4

;	movwf	_wtemp		; save W
;	swapf	status,w	; move status to W (nibbles)
;	movwf	_status		; save status register
;
; do something here . . .
;
;Ixit	swapf	_status,w	; restore status register (nibbles)
;	movwf	status		; restores bank
;	swapf	_wtemp,f	; restore W (nibbles)
;	swapf	_wtemp,w	;_/
	retfie
;
;--------------------------------
;
Cold	clrf	intcon
	movlw	0x0C		; clear out memory from 0x0C->
	movwf	fsr

clrnxt	clrf	indf
	incf	fsr		; x1xx-xxxx
	btfss	fsr,6		; is it 0x40 ?
	b	clrnxt		; ->to 0x3F inclusive

	bsf	bank1		; yup, continue, bank 1
	movlw	_opt128		; prescaler amount, 1:#
	movwf	option_reg	;_/
	movlw	a_tris		; setup external pin directions
	movwf	trisa		;_/
	movlw	b_tris		; setup external pin directions
	movwf	trisb		;_/
	bcf	bank0		; back to bank 0

	movlw	a_pins		; motors and 74ac245 off
	movwf	porta		;_/
	movlw	b_pins		; slow cpu speed
	movwf	portb		;_/

	call	Times		; get EEPROM data to local RAM

	movlw	pzcount		; 
	movwf	_pauzer		;_/
	clrf	intcon		; no interrupts
	clrf	tmr0		; start timer after 2 cycles
	call	RandNum
	andlw	b'00001111'	; limit # to 0..16
	iorlw	b'00001000'	; force at least 8 instead of =0
	movwf	_rand		;_/
	movlw	.6		; update reverse cycles counter
	movwf	_loops		;_/
	bcf	ena245		; turn on the 74AC245 motor driver
	movlw	.9-.1		; do a sweep-up/down beep
	call	Blips		;_/

Balance	call	C_Front		; center the legs, still doesn't work right
	call	C_Back		; center the legs, still doesn't work right
;
;--------------------------------
;
Check	bsf	speed		; slow

	decfsz	_rand,f		; is it time to do a 'WIGGLE' ?
	b	NotYet		; continue with checks

	call	Wigl		; yup
	call	RandNum		; update next time occurance
	andlw	b'00011111'	; limit # to 1..31
	iorlw	b'00001000'	;__/
	movwf	_rand		;_/

NotYet	btfss	feel1		; did feeler hit something ?
	b	Reverse		; yes, goto reverse routine

	btfsc	_intf		; did ir-module go down ?
	b	Fast		; yes, IR-Module active !
;
; and fall into Walk . . .
;--------------------------------
;
Walk	call	SetNorm		; sets _action too
	b	Forward		; DOH!

Reverse	call	SetRev		; sets _action too
	b	Revward

Fast	bcf	_intf		; clear caller
	bcf	speed		; fast
	call	SetFast		; sets _action too
	movlw	.10-.2		; do dn-up-dn
	call	Blips		;_/
;	b	Forward		; implied
;
;--------------------------------
;
Forward	call	Mtr1cw		; rotate Motor 1 CW
	btfss	feel1		; is feeler up ?
	b	r4		; no, down, active.
	btfsc	runng		; skip if fast
	b	m1f
	call	Pause		; time between motors being active
m1f	btfss	feel1		; is feeler up ?
	b	r4		; no, down, active.

	call	Mtr2cw		; rotate Motor 2 CW
	btfss	feel1		; is feeler up ?
	b	r3		; no, down, active.
	btfsc	runng
	b	m2f
	call	Pause		; time between motors being active
m2f	btfss	feel1		; is feeler up ?
	b	r3		; no, down, active.

	call	Mtr1ccw		; rotate Motor 1 CCW
	btfss	feel1		; is feeler up ?
	b	r2		; no, down, active.
	btfsc	runng
	b	m3f
	call	Pause		; time between motors being active
m3f	btfss	feel1		; is feeler up ?
	b	r2		; no, down, active.

	call	Mtr2ccw		; rotate Motor 2 CCW
	btfss	feel1		; is feeler up ?
	b	Revward		; no, down, active.
	btfsc	runng
	b	m4f
	call	Pause		; time between motors being active
m4f	btfss	feel1		; is feeler up ?
	b	Revward		; no, down, active.

	clrf	_action
	b	Check		; start over
;
;--------------------------------
;
Revward	call	Mtr1cw		; rotate Motor 1 CW
	btfsc	runng		; skip time between, if fast
	b	r4		;_/
	call	OneBlip		; time between motors being active

r4	call	Mtr2ccw		; rotate Motor 2 CCW
	btfsc	runng
	b	r3
	call	OneBlip		; time between motors being active

r3	call	Mtr1ccw		; rotate Motor 1 CCW
	btfsc	runng
	b	r2
	call	OneBlip		; time between motors being active

r2	call	Mtr2cw		; rotate Motor 2 CW
	btfsc	runng
	b	rxit
	call	OneBlip		; time between motors being active

rxit	decfsz	_loops,f
	b	Revward

	movlw	.6		; update reverse cycles counter
	movwf	_loops		;_/
	clrf	_action		; walk
	movlw	.9-.1		; do the up/down thingie
	call	Blips		;_/
	b	Check		; start over
;
;--------------------------------
;
SetNorm
	movlw	_time1
	movwf	_mt1time
	movlw	_time2
	movwf	_mt2time
	movlw	_time3
	movwf	_mt3time
	movlw	_time4
	movwf	_mt4time
	movlw	b'00000000'	; norm forward
	movwf	_action
	return
SetFast
	movlw	_f1time
	movwf	_mt1time
	movlw	_f2time
	movwf	_mt2time
	movlw	_f3time
	movwf	_mt3time
	movlw	_f4time
	movwf	_mt4time
	movlw	b'00000010'	; fast forward
	movwf	_action
	return
SetRev
	movlw	_rt1time
	movwf	_mt1time
	movlw	_rt2time
	movwf	_mt2time
	movlw	_rt3time
	movwf	_mt3time
	movlw	_rt4time
	movwf	_mt4time
	movlw	b'00000100'	; norm reversing
	movwf	_action
	return
SetFRev
	movlw	_rt1time
	movwf	_mt1time
	movlw	_rt2time
	movwf	_mt2time
	movlw	_rt3time
	movwf	_mt3time
	movlw	_rt4time
	movwf	_mt4time
	movlw	b'00000110'	; fast reversing

⌨️ 快捷键说明

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