Question:
Programming a parallel port as digital I/O
Faken
2010-07-13 03:57:40 UTC
view on stackexchange narkive permalink

J'essaie d'utiliser un port parallèle depuis un ordinateur comme une forme de sortie numérique bon marché pour faire diverses choses (contrôler les moteurs, les LED d'éclairage, lire les interrupteurs de fin de course, etc.).

Je veux savoir comment contrôler les 8 broches de données sur un port parallèle en utilisant C ++, mais il y a un hic. Puisque j'utilise un ordinateur moderne avec un système d'exploitation moderne, cela pose quelques problèmes.

Tout d'abord, les systèmes d'exploitation Windows modernes ne permettent pas d'accéder directement aux broches du port parallèle, je dois passer par un pilote . On m'a indiqué d'utiliser Inpout32 pour ce faire, mais l'exemple de programme a été compilé et exécuté correctement, mais mon matériel connecté n'a pas répondu. Une autre personne m'a indiqué l'utilisation de l'API Windows. J'ai cherché dans le MSDN et n'ai trouvé que des mentions de la fonction appropriée, mais sans un exemple de code, je suis perdu (peut-être que je cherche au mauvais endroit).

Le deuxième problème est que mon nouvel ordinateur n'a pas de ports parallèles. Je dois plutôt utiliser USB vers des ports parallèles (bon marché et directement depuis la Chine, 5 $ chacun, frais de port et taxes inclus). Les ports sont reconnus par l'ordinateur comme des contrôleurs IEEE-1284 et les pilotes appropriés ont été automatiquement installés et l'ordinateur signale que le périphérique "fonctionne correctement". D'après ce que j'ai vu en ligne, il semble y avoir une grande variété d'opinions sur l'utilité de ces connecteurs USB vers port parallèle. Une personne dit que cela fonctionne parfaitement comme n'importe quel port parallèle ordinaire soudé à la carte mère, une autre dit que cela fonctionnera avec certains hacks matériels, une autre dit qu'elle peut écrire mais pas lire, et enfin une autre dit que cela ne fonctionnera pas du tout parce qu'ils le sont. pas conçu pour fonctionner de la même manière que les "vrais" ports parallèles.

J'ai déjà fait beaucoup de recherches avant de venir ici (en quelque sorte en dernier recours, je suppose, StackOverflow n'a donné aucune réponse même après avoir appliqué une prime). Presque toutes les informations que j'ai trouvées sur la programmation des ports parallèles sont obsolètes et supposent que vous avez soit un port parallèle sur votre carte mère, un système d'exploitation pré-Windows-NT, ou les deux.

Si quelqu'un a une idée de comment pour ce faire, pourriez-vous le partager avec moi?

Merci,

-Faken

Remarque: j'exécute Windows 7 x64 OS sur un Core i7 860. Je programme en C ++ sur Visual Studio 2008 pro. Les connecteurs USB vers port parallèle sont connectés via des ports USB 2.0.

Comme vous utilisez une version x64 de Windows, assurez-vous que vous utilisez la version x64 de inpout32 (http://www.highrez.co.uk/Downloads/InpOut32/default.htm).
C'est une réponse très tardive, mais je peux vous donner exactement ce dont vous avez besoin si vous êtes prêt à passer à un système d'exploitation basé sur unix. Il y a quelques mois à peine, j'ai écrit un code C qui contrôlait les broches de données individuelles sur le port LPT1. Il a été écrit pour que je puisse programmer un module de mémoire SPI à partir de l'ordinateur car mon microcontrôleur n'avait pas assez de mémoire pour faire la programmation par lots que je voulais.
Sept réponses:
JustJeff
2010-07-13 04:16:39 UTC
view on stackexchange narkive permalink

Avec la technologie actuelle, si vous souhaitez opérer sur un certain nombre de signaux d'E / S discrets, le mieux est de bricoler un microcontrôleur USB dédié, ou un microcontrôleur standard couplé à une interface FTDI USB-to-232.

Les ports parallèles de la vieille école étaient disponibles dans une variété de saveurs, et tous ne pouvaient pas faire de saisie, car le port était principalement conçu pour envoyer des données à une imprimante. Il n'y avait que quelques lignes de connexion qui étaient en fait dédiées à l'entrée. Si vous voulez vraiment utiliser un port parallèle USB, vous devriez rechercher les variantes EPP ou ECP, car elles étaient du type bidirectionnel.

davr
2010-07-13 12:32:19 UTC
view on stackexchange narkive permalink

Le port parallèle est mort et les microcontrôleurs USB sont vraiment le futur IMO. Si vous utilisez le profil HID ou CDC, vous n'avez même pas besoin de pilote sur votre PC. Par exemple, le Teensy pour 18 $, vous obtenez 25 E / S, dont toutes peuvent être utilisées comme E / S numériques, ou jusqu'à 12 d'entre elles comme entrées analogiques et 7 d'entre elles comme canaux PWM. Le Teensy est plus polyvalent, si vous voulez quelque chose spécifiquement pour assurer la communication entre votre PC et l'électronique, il existe d'autres appareils plus ciblés vers cela, comme le Bus Pirate. Ou, si vous n'avez pas besoin de trop d'E / S, vous pouvez utiliser la puce USB standard et assez simple FT232R en mode 'bit-bang', et en tirer 8 E / S numériques .

Si vous refusez absolument d'écouter la raison, alors ce dont vous avez besoin est une carte PCI qui ajoute un port parallèle, comme celui-ci. Vous aurez besoin d'un slot PCI (pas PCI-Express), la plupart des cartes mères en ont encore un de nos jours, mais ils commencent à être progressivement supprimés.

Les adaptateurs USB vers Parallèle auront toutes sortes de problèmes. Le principal est la latence ... la latence du port parallèle standard est mesurée en microsecondes, tandis que la latence USB est mesurée en millisecondes. L'autre est que de nombreux adaptateurs USB vers Parallèle sont conçus uniquement pour les imprimantes et ne disposent pas des circuits supplémentaires nécessaires pour contrôler individuellement les lignes d'adresse comme vous le souhaitez.

La latence USB ressemble plus à des centaines de microsecondes, pas à des millisecondes. Les microframmes USB haute vitesse sont de 125 us chacun.
Ok, pas aussi mal que je le pensais, mais le point est toujours d'actualité. Que se passe-t-il si vous essayez d'utiliser l'USB comme vous le feriez avec un port parallèle et d'envoyer un octet à la fois? 1 octet * (1 seconde / 125 microsecondes) = 8000 octets par seconde. Et cela devient encore pire si vous dites essayer de faire SPI, petit à petit, au lieu de quelque chose qui peut gérer un octet entier à la fois. Pour utiliser efficacement l'USB, vous avez besoin d'une logique à l'autre extrémité qui peut gérer l'envoi de blocs de données à la fois, et votre logique côté PC doit être conçue pour ne pas nécessiter de réponse après chaque octet (ou bit).
Je peux donc contrôler jusqu'à 8 broches d'E / S directement à partir du logiciel depuis le processeur? Serais-je capable d'interfacer plus d'une de ces puces à partir du même programme, augmentant ainsi le nombre de broches d'E / S disponibles?
Une autre chose à considérer en ce qui concerne l'USB est que la latence n'est pas fixe.
ducksauz
2010-07-13 06:10:16 UTC
view on stackexchange narkive permalink

Le fait que vous essayez de faire cela sous Windows complique encore plus le problème. L'interaction directe avec le matériel, bien que pas impossible, est sérieusement compliquée par la HAL. J'ai fait cela sous Linux en utilisant la bibliothèque parapin, mais c'était sur une machine plus ancienne avec un vrai port parallèle sur la carte mère.

En regardant les notes pour pyParallel sous windows, il semble nécessiter le pilote giveio, qui exclut l'utilisation d'un adaptateur USB -> Parallèle.

Je vais devoir être d'accord avec Jeff et Joby ci-dessus. Allez chercher un Arduino ou un autre microcontrôleur et abordez le problème de cette façon.

Je viens de voir ce post [1] sur le blog SparkFun sur l'utilisation d'un FT232R pour les E / S en bande binaire. C'est probablement le moyen le moins cher pour quelque chose qui s'interface via USB. [1] http://www.sparkfun.com/commerce//news.php?id=386
Toby Jaffey
2010-07-13 04:04:34 UTC
view on stackexchange narkive permalink

Vous seriez peut-être mieux avec un Arduino. Ensuite, vous pouvez communiquer avec votre application PC via la liaison RS232.

Ce n'est pas beaucoup plus cher qu'un adaptateur de port parallèle USB.

jeremy
2010-07-13 07:32:22 UTC
view on stackexchange narkive permalink

Je voudrais ajouter que tous les adaptateurs USB vers port parallèle que j'ai rencontrés n'émulent pas de port parallèle, ils émulent une imprimante via USB et ne peuvent donc pas être utilisés pour leurs broches IO individuelles. Il y en a peut-être certains qui font cela comme vous le souhaitez, mais vous seriez sûrement mieux avec une solution USB IO avec beaucoup plus d'E / S telles qu'un IO-Warrior ou un Arduino.

ajs410
2010-07-14 09:40:29 UTC
view on stackexchange narkive permalink

Êtes-vous sûr d'avoir correctement connecté votre appareil au port parallèle? Avez-vous obtenu un brochage, un raccordement au bon sol, etc.? J'obtiendrais un oscope ou un multimètre numérique, puis j'activerais les 8 bits de données lorsque vous appuyez sur une touche du clavier, et j'essaierais de voir au moins cela se produire.

Utilisez-vous la bonne adresse? L'adresse par défaut des ports parallèles soudés sur la carte mère (0x378, je crois) ne fonctionnera probablement pas. Vous devriez passer par le nœud Ports (COM et LPT) du Gestionnaire de périphériques, trouver votre adaptateur USB-> parallèle, onglet Ressources, et trouver l'adresse de base de votre adaptateur.

TheBug
2010-11-06 06:14:11 UTC
view on stackexchange narkive permalink

Les périphériques USB n'ont pas d'adresse de base, ils ne font pas partie de l'espace d'adressage du CPU, tout comme un serveur sur Internet ne fait pas partie de votre espace d'adressage.

Et tout ce qui concerne l'USB en parallèle adaptateurs a déjà été dit dans cette bande de roulement, ils ne fonctionnent généralement pas pour autre chose que l'impression.



Ce Q&R a été automatiquement traduit de la langue anglaise.Le contenu original est disponible sur stackexchange, que nous remercions pour la licence cc by-sa 2.0 sous laquelle il est distribué.
Loading...