📄 stepmot.asm
字号:
;
; NAME: stepmot.asm
; Version 1.0 jul 07, 2002
; author:xjchen
; list p=16c73
title "stepmot Program"
#include <p16c73.inc>
; __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
;
;****************************************
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -