Beiträge von gandro

    Problem ist deine Abbruchbedingung. Im zweiten Loop sagst du "laufe solange wie gilt: 'zur <= 0'". Die Variable "zur" ist aber zum Startpunkt nicht kleiner-gleich Null, daher wird die Schleife nicht ausgeführt. Da müsste stehen: zur >= 0;

    Hätte mich auch erstaunt wenn sich mit dem ursprünglichen Code was bewegt hätte. Das einzige was ich mir vorstellen könnte, ist dass du 1 Byte senden kannst, danach blockierts weil kein ACK reinkommt. Aber vermutlich blockiert das Protokoll schon vorher.

    Mein Tipp übrigens um die Bitaddressierung etwas zu vereinfachen: Definier dir C/C++ Konstanten für die ganzen Bitpositionen:

    // Ausserhalb aller Funktionen#define D0 (1 << 0)#define D1 (1 << 1)#define D2 (1 << 2)#define D3 (1 << 3)#define D4 (1 << 4)#define D5 (1 << 5)#define D6 (1 << 6)#define D7 (1 << 7)

    // In deinem Code:

    // Pin D1, D3 und D4 setzen:char byte = D1 + D3 + D4; // (alternativ: byte = D1|D3|D4; )Out32(base, byte);// Pin D3 und D4 wieder ausmachen: char byte = Inp32(base) - D4 - D3; // (alternativ: byte = Inp32(base) & ~D4 & ~D3)Out32(base, byte);// Status von D5 auslesen:bool status = !!(Inp32(base) & D5);

    Nett, hab das Video erst jetzt gesehen.

    Nur so aus Neugier.. das allererste Programm in diesem Thread wo du die Datenbits via Byteprotokoll setzt (also mit fopen) funktioniert das wider erwarten doch? Oder machen dir OS-Buffer und Ack-Bits den Plan zunichte?


    Ich habs mal eben abfotografiert:

    Spoiler anzeigen



    Bei dem Bild ist der Rechner nun aus, sonst blendet die LED zu sehr!
    Die LEDs sind natürlich aus, wenn der Rechner aus ist! Aber sonst sind die immer high!


    Öhm. Kann sein dass ich gerade nen Denkfehler mache, aber meiner Meinung nach ist das verkehrt rum:

    Das hier ist der Port (hier wäre 3D Ansicht)

    Wenn ich dein Bild richtig lese, dann ist doch der Widerstand bei dir in Port 12, und die LED geht nach Port 21.

    Meiner Meinung nach wäre aber so hier richtig Fig. 2:

    Also LED an Port 2, Widerstand auf der Masse-Seite (Port 18-25). Oder Widerstand vor der LED? Kenn mich bei der Elektronikseite nicht aus :D

    Bin mir aber fast sicher, dass du die Pins vertauscht hast. Mach das ganze mal seitenverkehrt.

    Die Beschaltung die du hast wäre für einen männlichen Stecker (nicht: Anschluss) geeignet..

    Nachtrag: Jau, hier nochmals die Pin-Nummern für Stecker und Anschlus:
    Stecker: http://kartikmohta.com/tech/parallelport/male.jpg
    Anschluss: https://lh3.ggpht.com/-RSVGM9fJSBQ/T…rallel-Port.jpg

    Also wenn der Rechner aus ist, dann sollten die LEDs eigentlich aus sein o_O


    Finde es eh seltsam dass der Port standardmässig auf High ist. Wie sind die LEDs denn angeschlossen, hast du da mal Foto oder so?

    Es soll Karten geben, die über das das x86 IO Interface machen, und nicht bloss für Drucker und deren Byteprotokolle gedacht sind. Aber glaube dazu würde ich doch erst mal das mit dem internen Port hinkriegen.

    Ansatzpunkt wär es ggf auch mal die angeschlossene Elektronik zu überprüfen, ob die überhaupt reagiert wie sie soll.. wobei ich da falsche Anlaufstelle bin

    Die 8 Leitungen D0 bis D7 sollten eigentlich schon den 8 Bits in 0x378 entsprechen. Kannst ja mal noch 889 bzw. 890 probieren, sollten aber nicht funktionieren dürfen.

    Der Port ist schon fix am Motherboard angemacht, und nicht etwa ein USB-Gebastel oder so? Schau ggf. auch mal im BIOS ob du den Port auf den alten SPP Modus stellen kannst. Und was das BIOS dem Port für ne Adresse zuweisen will..

    Okay, dann erzeugst du wohl 32Bit Programme. Dann müsste es mit der InpOut32.dll aus dem Win32 Verzeichnis echt funktionieren. Den Wert 255 anstatt 0 beim Aufrufen hast du ja auch schon versucht? Bin ratlos :(

    Der Installer liegt in Win32, steht aber irgendwo dass der dir die 64bit Version installiert auf 64bit Systemen. Die Installation scheint jedenfalls zu klappen.

    Die Test-Applikation kannst du mit Parametern aufrufen, in der Kommandozeile z.B. mit

    Alle Datenpins auf Low: InpoutTest.exe write 888 0
    Alle Datenpins auf High: InpoutTest.exe write 888 255

    888 ist die Dezimalschreibweise von 0x0378.

    Nachtrag: Falls das nicht klappt, versuche auch mal in der Test-Applikation LoadLibrary("InpOutx64.DLL") zu verwenden, für denn Fall dass deine Applikation 64bit ist.

    Ach, erst jetzt deine Bearbeitung gesehen..

    64Bit Treiber: http://www.highrez.co.uk/downloads/inpout32/default.htm

    Lade dir unten das "Binaries only - x86 & x64 DLLs and libs" Archiv. Führe die Win32\InstallDriver.exe aus.
    Verwende auch unbedingt die inpout32.dll aus dem neuen Treiber. Falls du eine 64bit EXE erzeugst, musst du die inpoutx64.dll verwenden (auch den Namen im Code nicht vergessen zu ändern). Wenn du eine 32bit EXE erzeugst, dann sollte obiger Code funktionieren.

    Auf der Seite hats übrigens auch ne Beispiel C++ Applikation. Versuche ggf. die mal zu kompilieren.

    Hm.. Windows Server 2008 R2 ist Windows 7 basiert. Verwendest du die 32bit oder die 64bit Version? Für letzteres brauchst du nämlich nen gesonderten Treiber. Auch bin ich nicht sicher ob der alte WinNT Treiber mit Win7 wirklich tut.. aber müsste vermutlich schon.

    Ja, "eigentlich" müsste das funktionieren. :D

    Kannst ja nochmal versuchen Out32(base, 0x00); und nach nach einer Pause oder Tastendruck dann Out32(base, 0xFF); aufzurufen. Das setzt dir alle Datenbits (D0-D7) erst auf 0, dann auf 1 (müssten dann +5V sein). Wenn sich die LEDs dann nicht verändern, dann ist wohl echt was mit dem Treiber im Argen.

    Hab mich auch noch bisschen durch den Sourcecode der inpout32.dll durchgewühlt, aber die scheint schon wirklich den Kerneltreiber (die hwinterface.sys, die du ja nach System32/Drivers kopiert hast) nachdrücklich zu laden. Bin da etwas ratlos. Betriebsystem? Auf dem einen Screenshot sieht man ne OS X Menübar.. Virtuelle Maschine?

    Okay.. ich kenn mich wie gesagt unter Windows da nicht sonderlich aus, hab das zuletzt mit DOS und später mit Linux gemacht.

    Da er den Treiber grundsätzlich zu laden scheint wären die nächsten Schritte mal rauszufinden was denn die wirkliche Basis-I/O-Adresse deines Paralleports ist. Das Interweb schlägt vor, man solle das im Gerätemanager nachschlagen:

    Meiner Meinung müsst da bei deinem Parallelport im eingekreisten sowas stehen wie 0378 oder 0278.. das ist deine Basis-Addresse, die du für short base = 0x0278 verwenden musst in deinem Code (hier jetzt für den Fall dass da 0278 steht, die führende Null wäre egal). An welchen Pins hast du die LEDs denn angeschlossen?

    Ich kenn mich mit dem Linkern unter Windows und C++ nicht aus. Generell gehen aber die meisten Codebeispiele die ich gefunden habe davon aus, dass man die DLL händisch nachlädt. Hier C-Code von der Treibseite, stelle sicher dass die Datei inpout32.dll im gleichen Verzeichnis liegt, wie die Exe deines komplierten Codes.

    Hab mich beim obigen Beispiel übrigens vertippt, der Befehl müsste Out32 bzw. Inp32 lauten.