Programmieren einer parallelen Schnittstelle als digitale E / A.

7

Ich versuche, einen parallelen Anschluss von einem Computer als eine Form billiger digitaler Ausgabe zu verwenden, um verschiedene Dinge zu tun (Steuermotoren, Licht-LEDs, Endschalter zum Lesen usw.).

Ich möchte wissen, wie man die 8 Datenpins an einem parallelen Port mit C ++ steuert, aber es gibt einen Haken. Da ich einen modernen Computer mit einem modernen Betriebssystem verwende, gibt es einige Probleme.

Erstens erlauben moderne Windows-Betriebssysteme keinen direkten Zugriff auf parallele Port-Pins. Ich muss einen Treiber durchgehen. Ich wurde darauf hingewiesen, Inpout32 zu verwenden, aber das Beispielprogramm wurde kompiliert und ordnungsgemäß ausgeführt, aber meine angeschlossene Hardware reagierte nicht. Eine andere Person hat mich auf die Verwendung der Windows-API hingewiesen. Ich habe die MSDN durchsucht und nur Erwähnungen der entsprechenden Funktion gefunden, aber ohne Beispielcode bin ich verloren (möglicherweise suche ich an den falschen Stellen).

Das zweite Problem ist, dass mein neuer Computer keine parallelen Ports hat. Ich muss stattdessen USB für parallele Ports verwenden (billig und direkt aus China, jeweils 5 US-Dollar, Versand und Steuern inbegriffen). Die Ports werden vom Computer als IEEE-1284-Controller erkannt und die entsprechenden Treiber wurden automatisch installiert. Der Computer meldet, dass das Gerät ordnungsgemäß funktioniert. Nach dem, was ich online gesehen habe, scheint es eine Vielzahl von Meinungen über die Nützlichkeit dieser USB-Parallelanschlüsse zu geben. Eine Person sagt, dass es einwandfrei funktioniert wie jeder normale parallele Port, der an das Motherboard gelötet ist, eine andere sagt, dass es mit einigen Hardware-Hacks funktioniert, eine sagt, dass es schreiben, aber nicht lesen kann, und eine andere sagt, dass es überhaupt nicht funktioniert, weil sie es sind nicht so konzipiert, dass es genauso funktioniert wie "echte" parallele Ports.

Ich habe bereits viel recherchiert, bevor ich hierher gekommen bin (als letztes Mittel, denke ich, hat StackOverflow auch nach dem Anwenden eines Kopfgeldes keine Antworten geliefert). Fast alle Informationen, die ich zum Programmieren paralleler Ports gefunden habe, sind veraltet und setzen voraus, dass Sie entweder einen parallelen Port auf Ihrem Motherboard, ein Betriebssystem vor Windows NT oder beides haben.

Wenn jemand eine Idee hat, wie das geht, teilen Sie sie mir bitte mit.

Vielen Dank,

-Faken

Hinweis: Ich verwende Windows 7 x64 auf einem Core i7 860. Ich programmiere in C ++ unter Visual Studio 2008 Pro. Die USB-Parallel-Port-Anschlüsse sind über USB 2.0-Ports verbunden.

Gefälscht
quelle
Stellen Sie bei Verwendung einer Windows-x64-Version sicher, dass Sie die x64-Version von inpout32 ( highrez.co.uk/Downloads/InpOut32/default.htm ) verwenden.
Timrorr
Dies ist eine sehr späte Antwort, aber ich kann Ihnen genau das geben, was Sie brauchen, wenn Sie bereit sind, auf ein Unix-basiertes Betriebssystem umzusteigen. Vor ein paar Monaten habe ich C-Code geschrieben, der einzelne Datenpins am LPT1-Port steuert. Es wurde geschrieben, damit ich ein SPI-Speichermodul vom Computer aus programmieren kann, da mein Mikrocontroller nicht annähernd genug Speicher hatte, um die gewünschte Stapelprogrammierung durchzuführen.
NickHalden

Antworten:

8

Die parallele Schnittstelle ist tot und USB-Mikrocontroller sind wirklich die zukünftige IMO. Wenn Sie das HID- oder CDC-Profil verwenden, benötigen Sie nicht einmal einen Treiber auf Ihrem PC. Zum Beispiel für den Teensy für 18 US-Dollar erhalten Sie 25 E / A, von denen alle als digitale E / A verwendet werden können, oder bis zu 12 davon als analoge Eingänge und 7 als PWM-Kanäle. Der Teensy ist ein allgemeinerer Zweck. Wenn Sie etwas speziell für die Kommunikation zwischen Ihrem PC und der Elektronik wünschen, gibt es andere Geräte, die eher darauf ausgerichtet sind, wie den Buspiraten . Wenn Sie nicht zu viele E / A benötigen, können Sie den standardmäßigen, recht einfachen FT232R-USB-Chip im Bit-Bang-Modus verwenden und 8 digitale E / A-Vorgänge ausführen.

Wenn Sie sich absolut weigern, auf die Vernunft zu hören, benötigen Sie eine PCI-Karte, die einen parallelen Anschluss wie diesen hinzufügt . Sie benötigen einen PCI-Steckplatz (nicht PCI-Express), die meisten Motherboards haben heutzutage noch einen, aber sie werden allmählich auslaufen.

USB-zu-Parallel-Adapter haben alle möglichen Probleme. Die wichtigste ist die Latenz ... Die Standardlatenz für parallele Ports wird in Mikrosekunden gemessen, während die USB-Latenz in Millisekunden gemessen wird. Das andere ist, dass viele USB-zu-Parallel-Adapter nur für Drucker entwickelt wurden und nicht über die zusätzlichen Schaltkreise verfügen, die erforderlich sind, um die Adressleitungen individuell nach Ihren Wünschen zu steuern.

davr
quelle
Die USB-Latenz entspricht eher Hunderten von Mikrosekunden, nicht Millisekunden. Hi-Speed ​​USB-Mikroframes kosten jeweils 125 US-Dollar.
Ajs410
Ok, nicht so schlimm wie ich dachte, aber der Punkt bleibt bestehen. Was passiert, wenn Sie versuchen, USB wie eine parallele Schnittstelle zu verwenden und jeweils ein Byte zu senden? 1 Byte * (1 Sekunde / 125 Mikrosekunden) = 8000 Byte pro Sekunde. Und es wird noch schlimmer, wenn Sie sagen, dass Sie versuchen, Stück für Stück SPI zu machen, anstatt etwas, das ein ganzes Byte auf einmal verarbeiten kann. Um USB effektiv nutzen zu können, benötigen Sie am anderen Ende eine Logik, die das gleichzeitige Senden von Datenblöcken verarbeiten kann, und Ihre Logik auf der PC-Seite sollte so ausgelegt sein, dass nach jedem Byte (oder Bit) keine Antwort erforderlich ist.
Davr
So kann ich bis zu 8 E / A-Pins direkt von der Software der CPU aus steuern? Wäre es mir möglich, mehr als einen dieser Chips aus demselben Programm zu verbinden und so die Anzahl der verfügbaren E / A-Pins effektiv zu erhöhen?
Gefälschte
1
Eine andere Sache, die in Bezug auf USB zu beachten ist, ist, dass die Latenz nicht festgelegt ist.
Connor Wolf
8

Wenn Sie mit der aktuellen Technologie eine Reihe von diskreten E / A-Signalen bearbeiten möchten, basteln Sie am besten an einem dedizierten USB-Mikrocontroller oder einem Standard-Mikrocontroller, der mit einer FTDI-USB-zu-232-Schnittstelle gekoppelt ist.

Parallele Ports der alten Schule gab es in verschiedenen Varianten, und nicht alle konnten Eingaben vornehmen, da der Port hauptsächlich zum Senden von Daten an einen Drucker konzipiert war. Es gab nur ein paar Handshake-Zeilen, die tatsächlich der Eingabe gewidmet waren. Wenn Sie wirklich einen parallelen USB-Anschluss verwenden möchten, sollten Sie nach den EPP- oder ECP-Varianten suchen, da diese bidirektional sind.

JustJeff
quelle
3

Die Tatsache, dass Sie dies unter Windows versuchen, macht die Sache noch komplizierter. Die direkte Interaktion mit Hardware ist zwar nicht unmöglich, wird jedoch durch die HAL ernsthaft erschwert. Ich habe dies unter Linux mit der Parapin-Bibliothek gemacht, aber das war auf einem älteren Computer mit einem echten parallelen Port auf dem Motherboard.

Wenn man sich die Hinweise für pyParallel unter Windows ansieht , scheint es den giveio-Treiber zu erfordern, der die Verwendung eines USB -> Parallel-Adapters ausschließt.

Ich muss Jeff und Joby oben zustimmen. Besorgen Sie sich einen Arduino oder einen anderen Mikrocontroller und lösen Sie das Problem auf diese Weise.

ducksauz
quelle
Ich habe gerade diesen Beitrag [1] im SparkFun-Blog über die Verwendung eines FT232R für Bitband-E / A gesehen. Dies ist wahrscheinlich der billigste Weg für etwas, das über USB angeschlossen werden kann. [1] sparkfun.com/commerce//news.php?id=386
ducksauz
1

Mit einem Arduino sind Sie vielleicht besser dran. Anschließend können Sie über die RS232-Verbindung mit Ihrer PC-Anwendung kommunizieren.

Es ist nicht viel teurer als ein USB-Parallelanschlussadapter.

Toby Jaffey
quelle
1

Ich möchte hinzufügen, dass alle USB-Adapter für parallele Ports, auf die ich gestoßen bin, keinen parallelen Port emulieren, sondern einen Drucker über USB emulieren und daher nicht für ihre einzelnen E / A-Pins verwendet werden können. Vielleicht gibt es einige, die dies so tun, wie Sie es möchten, aber mit einer USB-E / A-Lösung mit viel mehr E / A wie einem IO-Warrior oder einem Arduino sind Sie sicherlich besser dran .

Jeremy
quelle
1

Sind Sie sicher, dass Sie Ihr Gerät richtig an den parallelen Anschluss angeschlossen haben? Hast du eine Pinbelegung bekommen, dich an den richtigen Boden angeschlossen usw.? Ich würde ein Oszilloskop oder ein DMM bekommen, dann alle 8 Datenbits umschalten, wenn Sie eine Taste auf der Tastatur drücken, und versuchen, zumindest das zu sehen.

Verwenden Sie die richtige Adresse? Die Standardadresse für mit Motherboard gelötete parallele Ports (0x378, glaube ich) wird wahrscheinlich nicht funktionieren. Sie sollten den Knoten Ports (COM und LPT) des Geräte-Managers durchlaufen, Ihren USB-> Paralleladapter auf der Registerkarte Ressourcen suchen und die Basisadresse für Ihren Adapter suchen.

ajs410
quelle
0

USB-Geräte haben keine Basisadresse, sie sind nicht Teil des Adressraums der CPU, ähnlich wie ein Server im Internet nicht Teil Ihres Adressraums ist.

Und alles über USB-zu-Parallel-Adapter wurde bereits in diesem Profil erwähnt. Sie funktionieren normalerweise nur für das Drucken.


quelle