;Stepper Motor 4 Winding Driver Half Step Mode.
;27/09/2007 Program in development stage.
;
;Uses Macro's to control motor
list p=16f877
#include <p16f877.inc>
errorlevel -302
__CONFIG _CP_OFF & _XT_OSC & _PWRTE_ON & _WDT_OFF & _LVP_OFF
VARIABLE SIM1
SIM1 SET .1 ;if 1 then its picsim, then USEC delays are skipped.
; Set stepper PORT & pins
#define MTRPORT PORTB
#define MTRW 0 ; west pole
#define MTRN 1 ; north pole
#define MTRE 2 ; east pole
#define MTRS 3 ; south pole
;General Registers
GR20 EQU 0x20
GR21 EQU 0x21
GR22 EQU 0x22
GR23 EQU 0x23
GR24 EQU 0x24
GR25 EQU 0x25
GR26 EQU 0x26
GR27 EQU 0x27
GR28 EQU 0x28
GR29 EQU 0x29
GR2A EQU 0x2A
GR2B EQU 0x2B
STEP_VAL EQU 0x2C
an0 EQU 0x2D ;uses ADC chan0, reference only.
LOOPL EQU 0X30 ;delay subr registers
LOOPH EQU 0X31
;
USECL EQU 0X32 ;user delay entry
USECH EQU 0X33
;clock wise number of STEP_VAL and uSec delay between STEP_VAL.
MTRCW MACRO STEP,USEC
LOCAL STEP,USEC
MOVLW STEP
MOVWF GR2A
MOVLW LOW USEC
MOVWF USECL
MOVLW HIGH USEC
MOVWF USECH
CALL TURN_CW
ENDM
;counter clockwise number of STEP_VAL and uSec delay between STEP_VAL.
MTRCCW MACRO STEP,USEC
LOCAL STEP,USEC
MOVLW STEP
MOVWF GR2A
MOVLW LOW USEC
MOVWF USECL
MOVLW HIGH USEC
MOVWF USECH
CALL TURN_CCW
ENDM
;Program
ORG 0x0000
BCF PCLATH,3
BCF PCLATH,4
GOTO START
ORG 0x0004
RETFIE
START:
BSF STATUS,RP0 ;bank1
MOVLW 0x0E ;d,d,d,d,d,d,d,a0
MOVWF ADCON1
CALL DATUM ;init PORT & move motor to 315deg Datum NW
BCF STATUS,RP0 ;bank0
MAIN:
MTRCCW .25, .500; mtr cw 25 steps, with 500uSec interstep delay
MTRCW .10, .5 ; mtr ccw 10 steps, 5uSec delay
TRAP:
GOTO MAIN
TURN_CCW:
MOVF GR2A,F
BTFSC STATUS,Z
RETURN
DO_CCW:
CALL STEP_CCW
MOVF USECL,W
MOVWF LOOPL
MOVF USECH,W
MOVWF LOOPH
CALL US_LOOP
DECFSZ GR2A,F
GOTO DO_CCW
RETURN
TURN_CW:
MOVF GR2A,F
BTFSC STATUS,Z
RETURN
DO_CW:
CALL STEP_CW
MOVF USECL,W
MOVWF LOOPL
MOVF USECH,W
MOVWF LOOPH
CALL US_LOOP
MOVF STEP_VAL,W
DECFSZ GR2A,F
GOTO DO_CW
RETURN
; 16 bit micro-sec loop subr
US_LOOP:
IF SIM1 == 0X01
RETURN
else
MOVLW 0x10
SUBWF LOOPL,F
CLRW
BTFSS STATUS,C
ADDLW 0x01
SUBWF LOOPH,F
BTFSS STATUS,C
RETURN
GOTO WW2
WW2: MOVLW 0x0A
SUBWF LOOPL,F
CLRW
BTFSS STATUS,C
ADDLW 0x01
SUBWF LOOPH,F
BTFSS STATUS,C
RETURN
GOTO WW2
ENDIF
;Init PORT & Move stepper to Datum 315deg
DATUM:
BSF STATUS,RP0
BCF TRISB,MTRW
BCF TRISB,MTRN
BCF TRISB,MTRE
BCF TRISB,MTRS
BCF STATUS,RP0
BSF MTRPORT,MTRW
BSF MTRPORT,MTRN
BCF MTRPORT,MTRE
BCF MTRPORT,MTRS
CLRF STEP_VAL
BCF STATUS,RP0
RETURN
; Half-Step Routine
STEP_CW:
INCF STEP_VAL,F
GOTO ST03
STEP_CCW:
DECF STEP_VAL,F
ST03: BTFSC STEP_VAL,2
GOTO ST04
BTFSC STEP_VAL,1
GOTO ST05
BTFSC STEP_VAL,0
GOTO ST21
GOTO ST20
ST05: BTFSC STEP_VAL,0
GOTO ST23
GOTO ST22
ST04: BTFSC STEP_VAL,1
GOTO ST06
BTFSC STEP_VAL,0
GOTO ST25
GOTO ST24
ST06: BTFSC STEP_VAL,0
GOTO ST27
GOTO ST26
ST20: BSF MTRPORT,MTRW
BSF MTRPORT,MTRN
BCF MTRPORT,MTRE
BCF MTRPORT,MTRS
RETURN
ST21: BCF MTRPORT,MTRW
BSF MTRPORT,MTRN
BCF MTRPORT,MTRE
BCF MTRPORT,MTRS
RETURN
ST22: BCF MTRPORT,MTRW
BSF MTRPORT,MTRN
BSF MTRPORT,MTRE
BCF MTRPORT,MTRS
RETURN
ST23: BCF MTRPORT,MTRW
BCF MTRPORT,MTRN
BSF MTRPORT,MTRE
BCF MTRPORT,MTRS
RETURN
ST24: BCF MTRPORT,MTRW
BCF MTRPORT,MTRN
BSF MTRPORT,MTRE
BSF MTRPORT,MTRS
RETURN
ST25: BCF MTRPORT,MTRW
BCF MTRPORT,MTRN
BCF MTRPORT,MTRE
BSF MTRPORT,MTRS
RETURN
ST26: BSF MTRPORT,MTRW
BCF MTRPORT,MTRN
BCF MTRPORT,MTRE
BSF MTRPORT,MTRS
RETURN
ST27: BSF MTRPORT,MTRW
BCF MTRPORT,MTRN
BCF MTRPORT,MTRE
BCF MTRPORT,MTRS
RETURN
END