| Home Pic in Greek Παραδείγματα χρήσης Pic Οδήγηση βηματικού κινητήρα Λίστα εντολών προγράμματος |
Οδήγηση βηματικού κινητήρα - Λίστα εντολών προγράμματος
Source code file of Stepper Motor controller Αποθήκευση αρχείου στον σκληρό δίσκο R
    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
Listing file of Stepper Motor controller
    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