LPT1 steuern direkt über PB ?!

Hardware- und Elektronikbasteleien, Ansteuerung von Schnittstellen und Peripherie.
Fragen zu "Consumer"-Problemen kommen in Offtopic.
Benutzeravatar
Then
Beiträge: 247
Registriert: 06.09.2004 13:26
Wohnort: Siegen

LPT1 steuern direkt über PB ?!

Beitrag von Then »

Hat schonmal jemand versucht den LPT1 Port direkt ausm PB anzusteuern ?? Ich meine Ohne DLL ! :roll:

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 :cry: ) aber es hing nach der 7 Schleife !

So kann ich nichts fräsen.... :freak:

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 :

Code: Alles auswählen

Result=SendToLPT1()
Result=ReceiveFromLPT1()
oder sowas...!
PB 5.62 / Windows 11 64Bit (i5/32GB/240GB-SSD+3TB-HDD/1050GTX4GB) / 27" Multitouch Monitor

... ich mache dazu keine Aussage, weil ich mich damit selbst belasten könnte !
Benutzeravatar
Falko
Admin
Beiträge: 3531
Registriert: 29.08.2004 11:27
Computerausstattung: PC: MSI-Z590-GC; 32GB-DDR4, ICore9; 2TB M2 + 2x3TB-SATA2 HDD; Intel ICore9 @ 3600MHZ (Win11 Pro. 64-Bit),
Acer Aspire E15 (Win11 Home X64). Purebasic LTS 6.0
Kontaktdaten:

Beitrag 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
Bild
Win10 Pro 64-Bit, PB_5.4,GFA-WinDOS, Powerbasic9.05-Windows, NSBasic/CE, NSBasic/Desktop, NSBasic4APP, EmergenceBasic
Benutzeravatar
Then
Beiträge: 247
Registriert: 06.09.2004 13:26
Wohnort: Siegen

Beitrag von Then »

Yo, das es mit ASM gehen soll habe ich schonmal gelesen, aber damit habe ich absolut nix am Hut ! :freak:

Es gibt doch "unsere" ASM-Spezialisten hier im Board ! Ob die da evtl helfen können ! :allright:
PB 5.62 / Windows 11 64Bit (i5/32GB/240GB-SSD+3TB-HDD/1050GTX4GB) / 27" Multitouch Monitor

... ich mache dazu keine Aussage, weil ich mich damit selbst belasten könnte !
Benutzeravatar
Falko
Admin
Beiträge: 3531
Registriert: 29.08.2004 11:27
Computerausstattung: PC: MSI-Z590-GC; 32GB-DDR4, ICore9; 2TB M2 + 2x3TB-SATA2 HDD; Intel ICore9 @ 3600MHZ (Win11 Pro. 64-Bit),
Acer Aspire E15 (Win11 Home X64). Purebasic LTS 6.0
Kontaktdaten:

Beitrag 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
Bild
Win10 Pro 64-Bit, PB_5.4,GFA-WinDOS, Powerbasic9.05-Windows, NSBasic/CE, NSBasic/Desktop, NSBasic4APP, EmergenceBasic
Benutzeravatar
SoS
Beiträge: 340
Registriert: 29.08.2004 09:31
Kontaktdaten:

Re: LPT1 steuern direkt über PB ?!

Beitrag 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 :cry: ) aber es hing nach der 7 Schleife !

So kann ich nichts fräsen.... :freak:
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 ;)
Benutzeravatar
Falko
Admin
Beiträge: 3531
Registriert: 29.08.2004 11:27
Computerausstattung: PC: MSI-Z590-GC; 32GB-DDR4, ICore9; 2TB M2 + 2x3TB-SATA2 HDD; Intel ICore9 @ 3600MHZ (Win11 Pro. 64-Bit),
Acer Aspire E15 (Win11 Home X64). Purebasic LTS 6.0
Kontaktdaten:

Beitrag von Falko »

@SOS

Deine DLL-Idee ist gut, aber leider geht das so auch nicht.

MfG Falko
Bild
Win10 Pro 64-Bit, PB_5.4,GFA-WinDOS, Powerbasic9.05-Windows, NSBasic/CE, NSBasic/Desktop, NSBasic4APP, EmergenceBasic
DarkDragon
Beiträge: 6267
Registriert: 29.08.2004 08:37
Computerausstattung: Hoffentlich bald keine mehr
Kontaktdaten:

Beitrag 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 ^^.
Angenommen es gäbe einen Algorithmus mit imaginärer Laufzeit O(i * n), dann gilt O((i * n)^2) = O(-1 * n^2) d.h. wenn man diesen Algorithmus verschachtelt ist er fertig, bevor er angefangen hat.
Benutzeravatar
Falko
Admin
Beiträge: 3531
Registriert: 29.08.2004 11:27
Computerausstattung: PC: MSI-Z590-GC; 32GB-DDR4, ICore9; 2TB M2 + 2x3TB-SATA2 HDD; Intel ICore9 @ 3600MHZ (Win11 Pro. 64-Bit),
Acer Aspire E15 (Win11 Home X64). Purebasic LTS 6.0
Kontaktdaten:

Beitrag 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.
Bild
Win10 Pro 64-Bit, PB_5.4,GFA-WinDOS, Powerbasic9.05-Windows, NSBasic/CE, NSBasic/Desktop, NSBasic4APP, EmergenceBasic
Benutzeravatar
Falko
Admin
Beiträge: 3531
Registriert: 29.08.2004 11:27
Computerausstattung: PC: MSI-Z590-GC; 32GB-DDR4, ICore9; 2TB M2 + 2x3TB-SATA2 HDD; Intel ICore9 @ 3600MHZ (Win11 Pro. 64-Bit),
Acer Aspire E15 (Win11 Home X64). Purebasic LTS 6.0
Kontaktdaten:

Beitrag 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
Bild
Win10 Pro 64-Bit, PB_5.4,GFA-WinDOS, Powerbasic9.05-Windows, NSBasic/CE, NSBasic/Desktop, NSBasic4APP, EmergenceBasic
Benutzeravatar
NicTheQuick
Ein Admin
Beiträge: 8677
Registriert: 29.08.2004 20:20
Computerausstattung: Ryzen 7 5800X, 32 GB DDR4-3200
Ubuntu 22.04.3 LTS
GeForce RTX 3080 Ti
Wohnort: Saarbrücken
Kontaktdaten:

Beitrag 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()
Bild
Antworten