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 clrf PORTA clrf PORTB clrf PORTC clrf store bsf STATUS,RP0 MOVLW B'00000001' MOVWF TRISA ;all outputs except RA0 CLRF TRISB CLRF TRISC MOVLW B'00010110' ;left justified, RA0 = input MOVWF ADCON1 MOVLW B'11010111' ;prescaler 1:256 tmr0, internal clock MOVWF OPTION_REG BCF STATUS,RP0 MOVLW B'01000001' ;a2d = on, ch0, fosc/8 MOVWF ADCON0 mnloop ;btfss INTCON,T0IF ;50us loop delay @ 4Mhz ;goto mnloop ;This part makes motor too slow! BCF INTCON,T0IF BSF ADCON0,GO_DONE ;start a2d conversion WAITA2D NOP ;wait 4 finish BTFSC ADCON0,GO_DONE GOTO WAITA2D MOVF ADRESH,w ;upper 8 bits-ignor lower 3,semi colon 4 debug ;MOVLW H'03' ;for debug only MOVWF store ;put a/d value in reg for time delay MOVWF PORTC ;display binary on portC MOVLW H'03' ;step sequence MOVWF OUTPUT ;to motor driver circuitry CALL DELAY ;variable delay MOVLW H'06' ;To reverse motor direction... MOVWF OUTPUT ;9 CALL DELAY ;C MOVLW H'0C' ;6 MOVWF OUTPUT ;3 CALL DELAY MOVLW H'09' MOVWF OUTPUT CALL DELAY GOTO mnloop DELAY movf store,w movwf CounterB movwf CounterA loop nop decfsz CounterA,f goto loop decfsz CounterB,f goto loop return END
Interested: