From: Mark Willcox
; stepr.asm, To learn stepper motor and a2d converter for a 16f873 ;last edited 5/25/2000. Originated by Tony Nixon and modified by ;Mark Willcox. Step code, 3-6-C-9,is output on portB, Hex code is ;output on portC by an 8 LED bargraph display. A 50k pot is used to vary ;time delay eg, step speed. ; The wiper of the pot goes to RA0 (analog input) the high end of the pot ;goes to +Vdd and the other end of the pot goes to -Vss/ground. ; PortB is connected to a darlington pair consisting of a 2N3904 driving ;a MJE3055T. Each coil(collector) is clamped by a 1N4934 diode to common ;ground. The stepper motor is a SLO-SYN 200oz/in, 3V@4A. ; This is a fun code to play with, you can reverse direction by ;reversing the step sequence, ie, 9-C-6-3. ; Have fun and please send me any modifications that make this code ;better. Thanks again to Tony Nixon for all his help. Mark Willcox. ; #include <p16F873.inc> LIST p=16F873, ;R=HEX __config _XT_OSC & _PWRTE_ON & _WDT_OFF & _LVE_OFF errorlevel 1,-302 CBLOCK 0X20 CounterA,CounterB,store ENDC f equ 1 w equ 0 OUTPUT equ 06 org 00h clr RA clr RB clr RC clr store setb STATUS.RP0 mov W, #%00000001 ;*** WARNING: TRIS registers are accessed by MOV !Rx, W (M = $0F or $1F). ; MOVWF TRISA ;all outputs except RA0 mov TRISA, W ;all outputs except RA0 ;*** WARNING: TRIS registers are accessed by MOV !Rx, W (M = $0F or $1F). ; CLRF TRISB clr TRISB ;*** WARNING: TRIS registers are accessed by MOV !Rx, W (M = $0F or $1F). ; CLRF TRISC clr TRISC mov W, #%00010110 ;left justified, RA0 = input mov ADCON1, W mov W, #%11010111 ;prescaler 1:256 tmr0, internal clock ;*** WARNING: OPTION register is accessed only by MOV !OPTION, W. ; MOVWF OPTION_REG mov OPTION_REG, W clrb STATUS.RP0 mov W, #%01000001 ;a2d = on, ch0, fosc/8 mov ADCON0, W mnloop ; sb INTCON.T0IF ;50us loop delay @ 4Mhz ; jmp mnloop ;This part makes motor too slow! clrb INTCON.T0IF setb ADCON0.GO_DONE ;start a2d conversion WAITA2D nop ;wait 4 finish snb ADCON0.GO_DONE jmp WAITA2D mov W, ADRESH ;upper 8 bits-ignor lower 3,semi colon 4 debug ; mov W, #$03 ;for debug only mov store, W ;put a/d value in reg for time delay mov RC, W ;display binary on portC mov W, #$03 ;step sequence mov OUTPUT, W ;to motor driver circuitry call DELAY ;variable delay mov W, #$06 ;To reverse motor direction... mov OUTPUT, W ;9 call DELAY ;C mov W, #$0C ;6 mov OUTPUT, W ;3 call DELAY mov W, #$09 mov OUTPUT, W call DELAY jmp mnloop DELAY mov W, store mov CounterB, W mov CounterA, W loop nop decsz CounterA jmp loop decsz CounterB jmp loop ret END
Interested: