Seite 1 von 2
LPT1 steuern direkt über PB ?!
Verfasst: 04.04.2005 11:10
von Then
Hat schonmal jemand versucht den LPT1 Port direkt ausm PB anzusteuern ?? Ich meine Ohne DLL !
Habe mein CNC Programm getestet und es mit Inpout32.dll laufen lassen, aber nach ca. 10.000 Signalen war "Hängen im Schacht". Dann habe ich das Programm umgeschrieben und mit der "IO.DLL" probiert. Geschwindigkeit war gleich ! Das Programm lief dann fast doppelt so lang und dann hing auch das wieder.
Um Auszuschließen, dass es mein Code war, habe ich es derbe abgekürzt und eine Schleife nur so laufen lassen, daß der Motor 1000 Schritte nach rechts geht und dann 1000 nach links. Das ganze dann unendlich (eigentlich

) aber es hing nach der 7 Schleife !
So kann ich nichts fräsen....
Gibt es da nicht POKE oder sowas mit direkter Adresse wo ich die BITs setzen kann ?? Habe leider da noch nix gefunden - und ehrlich gesagt habe ich mit dem POKEn nix am Hut...!
Praktisch mein Wunsch an PB4.0 :
oder sowas...!
Verfasst: 04.04.2005 22:03
von Falko
Ich weis jetzt nicht genau, ob über ASM vielleicht die LPT direkt
anzusteuern ist, oder nicht. Hier habe ich aber eine Seite gefunden, wo
jemand was mit Delphi über ASM schreibt.
Ob das jetzt wegen Win2K oder XP konnte ich nicht daraus lesen. Eine
andere DLL ist dort auch vorhanden.
Vielleicht ein Anstoss, wenn es über ASM vielleicht möglich ist z.B für
eine LPT.lib .
Die Seite ist noch im Aufbau:
http://www.delphi-roboter.de/2par.htm
MfG Falko
Verfasst: 05.04.2005 09:42
von Then
Yo, das es mit ASM gehen soll habe ich schonmal gelesen, aber damit habe ich absolut nix am Hut !
Es gibt doch "unsere" ASM-Spezialisten hier im Board ! Ob die da evtl helfen können !

Verfasst: 05.04.2005 14:01
von Falko
Leider habe ich auch nicht viel Ahnung von ASM, ausser das ich in Büchern rumstöbern kann, die ich habe

. So in etwa könnte das lesen und schreiben der Ports aussehen. So wie es jetzt ist habe ich schon beim ausslesen in IN al, dx einen Fehler. Wenn hier ein ASM-Profi hier nachhelfen kann, wenn das so überhaupt möglich ist, würde ich mich sehr freuen. Im Voraus vielen Dank wenn es überhaupt möglich ist. Hier habe ich erst mal einen Versuch gemacht, der so nicht funst.
Code: Alles auswählen
;Schreiben und lesen von Ports
;ASM-Unterstützung einschalten.
BA.l=$378 ; Basisadresse: $378=LPT1 ; $278=LPT2
;Offsetadresse zum Port addieren für die jeweiligen Register
#Datenregister=0
#Statusregister=1
#Steuerregister=2
;Schreibt einen Wert in Port
Procedure OUT_Port(Port.l,Wert.l)
MOV edx, Port ; lade Port in edx
MOV eax, Wert ; lade Wert in eax
OUT dx, eax ; schreibe "Wert in Port"
EndProcedure
;liest einen Wert aus dem Port
Procedure.l IN_Port(Port.l)
Shared Wert.l
MOV edx, Port
IN al, dx ; // lese "Wert von Port"
MOV Wert, eax ; //lade "Wert in Wert"
ProcedureReturn
EndProcedure
;Auslesen
Wert.l=IN_Port(BA)
Debug Wert
WinDbg hat geschrieben:Folgender Fehler wird im Debugger angezeigt:
*** wait with pending attach
Symbol search path is: *** Invalid *** : Verify _NT_SYMBOL_PATH setting
Executable search path is:
ModLoad: 00400000 00404000 F:\PureBasic\Compilers\PureBasic9448781.exe
ModLoad: 7c910000 7c9c7000 C:\WINDOWS\system32\ntdll.dll
ModLoad: 7c800000 7c906000 C:\WINDOWS\system32\kernel32.dll
ModLoad: 73d00000 73d27000 C:\WINDOWS\system32\CRTDLL.dll
ModLoad: 77d10000 77da0000 C:\WINDOWS\system32\USER32.dll
ModLoad: 77ef0000 77f36000 C:\WINDOWS\system32\GDI32.dll
ModLoad: 77da0000 77e4a000 C:\WINDOWS\system32\ADVAPI32.DLL
ModLoad: 77e50000 77ee1000 C:\WINDOWS\system32\RPCRT4.dll
(b18.5a0): Unknown exception - code c0000096 (!!! second chance !!!)
eax=00000378 ebx=7ffd8000 ecx=7c9206eb edx=00000378 esi=0012ff94 edi=0012cd64
eip=004010e5 esp=0012ff90 ebp=0012fff0 iopl=0 nv up ei pl zr na po nc
cs=001b ss=0023 ds=0023 es=0023 fs=003b gs=0000 efl=00000246
*** WARNING: Unable to verify checksum for F:\PureBasic\Compilers\PureBasic9448781.exe
*** ERROR: Module load completed but symbols could not be loaded for F:\PureBasic\Compilers\PureBasic9448781.exe
PureBasic9448781+10e5:
004010e5 ec in al,dx
Re: LPT1 steuern direkt über PB ?!
Verfasst: 05.04.2005 15:14
von SoS
Then hat geschrieben:Habe mein CNC Programm getestet und es mit Inpout32.dll laufen lassen, aber nach ca. 10.000 Signalen war "Hängen im Schacht". Dann habe ich das Programm umgeschrieben und mit der "IO.DLL" probiert. Geschwindigkeit war gleich ! Das Programm lief dann fast doppelt so lang und dann hing auch das wieder.
Um Auszuschließen, dass es mein Code war, habe ich es derbe abgekürzt und eine Schleife nur so laufen lassen, daß der Motor 1000 Schritte nach rechts geht und dann 1000 nach links. Das ganze dann unendlich (eigentlich

) aber es hing nach der 7 Schleife !
So kann ich nichts fräsen....
hmm,ohne codebeispiel kann man natürlich nicht schauen ob du irgendwo einen fehler machst

schau dir mal
http://forums.purebasic.com/german/viewtopic.php?t=332 an,damit habe ich ein lcd über den druckerport angesteuert.
der code lässt sich einfach auf eine dll anpassen (inpout,io o.ä.)
ich habe auch 3 verschiedene dlls damit getestet und hatte keine probleme damit.
die testergebnisse der einzellnen dlls findest du unter
http://forums.purebasic.com/german/view ... c&start=10
@Falko
die IN/OUT geschichte wird glaub ich von windows geblockt und nur von treibern zugelassen.
Vieleicht würde es gehen wenn du aus den code eine dll erstellst,kommt auf einen test an

Verfasst: 05.04.2005 18:45
von Falko
@SOS
Deine DLL-Idee ist gut, aber leider geht das so auch nicht.
MfG Falko
Verfasst: 05.04.2005 19:04
von DarkDragon
Kann es sein dass OUT und IN 16 Bit parameter verwenden und eben das nichtmehr mit einem Win > 98 nichtmehr funktioniert?

Soviel ich weiß wurde es dort abgeschafft, zumindest dieses IN und OUT zeug. In PB wären doch al, dx, ... eh nicht möglich, allerhöchstens in direktASM(Ihr wisst schon, das mit dem ! am anfang

). Aber es scheint auch nicht zu gehen. Wenn alles in direktASM ist gehts aber immernochnich ^^.
Verfasst: 05.04.2005 19:56
von Falko
Soll wohl daran liegen, das PB mit 16-Bit... nichts anfangen kann. Verstehe dann aber den Zugriff über DLL's nicht, den Delphi über ASM erzeugt. Dann dürften die doch auch nicht laufen, wenns wegen dem dx sein sollte.
[Edit] Was ich über die Inpout32 noch gelesen habe, ist das ab Win2K zusätzlich ein SYS-Interface installiert wird.
@Then
Hast du im Bios für die LPT den Modus auf Standard bzw. Bidirektional eingestellt? Könnte vielleicht auch damit zusammenhängen.
Wenn es am Wert 1000 liegt müßte man das evt. relativ machen, das statt
1000 vielleicht das ganze mit 2 x 500 Schritte vor und zurück ausprobiert.
Verfasst: 06.04.2005 11:08
von Falko
Vielleicht geht das über die DDK (Interfaces oder so) Hab hier noch was anderes zu NT gefunden.
http://msdn.microsoft.com/library/defau ... 62.xml.asp
Verfasst: 06.04.2005 12:01
von NicTheQuick
Für die WinIO habe ich hier einige Beispiel-Procedures, falls sie jemand braucht.
Code: Alles auswählen
Global WinIOAktiv.l
Procedure OpenWinIO()
Result.l = OpenLibrary(0, "WinIo.dll")
If Result = #False
WinIOAktiv = #False
MessageRequester("ERROR", "WinIO.dll wurde nicht gefunden oder ist korrupt.", #MB_ICONERROR)
End
Else
If CallFunction(0, "InstallWinIoDriver", "WinIo.vxd", #False)
WinIOAktiv = #True
Else
MessageRequester("ERROR", "WinIO.sys konnte nicht installiert werden." + Chr(13) + "Bitte melden sie sich mich Administratorrechten an und versuchen sie es erneut.", #MB_ICONERROR)
End
EndIf
If CallFunction(0, "InitializeWinIO")
WinIOAktiv = #True
Else
MessageRequester("ERROR", "WinIO konnte nicht initialisiert werden.", #MB_ICONERROR)
End
EndIf
EndIf
ProcedureReturn Result.l
EndProcedure
Procedure CloseWinIO()
CallFunction(0, "ShutDownWinIo")
CallFunction(0, "RemoveWinIoDriver")
CloseLibrary(0)
WinIOAktiv = #False
EndProcedure
Procedure SetBits(Value.l)
Address.l = 956
Result1.l = CallFunction(0, "SetPortVal", Address, Value)
If Result1.l = #False : Debug "SetBits - ERROR" : EndIf
ProcedureReturn Result1
EndProcedure
Procedure GetBits(Address.l)
Value.l
Result.l = CallFunction(0, "GetPortVal", Address, @Value, 4)
If Result = #False : Debug "GetBits - ERROR" : EndIf
ProcedureReturn Value
EndProcedure
Procedure GetPVal(Address.l, Length.l)
Value.l
Result.l = CallFunction(0, "GetPortVal", Address, @Value, Length)
If Result = #False : Debug "GetPVal - ERROR" : EndIf
ProcedureReturn Value
EndProcedure
Procedure SetPVal(Address.l, Value.l, Length.l)
Result.l = CallFunction(0, "SetPortVal", Address, Value, Length)
If Result = #False : Debug "SetPVal - ERROR" : EndIf
ProcedureReturn Result
EndProcedure
Procedure CheckWinIOFunctions()
If WinIOAktiv
Restore CheckWinIOFunctionsData
For a.l = 1 To 10
Read FunctionName.s
If IsFunction(0, 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
CheckWinIOFunctionsData:
Data.s "InitializeWinIo", "ShutdownWinIo", "InstallWinIoDriver", "RemoveWinIoDriver"
Data.s "GetPortVal", "SetPortVal", "GetPhysLong", "SetPhysLong"
Data.s "MapPhysToLin", "UnmapPhysicalMemory"
EndDataSection
EndProcedure
Procedure.b ReadCMOSByte(Offset.b)
InpB.b
CallFunction(0, "SetPortVal", $70, Offset, 1)
CallFunction(0, "GetPortVal", $71, @InpB, 1)
ProcedureReturn InpB
EndProcedure
OpenWinIO()
CheckWinIOFunctions()
SetBits(1)
CloseWinIO()