; ; Half-stepping stepper motor controller "with fast-foward and reverse". ; For Pollux eq platform by Kosminen Vompatti, uuki@iki.fi ; ; PIC16F84 port A bits 0-3 interface to L293D motor driver: ; ; bit 0 -> 1A ; bit 1 -> 2A ; ; bit 2 -> 3A ; bit 3 -> 4A ; ; Both enables of L293D are kept high. Motor windings are connected across ; outputs 1Y and 2Y (white and yellow wires), and outputs 3Y and 4Y (red and ; blue). ; ; Port B bits 1 and 2 are for slewing telescope forward and backward. Wire ; these through normally open switches to ground. ; device pic16f84 config CP=off,WDT=off,PWRT=off,OSC=hs include "pic16c84.h" ;also for f84 org 0x0c delay1 ds 1 delay2 ds 1 org 0 ; Initialize the port movlw 0x00 movwf PORTA ; Set port A as output (we'll use only bits 0, 1, 2 and 3) ; Set port B bits 1 and 2 as inputs, with pull-ups enabled bsf STATUS,RP0 movlw 0xe0 movwf TRISA movlw 0x06 movwf TRISB bcf OPTIO,RBPU bcf STATUS,RP0 ; This is the stepping sequence including half-steps: ; bin 0001 0101 0100 0110 0010 1010 1000 1001 ; hex 0x01 0x05 0x04 0x06 0x02 0x0a 0x08 0x09 ; If port b1 is grounded, run the sequence in reverse. step1 movlw 0x01 call track_step btfss PORTB,1 ; Are we slewing backwards? goto step8 ; step2 movlw 0x05 call track_step btfss PORTB,1 goto step1 step3 movlw 0x04 call track_step btfss PORTB,1 goto step2 step4 movlw 0x06 call track_step btfss PORTB,1 goto step3 step5 movlw 0x02 call track_step btfss PORTB,1 goto step4 step6 movlw 0x0a call track_step btfss PORTB,1 goto step5 step7 movlw 0x08 call track_step btfss PORTB,1 goto step6 step8 movlw 0x09 call track_step btfss PORTB,1 goto step7 goto step1 ; Take a step and wait a while. If slewing, use a shorter delay track_step movwf PORTA movlw 0x36 ; This sets the delay call delay btfss PORTB,1 ; Are we slewing either forward or back? return ; btfss PORTB,2 ; return ; movlw 0x36 call delay btfss PORTB,1 return btfss PORTB,2 return movlw 0x36 call delay btfss PORTB,1 return btfss PORTB,2 return movlw 0x36 call delay btfss PORTB,1 return btfss PORTB,2 return movlw 0x37 call delay btfss PORTB,1 return btfss PORTB,2 return movlw 0x37 call delay btfss PORTB,1 return btfss PORTB,2 return movlw 0x37 call delay btfss PORTB,1 return btfss PORTB,2 return movlw 0x37 call delay btfss PORTB,1 return btfss PORTB,2 return movlw 0x37 call delay btfss PORTB,1 return btfss PORTB,2 return movlw 0x37 call delay return ; We repeated that 10 times, so slewing is 10x faster than tracking ; Delay routine, length set by w (0 means 256): ; w*771+6 instruction cycles (197.382 ms max, on a 4 MHz crystal) ; including call and return cycles. delay movwf delay1 clrf delay2 delay_a incfsz delay2,F ; ; Inner loop: 256*3=768 goto delay_a ; ; instruction cycles. decfsz delay1,F ; Outer loop w*(768+3)=w*771 goto delay_a ; instrcution cycles. return end ; ; Whee. ; |