This is an extension of Stepper_1.Bas
In Stepper_2.Bas, the notor turns on depression of a pushbutton on Pin 8. The processor reads Pins 5 and 6 (corresponding to bits 7 and 6 of PORTC) to determine the timing between outputting half steps. The processor then reads SW_DIR on Pin 7 to determine the direction. The motor in then advanced one half step in the specified direction with a specified time delay.
Note that unlike Stepper_1.Bas the Index of the current position in the pattern array is declared as being global.
The following code snippet is used to make the high nibble of PORTC inputs and the low nibble outputs. Note that the second statement inserts pullup resistors on the inputs.
Register.DDRC = bx00001111 ' high nib are input, low nib outputs Register.PORTC = Register.PORTC OR bx11110000Note that the two switches on RC.7 and RC.6 are read by reading PORTC, and then shifting right by six bits such that the state of the two switches are in the two least significant bits of SWTime.
SWTime = (Register.PINC \ 64) AND bx00000011Thus, the SWTime is either, 0, 1, 2 or 3. Note that use of the Select Case construct to map these four states into a delay time.
There is a limitation on the speed of the motor as there is a considerable time overhead in reading the switches, making the appropriate decisions and the call to the turn motor routine on half step.
' Stepper_2.Bas ' ' If PB8 on Pin 8 is open, motor does not turn. When depressed, motor ' turns in half step mode in the direction determined by SW_DIR (Pin 7) at ' speed determined by SW_SPEED1 and SW_SPEED2 (terms 5 and 6). ' ' copyright, Peter H. Anderson, Baltimore, MD, Nov, '99 Const CW as Byte = 0 Const CCW as Byte = 1 Const PB8 as Byte = 8 Const SW_DIR as Byte = 7 Dim Index as Integer ' current postition in the stepping motor patt array Sub Main() Dim Patts(1 to 8) as Byte Dim Dir as Byte, SwTime as Byte, TimeStep as Single Patts(1) = bx00000001 ' define stepping motor patts Patts(2) = bx00000011 Patts(3) = bx00000010 Patts(4) = bx00000110 Patts(5) = bx00000100 Patts(6) = bx00001100 Patts(7) = bx00001000 Patts(8) = bx00001001 Index = 1 Do Register.DDRC = bx00001111 ' high nib are input, low nib outputs Register.PORTC = Register.PORTC OR bx11110000 ' pullups on high nib Do ' loop until PB8 at zero Call PutPin(PB8, 3) Loop Until (GetPin(PB8) = 0) SWTime = (Register.PINC \ 64) AND bx00000011 ' two most significant bits Select Case (SwTime) ' determine the speed Case 0 TimeStep = 0.05 ' map SwTime into a delay Case 1 TimeStep = 0.1 Case 2 TimeStep = 0.25 Case Else TimeStep = 1.0 End Select Call PutPin(SW_DIR, 3) ' just to be sure pullup is in place Dir = GetPin(SW_DIR) ' determine the direction Call TurnMotor(Patts, Dir, 1, TimeStep) Loop End Sub Sub TurnMotor(ByRef Patts() as Byte, ByVal Dir as Byte, _ ByVal Steps as Integer, ByVal TimeStep as Single) Dim N as Integer For N = 1 To Steps Register.PORTC = (Register.PORTC AND bx11110000) OR Patts(Index) Call Delay(TimeStep) If (Dir = 0) Then Index = Index + 1 If (Index > 8) Then Index = 1 End If Else Index = Index - 1 If (Index < 1) Then Index = 8 End If End If Next End Sub