[Menu]>[Circuits Gallery]>[Stepper Motor]
001 002 003 004 005 006 007 008 009 010 011 012 013 014 015 016 017 018 019 020 021 022 023 024 025 026 027 028 029 030 031 032 033 034 035 036 037 038 039 040 041 042 043 044 045 046 047 048 049 050 051 052 053 054 055 056 057 058 059 060 061 062 063 064 065 066 067 068 069 070 071 072 073 074 075 076 077 078 079 080 081 082 083 084 085 086 087 088 089 090 091 092 093 094 095 096 097 098 099 100 101 102 103 104 105 106 107 108 109 110 111 112 113 114 115 116 117 118 119 120 121 122 123 124 125 126 127 128 129 130 131 132 133 134 135 136 137 138 139 140 141 142 143 144 145 146 147 148 149 150 151 152 153 154 155 | ;******************************************************** ; ; Stepper Motor controller ; ; Author : Seiichi Inoue ;******************************************************** list p=pic16f84a include p16f84a.inc __config _hs_osc & _wdt_off & _pwrte_on & _cp_off ;**************** Label Definition ******************** cblock h'0c' mode ;Operation mode ;0=stop 1=right 2=left count1 ;Wait counter count2 ;Wait counter(for 1msec) endc rb0 equ 0 ;RB0 of PORTB rb1 equ 1 ;RB1 of PORTB rb2 equ 2 ;RB2 of PORTB rb5 equ 5 ;RB5 of PORTB rb7 equ 7 ;RB7 of PORTB ;**************** Program Start *********************** org 0 ;Reset Vector goto init org 4 ;Interrupt Vector clrf intcon ;Clear Interruption reg ;**************** Initial Process ********************* init bsf status,rp0 ;Change to Bank1 clrf trisa ;Set PORTA all OUT movlw b'00100111' ;RB0,1,2.5=IN RB7=OUT movwf trisb ;Set PORTB movlw b'10000000' ;RBPU=1 Pull up not use movwf option_reg ;Set OPTION_REG bcf status,rp0 ;Change to Bank0 clrf mode ;Set mode = stop clrf count1 ;Clear counter clrf count2 ;Clear counter movlw b'00000101' ;Set PORTA initial value movwf porta ;Write PORTA bsf portb,rb7 ;Set RB7 = 1 btfsc portb,rb5 ;RB5 = 0 ? goto $-1 ;No. Wait start ;************* Check switch condition ***************** btfsc portb,rb1 ;RB1(stop key) = ON ? goto check1 ;No. Next clrf mode ;Yes. Set stop mode goto drive ;No. Jump to motor drive check1 btfsc portb,rb2 ;RB2(right key) = ON ? goto check2 ;No. Next movlw d'1' ;Yes. Set right mode movwf mode ;Save mode goto drive ;No. Jump to motor drive check2 btfsc portb,rb0 ;RB0(left key) = ON ? goto drive ;No. Jump to motor drive movlw d'2' ;Yes. Set left mode movwf mode ;Save mode ;******************** Motor drive ********************* drive movf mode,w ;Read mode bz start ;mode = stop bsf portb,rb7 ;Set RB7 = 1 btfsc portb,rb5 ;RB5 = 0 ? goto $-1 ;No. Wait movlw d'5' ;Set loop count(5msec) movwf count1 ;Save loop count loop call timer ;Wait 1msec decfsz count1,f ;count - 1 = 0 ? goto loop ;No. Continue bcf portb,rb7 ;Set RB7 = 0 btfss portb,rb5 ;RB5 = 1 ? goto $-1 ;No. Wait movf porta,w ;Read PORTA sublw b'000000101' ;Check motor position bnz drive2 ;Unmatch movf mode,w ;Read mode sublw d'1' ;Right ? bz drive1 ;Yes. Right movlw b'00001001' ;No. Set Left data goto drive_end ;Jump to PORTA write drive1 movlw b'00000110' ;Set Right data goto drive_end ;Jump to PORTA write ;------- drive2 movf porta,w ;Read PORTA sublw b'000000110' ;Check motor position bnz drive4 ;Unmatch movf mode,w ;Read mode sublw d'1' ;Right ? bz drive3 ;Yes. Right movlw b'00000101' ;No. Set Left data goto drive_end ;Jump to PORTA write drive3 movlw b'00001010' ;Set Right data goto drive_end ;Jump to PORTA write ;------- drive4 movf porta,w ;Read PORTA sublw b'000001010' ;Check motor position bnz drive6 ;Unmatch movf mode,w ;Read mode sublw d'1' ;Right ? bz drive5 ;Yes. Right movlw b'00000110' ;No. Set Left data goto drive_end ;Jump to PORTA write drive5 movlw b'00001001' ;Set Right data goto drive_end ;Jump to PORTA write ;------- drive6 movf porta,w ;Read PORTA sublw b'000001001' ;Check motor position bnz drive8 ;Unmatch movf mode,w ;Read mode sublw d'1' ;Right ? bz drive7 ;Yes. Right movlw b'00001010' ;No. Set Left data goto drive_end ;Jump to PORTA write drive7 movlw b'00000101' ;Set Right data goto drive_end ;Jump to PORTA write ;------- drive8 movlw b'00000101' ;Compulsion setting drive_end movwf porta ;Write PORTA goto start ;Jump to start ;************* 1msec Timer Subroutine ***************** timer movlw d'200' ;Set loop count movwf count2 ;Save loop count tmlp nop ;Time adjust nop ;Time adjust decfsz count2,f ;count - 1 = 0 ? goto tmlp ;No. Continue return ;Yes. Count end ;******************************************************** ; END of Stepper Motor controller ;******************************************************** end |
MPASM 02.50.02 Intermediate STEP.ASM 3-9-2001 23:52:45 PAGE 1 LOC OBJECT CODE LINE SOURCE TEXT VALUE 00001 ;******************************************************** 00002 ; 00003 ; Stepper Motor controller 00004 ; 00005 ; Author : Seiichi Inoue 00006 ;******************************************************** 00007 00008 LIST P=PIC16F84A 00009 INCLUDE P16F84A.INC 00001 LIST 00002 ; P16F84A.INC Standard Header File, Version 2.00'(modify) 00134 LIST 2007 3FF2 00010 __CONFIG _HS_OSC & _WDT_OFF & _PWRTE_ON & _CP_OFF 00011 00012 ;**************** Label Definition ******************** 00013 CBLOCK H'0c' 0000000C 00014 MODE ;Operation mode 00015 ;0=stop 1=right 2=left 0000000D 00016 COUNT1 ;Wait counter 0000000E 00017 COUNT2 ;Wait counter(for 1msec) 00018 ENDC 00019 00000000 00020 RB0 EQU 0 ;RB0 of PORTB 00000001 00021 RB1 EQU 1 ;RB1 of PORTB 00000002 00022 RB2 EQU 2 ;RB2 of PORTB 00000005 00023 RB5 EQU 5 ;RB5 of PORTB 00000007 00024 RB7 EQU 7 ;RB7 of PORTB 00025 00026 ;**************** Program Start *********************** 0000 00027 ORG 0 ;Reset Vector 0000 2805 00028 GOTO INIT 0004 00029 ORG 4 ;Interrupt Vector 0004 018B 00030 CLRF INTCON ;Clear Interruption reg 00031 00032 ;**************** Initial Process ********************* 0005 00033 INIT 0005 1683 00034 BSF STATUS,RP0 ;Change to Bank1 0006 0185 00035 CLRF TRISA ;Set PORTA all OUT 0007 3027 00036 MOVLW B'00100111' ;RB0,1,2.5=IN RB7=OUT 0008 0086 00037 MOVWF TRISB ;Set PORTB 0009 3080 00038 MOVLW B'10000000' ;RBPU=1 Pull up not use 000A 0081 00039 MOVWF OPTION_REG ;Set OPTION_REG 000B 1283 00040 BCF STATUS,RP0 ;Change to Bank0 000C 018C 00041 CLRF MODE ;Set mode = stop 000D 018D 00042 CLRF COUNT1 ;Clear counter 000E 018E 00043 CLRF COUNT2 ;Clear counter 000F 3005 00044 MOVLW B'00000101' ;Set PORTA initial value 0010 0085 00045 MOVWF PORTA ;Write PORTA 0011 1786 00046 BSF PORTB,RB7 ;Set RB7 = 1 0012 1A86 00047 BTFSC PORTB,RB5 ;RB5 = 0 ? 0013 2812 00048 GOTO $-1 ;No. Wait 00049 0014 00050 START MPASM 02.50.02 Intermediate STEP.ASM 3-9-2001 23:52:45 PAGE 2 LOC OBJECT CODE LINE SOURCE TEXT VALUE 00051 ;************* Check switch condition ***************** 0014 1886 00052 BTFSC PORTB,RB1 ;RB1(stop key) = ON ? 0015 2818 00053 GOTO CHECK1 ;No. Next 0016 018C 00054 CLRF MODE ;Yes. Set stop mode 0017 2821 00055 GOTO DRIVE ;No. Jump to motor drive 0018 00056 CHECK1 0018 1906 00057 BTFSC PORTB,RB2 ;RB2(right key) = ON ? 0019 281D 00058 GOTO CHECK2 ;No. Next 001A 3001 00059 MOVLW D'1' ;Yes. Set right mode 001B 008C 00060 MOVWF MODE ;Save mode 001C 2821 00061 GOTO DRIVE ;No. Jump to motor drive 001D 00062 CHECK2 001D 1806 00063 BTFSC PORTB,RB0 ;RB0(left key) = ON ? 001E 2821 00064 GOTO DRIVE ;No. Jump to motor drive 001F 3002 00065 MOVLW D'2' ;Yes. Set left mode 0020 008C 00066 MOVWF MODE ;Save mode 00067 00068 ;******************** Motor drive ********************* 0021 00069 DRIVE 0021 080C 00070 MOVF MODE,W ;Read mode 0022 1903 2814 00071 BZ START ;mode = stop 0024 1786 00072 BSF PORTB,RB7 ;Set RB7 = 1 0025 1A86 00073 BTFSC PORTB,RB5 ;RB5 = 0 ? 0026 2825 00074 GOTO $-1 ;No. Wait 0027 3005 00075 MOVLW D'5' ;Set loop count(5msec) 0028 008D 00076 MOVWF COUNT1 ;Save loop count 0029 2062 00077 LOOP CALL TIMER ;Wait 1msec 002A 0B8D 00078 DECFSZ COUNT1,F ;count - 1 = 0 ? 002B 2829 00079 GOTO LOOP ;No. Continue 002C 1386 00080 BCF PORTB,RB7 ;Set RB7 = 0 002D 1E86 00081 BTFSS PORTB,RB5 ;RB5 = 1 ? 002E 282D 00082 GOTO $-1 ;No. Wait 002F 0805 00083 MOVF PORTA,W ;Read PORTA 0030 3C05 00084 SUBLW B'000000101' ;Check motor position 0031 1D03 283B 00085 BNZ DRIVE2 ;Unmatch 0033 080C 00086 MOVF MODE,W ;Read mode 0034 3C01 00087 SUBLW D'1' ;Right ? 0035 1903 2839 00088 BZ DRIVE1 ;Yes. Right 0037 3009 00089 MOVLW B'00001001' ;No. Set Left data 0038 2860 00090 GOTO DRIVE_END ;Jump to PORTA write 0039 00091 DRIVE1 0039 3006 00092 MOVLW B'00000110' ;Set Right data 003A 2860 00093 GOTO DRIVE_END ;Jump to PORTA write 00094 ;------- 003B 00095 DRIVE2 003B 0805 00096 MOVF PORTA,W ;Read PORTA 003C 3C06 00097 SUBLW B'000000110' ;Check motor position 003D 1D03 2847 00098 BNZ DRIVE4 ;Unmatch 003F 080C 00099 MOVF MODE,W ;Read mode 0040 3C01 00100 SUBLW D'1' ;Right ? 0041 1903 2845 00101 BZ DRIVE3 ;Yes. Right 0043 3005 00102 MOVLW B'00000101' ;No. Set Left data 0044 2860 00103 GOTO DRIVE_END ;Jump to PORTA write MPASM 02.50.02 Intermediate STEP.ASM 3-9-2001 23:52:45 PAGE 3 LOC OBJECT CODE LINE SOURCE TEXT VALUE 0045 00104 DRIVE3 0045 300A 00105 MOVLW B'00001010' ;Set Right data 0046 2860 00106 GOTO DRIVE_END ;Jump to PORTA write 00107 ;------- 0047 00108 DRIVE4 0047 0805 00109 MOVF PORTA,W ;Read PORTA 0048 3C0A 00110 SUBLW B'000001010' ;Check motor position 0049 1D03 2853 00111 BNZ DRIVE6 ;Unmatch 004B 080C 00112 MOVF MODE,W ;Read mode 004C 3C01 00113 SUBLW D'1' ;Right ? 004D 1903 2851 00114 BZ DRIVE5 ;Yes. Right 004F 3006 00115 MOVLW B'00000110' ;No. Set Left data 0050 2860 00116 GOTO DRIVE_END ;Jump to PORTA write 0051 00117 DRIVE5 0051 3009 00118 MOVLW B'00001001' ;Set Right data 0052 2860 00119 GOTO DRIVE_END ;Jump to PORTA write 00120 ;------- 0053 00121 DRIVE6 0053 0805 00122 MOVF PORTA,W ;Read PORTA 0054 3C09 00123 SUBLW B'000001001' ;Check motor position 0055 1D03 285F 00124 BNZ DRIVE8 ;Unmatch 0057 080C 00125 MOVF MODE,W ;Read mode 0058 3C01 00126 SUBLW D'1' ;Right ? 0059 1903 285D 00127 BZ DRIVE7 ;Yes. Right 005B 300A 00128 MOVLW B'00001010' ;No. Set Left data 005C 2860 00129 GOTO DRIVE_END ;Jump to PORTA write 005D 00130 DRIVE7 005D 3005 00131 MOVLW B'00000101' ;Set Right data 005E 2860 00132 GOTO DRIVE_END ;Jump to PORTA write 00133 ;------- 005F 00134 DRIVE8 005F 3005 00135 MOVLW B'00000101' ;Compulsion setting 00136 0060 00137 DRIVE_END 0060 0085 00138 MOVWF PORTA ;Write PORTA 0061 2814 00139 GOTO START ;Jump to start 00140 00141 ;************* 1msec Timer Subroutine ***************** 0062 00142 TIMER 0062 30C8 00143 MOVLW D'200' ;Set loop count 0063 008E 00144 MOVWF COUNT2 ;Save loop count 0064 0000 00145 TMLP NOP ;Time adjust 0065 0000 00146 NOP ;Time adjust 0066 0B8E 00147 DECFSZ COUNT2,F ;count - 1 = 0 ? 0067 2864 00148 GOTO TMLP ;No. Continue 0068 0008 00149 RETURN ;Yes. Count end 00150 00151 ;******************************************************** 00152 ; END of Stepper Motor controller 00153 ;******************************************************** 00154 00155 END MPASM 02.50.02 Intermediate STEP.ASM 3-9-2001 23:52:45 PAGE 4 Label list has been deleted. MEMORY USAGE MAP ('X' = Used, '-' = Unused) 0000 : X---XXXXXXXXXXXX XXXXXXXXXXXXXXXX XXXXXXXXXXXXXXXX XXXXXXXXXXXXXXXX 0040 : XXXXXXXXXXXXXXXX XXXXXXXXXXXXXXXX XXXXXXXXX------- ---------------- 2000 : -------X-------- ---------------- ---------------- ---------------- All other memory blocks unused. Program Memory Words Used: 102 Program Memory Words Free: 922 Errors : 0 Warnings : 0 reported, 0 suppressed Messages : 0 reported, 0 suppressed |
step_source.zip step_hex.zip |