[Vc++] capteur sur port parallele XP/2000

[Vc++] capteur sur port parallele XP/2000 - C++ - Programmation

Marsh Posté le 02-09-2004 à 09:42:11    

Salut à tous
Je vous expose mon problème:
 
Je voudrais faire un prog (c/c++) qui regarde si un contact est fait entre 2 fils (et la masse) qui sont branchés sur le port parallele d'un pc tournant sur XP et 2000.
 
J'utilise inpout32.dll qui me permet de lire et d'écrire sur mon port parallele.
 
j'ai branché un fil sur une des broches de data (0x378) un autre sur une des broches de status (0x379) et un autre sur la masse. (je suis pas sur que ce soit les bon branchements)
 
___________
 
voila grosso modo mon prog:
 
 
#define DONNEE 0x378
 
int main(int argc, char* argv[])
{
     int nb;
     
     Out32(DONNEE, 255); //j'envoie sur toute les broches
     if (nb = Inp32(DONNEE  + 1) != 0)
 puts("le courant passe" );
     else
 puts("il n'y a pas eu de contact" );
     return (0);
}
 
 
donc si vous avez des idées, répondez moi :)

Reply

Marsh Posté le 02-09-2004 à 09:42:11   

Reply

Marsh Posté le 02-09-2004 à 10:03:13    

Je ne comprends pas trop comment tu branches tes 3 fils, mais il ne faut surtout pas mettre data à 1 si tu as une connexion électrique entre data et la masse. Pour lire une donnée sur le port //, il faut t'y prendre de la manière suivante :
 
Tu prends un pin que tu peux facilement mettre à par exemple strobe ou un data, et tu le mets à un (attention strobe est inversé si je me souviens bien.) ensuite, tu connectes ton pin à un par le biais d'une résistance judicieusement dimmensionnée (respecter le courant maximal que le port peut fournir) à une pin de lecture (un bit du registre status par exemple. Ensuite tu branche ton interrupteur entre la masse et l'entrée de ce bit de lecture.
Si ton interrupteur est ouvert, la tension fournie par le pin stobe ou data se retrouve sur le pin d'entrée et tu lis 1
Si ton interrupteur est fermé, le pin d'entrée est connecté à la masse et tu lis 0. le pin de sortie est connecté à la masse A TRAVERS LA RESISTANCE, et ton port ne grillera pas si la résistance est correctement dimensionnée. C'est la configuration pull down.
 
Mais c'est quand même dangereux pour le port, une fausse manip est vite arrivée. Je te conseille chaleureusement de passer par une séparation galvanique entre PC et capteur --> optocoupleur, mais ça c'est de l'électronique...

Reply

Marsh Posté le 02-09-2004 à 10:42:12    

je te remercie de tes conseils, je vais essayer tout ça

Reply

Marsh Posté le 02-09-2004 à 11:00:23    

Je n'y connais pas grand chose en elec, j'aurait plusieures questions:
 
- Quel type de resistance je doit mettre
- si je ne connecte pas de fil à la masse, qu'est ce que ça change?
 
Merci

Reply

Marsh Posté le 02-09-2004 à 13:41:42    

_ky_ a écrit :

Je n'y connais pas grand chose en elec, j'aurait plusieures questions:
 
- Quel type de resistance je doit mettre
- si je ne connecte pas de fil à la masse, qu'est ce que ça change?
 
Merci


 
Bon, c'est pas un forum d'élecronique :p mais bon.
 
Pour ce qui est de la résistance, il faut faut connaître la tension fournie au niveau 1 par ton pin que tu forces à 1 tension que l'on appellera Vcc et qui est égale à 5 ou 12 V, je ne me souviens plus, mais tu n'as qu'à la mesurer avec un voltmètre. Ensuite il faut connaître le courant maximal I que peut fournir le port parallèle. Tu devrais trouver ça sur Internet ou dans la doc de ton ordi. La valeur de la résistance à choisir sera R>(Vcc/I), avec [R]=Ohm, [Vcc]=Volt [I]=Ampère
Donc par exemple si Vcc=12V et Imax=50 microampères alors R>240 kOhm. Pour le wattage, des resistances de 1/2 watts sont amplement suffisante, là tu peux vraiment prendre ce qui te tombe sous la main, tant que la valeur est correcte.
 
La masse est nécessaire pour la circulation du courant.
 
http://www.chez.com/samr/image.JPG
 
Voilà un petit schéma qui t'explique le montage. Interrupteur ouvert -> pas de courant tu lis Vcc sur le pin de lecture. Interrupteur fermé -> le courant circule dans (et est limité par) R, tu lis 0V sur le pin de lecture.
 
edit : l'image ne s'affiche pas. copie le lien dans la barre d'adresse...


Message édité par glaurung le 02-09-2004 à 13:44:20
Reply

Marsh Posté le 02-09-2004 à 14:02:12    

Merci de tes infos  :jap:  
jvais chercher les infos necessaire et essayer de faire ce petit montage :)

Reply

Marsh Posté le 02-09-2004 à 14:54:47    

:fou:  :kaola:  :o  
 
Quand je lis sur une des broches de status, j'obtient toujours une valeur fausse:
 
en fait je fait  
 
nb = Inp32(0x379);
printf("valeur: %d\n", nb);
 
 
et j'obtient 121.
 
nb est égal au nombre rentré en paramétre, sauf si le nombre en paramétre est supérieur à 255, auquel cas on retourne à 0.  
(si je rentre 260 comme paramétre, nb == 5)
 j'obtient ces résultat que même lorsque le port parallele est vide.
 
 
Donc si quelqu'un vois d'ou ça peut venir, merci de m'aider, parceque la, jvois pas du tout  :pfff:  
 

Reply

Marsh Posté le 02-09-2004 à 16:46:10    

Aprés quelques recherches, j'ai fini par trouver:
 
La dll que j'utilise (inpout32.dll) ne fonctionne qu'en mode administrateur sous windows 2000.
 
 :D  :lol:  :pt1cable:  :)  :wahoo:  :sol:  
 
voila , je suis content.
 
Merci glaurung tu m'as beaucoup aidé

Reply

Marsh Posté le 02-09-2004 à 16:47:10    

je ne comprends pas ce que tu veux dire, 0x379, c'est le registre de status, donc tu ne peux que le lire. Par exemple connecte une imprimante sur le port parallèle. Lis 0x379 quand l'imprimante est éteinte, puis allume la et relis. Tu auras autre chose (si tu n'as pas grillé ton port parallèle entre temps... assure toi qu'il marche bien d'abord, et faits bien attention. Il n'y a pas de fusibles!) Je te conseilles chaleureusement de faire une bonne interface hardware avant de bricoler pour éviter les courts-circuit.
 

Reply

Marsh Posté le 02-09-2004 à 16:58:37    

Le truc c'est que tu n'as pas le droit d'accéder aux ports physique. Il faut passer par un driver (inpout32.dll ou autre) et alors viennent les problemes d'installation / droits utilisateurs. La solution préconisée c'est de passer par l'interface mise à disposition par l'OS (CreateFile( "LPT1", ...)
http://msdn.microsoft.com/library/ [...] ources.asp
Je ne sais pas à quel niveau, mais il me semble que l'accès au port parallele est restreint, contrairement au port série (je crois que par le port parallele ça passe par le driver ce qui peut être gênant, mais je ne sais pas dans quelle mesure).


---------------
FAQ fclc++ - FAQ C++ - C++ FAQ Lite
Reply

Marsh Posté le 02-09-2004 à 16:58:37   

Reply

Marsh Posté le 02-09-2004 à 17:08:04    

Glaurung, je lis le registre 0x379 et j'écrit sur 0x378, sinon, mon port parallele fonctionne toujours :)
 
Sinon, je vais me pencher sur ton lien HelloWorld, merci
 

Reply

Marsh Posté le 02-09-2004 à 21:17:58    

En tout cas, j'avais utilisé inpout32.dll sans problème avec winXP, mais j'avais des droits d'administrateur...

Reply

Marsh Posté le 03-09-2004 à 11:26:41    

Et si tu lances en même temps 2 instances de ton programme il se passe koi ?


Message édité par HelloWorld le 03-09-2004 à 11:27:06

---------------
FAQ fclc++ - FAQ C++ - C++ FAQ Lite
Reply

Marsh Posté le 03-09-2004 à 13:31:30    

Vu quelle en était l'application, ça n'avait pas de sens

Reply

Marsh Posté le 03-09-2004 à 14:32:17    

Même sans erreur de l'utilisateur (minimisation et oublie, test volontaire, ...) sous XP plusieurs utilisateurs peuvent travailler sur la même machine. 2 instances de ton appli peuvent tourner.
Autre possibilité, une autre appli utilise elle aussi des accès directs au port, et entre en conflit avec la tienne.


---------------
FAQ fclc++ - FAQ C++ - C++ FAQ Lite
Reply

Marsh Posté le 03-09-2004 à 17:00:14    

Je crois que tu n'as pas tout compris :pt1cable:  
 
Si tu utilises le port parallèle pour commander quelque chose ou pour acquérir des données, c'est du gros bricolage. Donc à gros bricolage hardware, gros bricolage software... Le programme n'était pas du tout destiné à être distribué, mais à tester la manip. Il peut bien être boiteux. La robustesse n'était pas visée.
Après, si on voit que ça marche, alors on peut voir pour une meilleure intégration avec une carte IO et alors là, on peut discuter pour une meilleure programmation aussi.
Dans un labo de recherche, on se fiche pas mal de la programmation, ce que l'on veut, c'est tester un produit. Si on arrive à la phase de développement, la partie programmation sera de toute façon confiée à des professionnels de la prog. Mais ce n'est pas mon domaine. Ca ne m'intéresse pas.  :D


Message édité par glaurung le 03-09-2004 à 17:01:12
Reply

Marsh Posté le 03-09-2004 à 20:44:34    

Oui oui je suis bien conscient de ça. Je veux juste essayer de faire comprendre pourquoi c'est mieux de passer par la méthode recommandée par l'OS (qui lui peut contrôler l'accès aux ressources) que de le courcircuiter via un driver et des accès directs aux ports.


---------------
FAQ fclc++ - FAQ C++ - C++ FAQ Lite
Reply

Marsh Posté le 15-02-2005 à 09:21:53    

Bonjour,
Juste une question...
Comment on fait pour se servir correctement de inpout32.dll?
(Je suis sous Win Xp en admin)

Reply

Marsh Posté le 21-02-2005 à 17:14:27    

Copie la dll dans C:\WINDOWS\system32 puis utilise les sources présentes dans l'archive pour tester ton port.

Reply

Marsh Posté le 21-02-2005 à 20:02:18    

Faut pas toucher à system32. Mets dans le path lors du développement, et dans le même répertoire que ton exe quand tu redistribues.
Cela dit ce genre de dll embarque un driver qu'elle extrait quelque part sur disque, voire même installe sur le système. C'est le cas de cette dll qui installe hwinterface.sys dans "%systemroot%\drivers". D'après la doc c'est même carément un service qui est installé.
J'aurais un préférence pour celui-là:
http://www.internals.com/utilities/winio.zip
censé être plus rapide et fonctionner même sans être admin (sauf que chez moi XP SP2 en user limité ça marche pas).


---------------
FAQ fclc++ - FAQ C++ - C++ FAQ Lite
Reply

Sujets relatifs:

Leave a Replay

Make sure you enter the(*)required information where indicate.HTML code is not allowed