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 ; ;****************************************