Ich habe hier auch zwei Schrittmotoren, die ich mit PureBasic ansteuere. Die haben vier Anschlüsse, wovon zwei davon jeweils negiert zu den anderen zwei sind. Da ich aber noch keine NOT-Gatter hier habe, brauche ich 4 Bits pro Motor, d.h. ich kann am LPT nur zwei Schrittmotoren ansteuern, was aber tadellos funktioniert. Die Motoren machen 100 Schritte pro Umdrehung, also 3.6° pro Schritt, was bei minimal 2 ms Umschaltzeit funktioniert. Wenn ich auf 1 ms pro Schritt gehe, fehlen einige Schritte und das ganze läuft nicht rund. Schade eigentlich.
Hier ist mein Code dafür, falls ihn jemand braucht:
Code: Alles auswählen
#InpOut_ID = 1
Global InpOut32Aktiv.l
Procedure OpenInpOut32()
Protected Result.l
Result = OpenLibrary(#InpOut_ID, "InpOut32.dll")
If Result = #False
InpOut32Aktiv = #False
MessageRequester("ERROR", "InpOut32.dll wurde nicht gefunden oder ist korrupt.", #MB_ICONERROR)
End
Else
InpOut32Aktiv = #True
EndIf
ProcedureReturn Result
EndProcedure
Procedure CloseInpOut32()
CloseLibrary(#InpOut_ID)
InpOut32Aktiv = #False
EndProcedure
Procedure SetBits(Value.l)
Protected Address.l
Address = $378
ProcedureReturn CallFunction(#InpOut_ID, "Out32", Address, Value)
EndProcedure
Procedure.l GetBits()
Protected Address.l, Value.l
Address = $379
Value = CallFunction(#InpOut_ID, "Inp32", Address)
ProcedureReturn Value
EndProcedure
Procedure.l Inp32(Address.l)
Protected Value.l
Value = CallFunction(#InpOut_ID, "Inp32", Address)
ProcedureReturn Value
EndProcedure
Procedure Out32(Address.l, Value.l)
ProcedureReturn CallFunction(#InpOut_ID, "Out32", Address, Value)
EndProcedure
Procedure CheckInpOut32Functions()
Protected FunctionName.s
If InpOut32Aktiv
Restore CheckInpOut32FunctionsData
For a.l = 1 To 2
Read FunctionName
If IsFunction(#InpOut_ID, FunctionName) = #False
MessageRequester("ERROR", "Die Funktion " + Chr(34) + FunctionName + Chr(34) +" wurde nicht gefunden", #MB_ICONERROR)
ProcedureReturn #False
EndIf
Next
ProcedureReturn #True
Else
ProcedureReturn #False
EndIf
DataSection
CheckInpOut32FunctionsData:
Data.s "Inp32", "Out32"
EndDataSection
EndProcedure
Dim Motor.b(3)
Motor(0) = %1001
Motor(1) = %1100
Motor(2) = %0110
Motor(3) = %0011
MaxMotorSchritt.l = 4 ; Bits pro Motor
MaxPos.l = 400 ; Schritte für das Trackbargadget
Pos1.l = 0 ; Startposition von Motor 1
NewPos1.l = 0
Pos2.l = 0 ; Startposition von Motor 2
NewPos2.l = 0
t_delta.l = 2 ; Umschaltzeit pro Schritt
t_old.l = ElapsedMilliseconds()
If OpenInpOut32()
Win_Main.l = OpenWindow(#PB_Any, 0, 0, 402, 40, #PB_Window_ScreenCentered | #PB_Window_SystemMenu, "Schrittmotor")
If Win_Main
If CreateGadgetList(WindowID(Win_Main))
Gad_Track1.l = TrackBarGadget(#PB_Any, 1, 1, 400, 18, 0, MaxPos)
Gad_Track2.l = TrackBarGadget(#PB_Any, 1, 21, 400, 18, 0, MaxPos)
Repeat
EventID.l = WindowEvent()
Select EventID
Case #PB_Event_CloseWindow
Break
Case #PB_EventGadget
Select EventGadgetID()
Case Gad_Track1
NewPos1 = GetGadgetState(Gad_Track1)
Case Gad_Track2
NewPos2 = GetGadgetState(Gad_Track2)
EndSelect
Case 0
Delay(1)
EndSelect
If t_old + t_delta < ElapsedMilliseconds()
If Pos1 > NewPos1 : Pos1 - 1 : ElseIf Pos1 < NewPos1 : Pos1 + 1 : EndIf
If Pos2 > NewPos2 : Pos2 - 1 : ElseIf Pos2 < NewPos2 : Pos2 + 1 : EndIf
SetBits(Motor(Pos1 % MaxMotorSchritt) + Motor(Pos2 % MaxMotorSchritt) << MaxMotorSchritt)
t_old = ElapsedMilliseconds()
EndIf
ForEver
EndIf
CloseWindow(Win_Main)
EndIf
SetBits(0)
CloseInpOut32()
EndIf