www.pudn.com > stepmot.rar > stepmot.asm


; 
;		NAME: stepmot.asm 
;		Version 1.0 jul 07, 2002 
;		author:xjchen 
;		list      p=16c73 
		title "stepmot Program" 
		#include  
 
;		__CONFIG   _RC_OSC & _CP_OFF & _WDT_OFF & _BODEN_OFF & _PWRTE_ON  
 
;--------------------------------------- 
;t1 parameters 
_T1_50US	EQU	04BH		;50*0.000001*OSC/4/prescale 
 
;--------------------------------------- 
;pwm parameters 
_PWM_T		EQU	04AH		;pwm cycle 1/20kz ,_PWM_T=(osc/4)/20kz-1 
_SCALE0		EQU	0B1H		;_PWM_T*4*_PERCENT1,60% 
_SCALE1		EQU	07CH		;60%*0.7 
 
;beat parameters 
_S_STEPS0	EQU 5 
_S_STEPS1	EQU 0AH 
_S_STEPS2	EQU 012H 
_S_STEPS3	EQU 01EH 
_MAX_S_STEPS	EQU 032H 
_BEAT_TIME0		EQU	064H	;200HZ  ,10000/200*2 
_BEAT_TIME1		EQU	028H	;500 
_BEAT_TIME2		EQU	016H	;900 
_BEAT_TIME3		EQU	0DH		;1500 
_BEAT_TIME4		EQU	0BH		;1800 
_MAX_BEAT_TIME	EQU	0AH		;2000 
_REACH_DELAY	EQU	2		;2 
_DIFFERENCE		EQU	8 
 
;run angle parameters 
_ANGLE0		EQU	0C8H		;SETPS,180 
 
;---------------------------------------					 
;regsiser define 
			ORG		0020H 
FLAG0		EQU $ 
			ORG $+1 
B_T_COUNT	EQU $		;one beat time count 
			ORG $+1 
D_TIME0		EQU $		;delay time regsister 0 
			ORG $+1 
D_TIME1		EQU $		;delay time regsister 1 
			ORG $+1 
S_S_ADD		EQU $		;变速区步数充计。 
			ORG $+1 
S_STACK		EQU $		;status stack 
			ORG $+1 
W_STACK		EQU $ 
			ORG $+1 
TEMP0		EQU $ 
			ORG $+1 
TEMP1		EQU $ 
			ORG $+1 
T_ANGLE		EQU $ 
			ORG $+2 
S_ADD		EQU $ 
			ORG $+2		 
;---------------------------------------					 
;bit define 
;--------------------------------------- 
;flag0 bit define 
ORIE		EQU	0 
ERR			EQU	1 
D_S_STEPS	EQU	2 
T_BIT		EQU 3	;temp bit  
 
;porta 
COMMAND		EQU 0 
PUSH		EQU	2 
STATE		EQU 3 
 
;portb 
BEN			EQU 4 
UBEN		EQU 5 
AEN			EQU 6 
UAEN		EQU 7 
 
;portC 
S_LED		EQU	4 
W_LED		EQU	5 
;********************************************************************** 
 
		ORG     000H 
		GOTO	MAIN 
 
; 
;	INTERRUPT ROUTINE 
; 
		ORG		004H 
		MOVWF   W_STACK			;	REGISTER W STACK 
		MOVF	STATUS,W 
		BCF		STATUS,RP0 
		MOVWF	S_STACK 
 
		BTFSC	PIR1,TMR1IF 
		GOTO	T1IP 
		BCF		INTCON,T0IF 
		BCF		INTCON,INTF		 
		BCF		INTCON,RBIF 
		CLRF	PIR1 
		GOTO	T1IP300 
 
T1IP:	BCF		PIR1,TMR1IF 
		MOVLW	LOW (-(_T1_50US-0AH)) 
		MOVWF	TMR1L 
		MOVLW	HIGH (-(_T1_50US-0AH)) 
		MOVWF	TMR1H 
 
		MOVF	B_T_COUNT,W		;a beat finish ?wait 
		BTFSC	STATUS,Z 
		GOTO	T1IP200 
		DECF	B_T_COUNT 
		 
T1IP200	MOVF	D_TIME0,W		;a beat finish ?wait 
		BTFSC	STATUS,Z 
		GOTO	T1IP300 
		DECF	D_TIME0 
		 
T1IP300	MOVF	S_STACK,W 
		MOVWF	STATUS 
		SWAPF	W_STACK,F 
		SWAPF	W_STACK,W 
		RETFIE 
 
 
; 
;main program 
;intial system 
MAIN	CLRF	INTCON      ;INTCON REGISTER. 
		CLRF	PORTB 
		MOVLW   0FFH 
		MOVWF	PORTA 
		CLRF	STATUS 
		CLRF	PIR1        ;peripheral interrupts flag. 
		BSF		STATUS,RP0	;bank select bits. 
		BCF		STATUS,RP1	;bank select bits. 
		CLRF	OPTION_REG 
		CLRF	PCON        ;POWER CONTROL 
		CLRF	PIE1        ;This register contains the individual enable bit for the comparator interrupt. 
		MOVLW	06H 
		MOVWF	ADCON1 
		MOVLW	03FH		 
		MOVWF	TRISA		;porta low 6 bit input 
		CLRF	TRISB		;output 
		CLRF	TRISC		;close pwm output 
		BCF		STATUS,RP0	;bank select bits. 
		BCF		STATUS,RP1	;bank select bits. 
		MOVLW	00H 
		MOVWF	PORTB 
		NOP 
		NOP 
		BCF		PORTC,W_LED	;light cpu working led 
		CALL	C_STATUS	;check up status 
		MOVLW	020H 
		MOVWF	FSR 
CMB1	CLRF	INDF 
		INCF	FSR,F 
		BTFSS	FSR,7      	;CLEAR 
		GOTO	CMB1 
		MOVLW	0A0H 
		MOVWF	FSR 
CMB2	CLRF	INDF 
		INCF	FSR,F 
		BTFSS	STATUS,Z 
		GOTO	CMB2 
;T1 intial 
		MOVLW	LOW (-(_T1_50US+8)) 
		MOVWF	TMR1L 
		MOVLW	HIGH (-(_T1_50US+8)) 
		MOVWF	TMR1H 
		MOVLW	01H 
		MOVWF	T1CON 
		BSF		INTCON,GIE 
		BSF		INTCON,PEIE 
		BSF		STATUS,RP0	;bank select bits. 
		BSF		PIE1,TMR1IE 
		BCF		STATUS,RP0	;bank select bits. 
;pwm intial 
		BSF		STATUS,RP0	;bank select bits. 
		MOVLW	_PWM_T 
		MOVWF	PR2 
		BCF		STATUS,RP0	;bank select bits. 
		MOVLW	_SCALE0/4		;_PWM_T*4*_PERCENT0/064H,PWM CYCLE 占空比. 
		MOVWF	CCPR1L 
		MOVWF	CCPR1H 
		MOVLW	04H 
		MOVWF	T2CON		;prescale is 1 
		 
 
;deal event		 
LOOP;	BSF		STATUS,RP0	;bank select bits. 
;		MOVLW	03FH 
;		MOVWF	TRISA 
;		BCF		STATUS,RP0 
		BTFSC	PORTA,COMMAND 
		GOTO	LOOP02 
		BTFSS	PORTA,COMMAND 
		GOTO	LOOP03 
LOOP02	CALL	C_STATUS	 
		GOTO	LOOP 
LOOP03	;GOTO	LOOP 
		BSF		FLAG0,ORIE		;orientation + 
		MOVLW	LOW _ANGLE0		;angle 
		MOVWF	T_ANGLE			;target angle 
		MOVLW	HIGH _ANGLE0	;angle 
		MOVWF	T_ANGLE+1		;target angle 
		CALL	RUN_MOTOR0		;run but no detect 
		BTFSC	FLAG0,ERR		 
		GOTO	ERR_DEAL 
		MOVLW	0C8H			;200,20ms 
		MOVWF	D_TIME0 
		CALL	DELAY_TIME0		 
		BTFSC	PORTA,PUSH		;low enable 
		GOTO	LOOP05 
		MOVLW	0AH 
		MOVWF	D_TIME1 
		CALL	DELAY_TIME1 
LOOP05	BCF		FLAG0,ORIE		;orientation - 
		MOVLW	LOW _ANGLE0		;angle 
		MOVWF	T_ANGLE			;target angle 
		MOVLW	HIGH _ANGLE0	;angle 
		MOVWF	T_ANGLE+1		;target angle 
		CALL	RUN_MOTOR0		;run and detect 
		BTFSC	FLAG0,ERR		 
		GOTO	ERR_DEAL 
 
LOOP10	GOTO	LOOP 
		 
ERR_DEAL	GOTO	LOOP 
		 
;subroute 
 
;run step motor 
RUN_MOTOR0 
		CLRF	S_S_ADD			;变速区步数充计。 
		CLRF	PORTB 
		CLRF	PORTB 
		NOP 
		BCF		FLAG0,D_S_STEPS	;decelerate shift flag 
		BSF		PORTC,S_LED		;position led 
		CLRF	S_ADD			;step add 
		CLRF	S_ADD+1			;step add high 8 bit 
 
R_M0020	MOVF	S_S_ADD,W 
		ADDLW	-_MAX_S_STEPS	;shift steps add,变速区的最大步距 
		BTFSC	STATUS,C 
		GOTO	R_M0250			;equment 
		LCALL	SPEED_TABLE 
		GOTO	R_M0400		 
R_M0250	MOVLW	_MAX_S_STEPS 
		LCALL	SPEED_TABLE 
		MOVWF	B_T_COUNT 
		GOTO	R_M0500 
;设定步频率. 
R_M0400	MOVWF	B_T_COUNT		;one beat time count 
		BTFSC	FLAG0,D_S_STEPS 
		GOTO	R_M0420 
		INCF	S_S_ADD 
		GOTO	R_M0500 
R_M0420 DECF	S_S_ADD 
		LCALL	SPEED_TABLE 
;判断运行到第几拍.设定运行的相数.		 
R_M0500 CALL	EN_STEPST	 
R_M0700	MOVF	B_T_COUNT,W		;a beat finish ?wait 
		BTFSS	STATUS,Z 
		GOTO	R_M0700 
		 
		INCF	S_ADD		;step add 1 
		BTFSC	STATUS,Z 
		INCF	S_ADD+1 
		 
		MOVF	S_ADD,W 
		SUBWF	T_ANGLE,W		;T_ANGLE-S_ADD 
		MOVWF	TEMP0 
		BTFSS	STATUS,C 
		GOTO	R_M0705 
		MOVF	S_ADD+1,W 
		GOTO	R_M070A 
R_M0705	INCF	S_ADD+1,W 
R_M070A	SUBWF	T_ANGLE+1,W 
		MOVWF	TEMP1 
		IORWF	TEMP0,W 
		BTFSC	STATUS,Z 
		GOTO	R_M0730 
				 
		MOVF	TEMP1,W			;在减速区域内?。 
		BTFSS	STATUS,Z 
		GOTO	R_M0020 
		MOVF	TEMP0,W 
		SUBLW	_MAX_S_STEPS 
		BTFSS	STATUS,Z 
		GOTO	R_M0720 
		DECF	S_S_ADD			;在减速区域内。 
		BSF		FLAG0,D_S_STEPS ;dec shift steps 
		GOTO	R_M0020 
		 
R_M0720	BTFSC	FLAG0,ORIE		;反向减速区域。 
		GOTO	R_M0020 
		BTFSS	FLAG0,D_S_STEPS 
		GOTO	R_M0020 
		BTFSC	PORTA,STATE	 
		GOTO	R_M0020 
		GOTO	R_M0780			;检测到位 
				 
R_M0730 BTFSS	FLAG0,ORIE	;在零的情况(返回处理) 
		GOTO	R_M0740 
		CLRF	PORTB 
		RETURN	 
		 
R_M0740	BTFSC	PORTA,STATE	 
		GOTO	R_M0750 
		NOP 
		NOP 
		BTFSC	PORTA,STATE		 
		GOTO	R_M0750 
		GOTO	R_M0790 
		 
R_M0750 MOVLW	_DIFFERENCE		;difference,差距. 
		MOVWF	S_S_ADD 
		MOVLW	LOW -_DIFFERENCE 
		ADDWF	S_ADD 
		BTFSC	STATUS,C		;C=1;W>T_S_ADDL 
		INCF	S_ADD+1,W 
		ADDWF	HIGH -_DIFFERENCE	 
		GOTO	R_M0020 
		 
R_M0780	BTFSC	PORTA,STATE		;未达到零的情况(返回处理) 
		GOTO	R_M0020 
		NOP 
		NOP 
		BTFSC	PORTA,STATE		 
		GOTO	R_M0020 
R_M0790	CLRF	PORTB 
		BCF		PORTC,S_LED	;亮到位指示灯 
		MOVLW	_REACH_DELAY		; 
		MOVWF	D_TIME1 
		CALL	DELAY_TIME1 
		RETURN		 
		 
;PWM1 start 
PWM1_START0 
		MOVLW	_SCALE0/4		;_PWM_T*4*_PERCENT0/064H,PWM CYCLE 占空比. 
		MOVWF	CCPR1L 
		MOVLW	_SCALE0%4*10H	;_PWM_T%4*10H*_PERCENT0/064H 
		ANDLW	030H 
		IORLW	0CH 
		MOVWF	CCP1CON			;PWM modle and low 2 bit set. 
		RETURN 
 
;PWM2 start 
PWM2_START0 
		MOVLW	_SCALE0/4		;_PWM_T*4*_PERCENT0/100,PWM CYCLE 占空比. 
		MOVWF	CCPR2L 
		MOVLW	_SCALE0%4*10H	;_PWM_T%4*10H*_PERCENT0/100 
		ANDLW	030H 
		IORLW	0CH 
		MOVWF	CCP2CON			;PWM modle and low 2 bit set. 
		RETURN 
 
;PWM1 start 
PWM1_START1 
		MOVLW	_SCALE1/4	;PWM CYCLE 占空比. 
		MOVWF	CCPR1L 
		MOVLW	_SCALE1%4*10H 
		ANDLW	030H 
		IORLW	0CH 
		MOVWF	CCP1CON			;PWM modle and low 2 bit set. 
		RETURN 
 
;PWM2 start 
PWM2_START1 
		MOVLW	_SCALE1/4	;PWM CYCLE 占空比. 
		MOVWF	CCPR2L 
		MOVLW	_SCALE1%4*10H 
		ANDLW	030H 
		IORLW	0CH 
		MOVWF	CCP2CON			;PWM modle and low 2 bit set. 
		RETURN 
 
;check status 
C_STATUS	BTFSC	PORTA,STATE 
		GOTO	C_S20 
		BCF		PORTC,S_LED 
		GOTO	C_S30 
C_S20	BSF		PORTC,S_LED ;status led		 
C_S30	BSF		PORTC,W_LED		; 
		BTFSS	PORTA,COMMAND 
		BCF		PORTC,W_LED 
		RETURN 
 
DELAY_TIME0	MOVF D_TIME0,W 
		BTFSS	STATUS,Z 
		GOTO 	DELAY_TIME0 
		RETURN 
 
DELAY_TIME1	MOVLW	064H 
		MOVWF	D_TIME0 
D_T120	MOVF 	D_TIME0,W 
		BTFSC	STATUS,Z 
		GOTO	D_T130 
		GOTO	D_T120 
D_T130	DECFSZ	D_TIME1 
		GOTO	DELAY_TIME1 
		RETURN 
 
		ORG		0300H 
EN_STEPST	BTFSS	FLAG0,ORIE	;enactment steps 
		GOTO	EN_S600 
		MOVLW	HIGH TABLE0 
		MOVWF	PCLATH 
		MOVF	S_ADD,W 
		ANDLW	07H 
		ADDWF	PCL 
TABLE0	GOTO	EN_S500 
		GOTO	EN_S510 
		GOTO	EN_S520 
		GOTO	EN_S530 
		GOTO	EN_S540 
		GOTO	EN_S550 
		GOTO	EN_S560 
		GOTO	EN_S570 
EN_S500	;CLRF	PORTB 
		NOP 
		NOP 
		BCF		PORTB,UBEN 
		BSF		PORTB,AEN	;A 
		GOTO	EN_S580 
		 
EN_S510	BSF		PORTB,BEN	;AB 
		GOTO	EN_S590 
 
EN_S520	BCF		PORTB,AEN	;B 
		GOTO	EN_S580 
 
EN_S530	BSF		PORTB,UAEN		;B/A 
		GOTO	EN_S590	 
		 
EN_S540	BCF		PORTB,BEN		;/A 
		GOTO	EN_S580 
		 
EN_S550	BSF		PORTB,UBEN		;/A/B 
		GOTO	EN_S590 
		 
EN_S560	BCF		PORTB,UAEN		;/B 
		GOTO	EN_S580 
		 
EN_S570	BSF		PORTB,AEN		;A/B 
		GOTO	EN_S590 
		 
EN_S580	CALL	PWM1_START0 
		CALL	PWM2_START0 
		RETURN 
EN_S590	CALL	PWM1_START1 
		CALL	PWM2_START1 
		RETURN 
 
EN_S600	MOVLW	HIGH TABLE0 
		MOVWF	PCLATH 
		MOVF	S_ADD,W 
		ANDLW	07H 
		ADDWF	PCL 
		GOTO	EN_S601 
		GOTO	EN_S610 
		GOTO	EN_S620 
		GOTO	EN_S630 
		GOTO	EN_S640 
		GOTO	EN_S650 
		GOTO	EN_S660 
		GOTO	EN_S670 
EN_S601	;CLRF	PORTB 
		NOP 
		NOP 
		BCF		PORTB,BEN 
		BSF		PORTB,AEN	;A 
		GOTO	EN_S580 
		 
EN_S610	BSF		PORTB,UBEN	;A/B 
		GOTO	EN_S590 
 
EN_S620	BCF		PORTB,AEN	;/B 
		GOTO	EN_S580 
 
EN_S630	BSF		PORTB,UAEN		;/B/A 
		GOTO	EN_S590	 
		 
EN_S640	BCF		PORTB,UBEN		;/A 
		GOTO	EN_S580 
		 
EN_S650	BSF		PORTB,BEN		;/AB 
		GOTO	EN_S590 
		 
EN_S660	BCF		PORTB,UAEN		;B 
		GOTO	EN_S580 
		 
EN_S670	BSF		PORTB,AEN		;AB 
		GOTO	EN_S590 
 
		ORG		0400H 
SPEED_TABLE 
		MOVLW	HIGH S_TABLE 
		MOVWF	PCLATH 
		MOVF	S_S_ADD,W 
		ADDWF	PCL 
		RETLW	0C8H	;100HZ  ,10000/100*2 
		RETLW	0C8H	;100HZ  ,10000/100*2 
		RETLW	0C8H	;100HZ 
		RETLW	0C8H	;100HZ 
		RETLW	064H	;200HZ  ,10000/200*2 
		RETLW	064H	;200HZ  ,10000/200*2 
		RETLW	028H	;500 
		RETLW	028H	;500					,07 
		RETLW	028H	; 
		RETLW	028H 
		RETLW	014H 
		RETLW	014H 
		RETLW	014H 
		RETLW	014H 
		RETLW	014H 
		RETLW	014H 
		RETLW	014H 
		RETLW	014H 
		RETLW	014H 
		RETLW	014H 
		RETLW	014H 
		RETLW	014H 
		RETLW	014H 
		RETLW	014H 
		RETLW	014H 
		RETLW	014H 
		RETLW	014H 
		RETLW	014H 
		RETLW	014H 
		RETLW	014H 
		RETLW	014H 
		RETLW	014H 
		RETLW	014H 
		RETLW	014H 
		RETLW	014H 
		RETLW	014H 
		RETLW	014H 
		RETLW	014H 
		RETLW	014H 
		RETLW	014H 
		RETLW	014H 
		RETLW	014H 
		RETLW	014H 
		RETLW	014H 
		RETLW	014H 
		RETLW	014H 
		RETLW	014H 
		RETLW	014H 
		RETLW	014H 
		RETLW	014H 
		RETLW	014H 
		RETLW	014H 
		RETLW	014H 
		RETLW	014H 
		RETLW	014H 
		END 
; 
;****************************************