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 |