> Electronique |
PrograZine issue #9 - http://www.citeweb.net/discase/9/ELECTRO.htm | Edito | Sommaire | Contribution | Contacts |
Port Joystick et Parallele
par Loubail - loubail@club-internet.fr http://www.multimania.com/loubail |
Débutant |
Salut a tous, Dans cet article je ne vais pas vous expliquer comment fonctionne tel composant ou circuit integre, je vais tout simplement vous presentez le port parallele et le port joystick. Vous allez ainsi pouvoir commencer a fabriquer de belles interfaces reliees au port joystick ou au port parallele ( et meme au deux ! ;) ).
Le port joystick joystick se situe habituellement a l’adresse 0x201. Il est associe a un connecteur SUB-D 15 points femelle. ![]() Il possede 4 entrees analogiques et 4 entrees numeriques. Donc le flux de donnees est unidirectionnel ! (il ne passe que dans un sens !). (En fait le flux de donnees n’est pas vraiment unidirectionnel Cf. b) Programmation du port joystick ). Je vais ainsi designer par A1, A2, A3 et A4 les 4 entrees analogiques et par N1, N2, N3 et N4 les 4 entrees numeriques. Desormais il faut associer chaque entree a un point !
A quoi servent les autres points ? Pour repondre a cette question je vais vous representer un schema tres explicite ! ![]() Les boutons poussoires symbolisent soit la donnee binaire 0 s’ils sont relaches soit la donnee binaire 1 s’ils sont fermes ! Mais les boutons poussoirers sont seulement associes aux entrees numeriques ! Comment fonctionnent les entrees analogiques ? Sur le schema represente ci-dessus des resistances variables prennent place. A quoi servent-elles ? La lecture analogique utilise le principe de duree c’est a dire qu’on regarde combien de temps l’entree analogique possede la donnee binaire 1 ! On associe alors a la duree une valeur qui correspond a la valeur analogique ! Pour qu’une duree prenne on utilise un condensateur qui se decharge dans une resistance (ici une resistance variable !). Le condensateur est situe dans la carte qui comporte le port joystick, et la resistance variable est incorporee dans le dispositif relie au port joystick (un joystick par exemple ;) ). Bon je ne vais pas vous faire tout un cours a propos du condensateur, je vais plutot faire un petit bilan de ce que vous devez savoir.
Voilà ceci permet d’expliquer l’utilite de resistances variables !
On peut programmer le port joystick de deux manieres : via le BIOS ou a l’aide des ports d’entrees/sorties
On peut ainsi utiliser deux sous fonctions de la fonction 84h de l’interruption 15h du BIOS.
Cette sous-fonction permet de tester l’etat des boutons des joysticks ( et donc l’etat des entrees numeriques ! ) Pour pouvoir appeler cette fonction il faut affecter a AH la valeur 84h et a DX la valeur 0. Ensuite on appelle l’interruption avec " int 15h " Differents cas se presentent :
Les Bits 4 a 7 sont alors associes aux entrees numeriques N1 a N4.
Cette sous-fonction permet de tester la position des joysticks ( et donc les valeurs associees aux entrees analogiques ) Pour pouvoir appeler cette fonction il faut affecter a AH la valeur 84h et a DX la valeur 1. Ensuite on appelle l’interruption avec " int 15h " Differents cas se presentent :
Cette technique de programmation un peu plus complique que celle qui utilise 2 sous-fonctions de la fonction 84h de l’interruption 15h du BIOS.
Le principe est simple. Vous devez tout simplement lire les donnees provenant du port joystick puis les traiter. Pour lire les donnees provenant du port joystick on peut utiliser les instruction assembleurs suivants :
Ensuite il faut traiter le registre AL ! Certains bits de AL se voient affecter l’etat des entrees numeriques ! Le tableau suivant vous montre a quels bits de AL sont associes les entrees numeriques !
La lecture des entrees analogiques s’avere un peu plus complique ( Mais pas trop ! ;) ) Tout d’abord il faut que je vous rappelle que la lecture des entrees analogiques utilise le principe de duree c’est a dire le temps necessaire a la decharge d’un condensateur dans une resistance variable. Comme il y a decharge il y a necessairement charge a un moment ! Donc avant avant d’utiliser le principe de duree il faut charger les condensateurs. Pour se faire il suffit d’envoyer vers le port joystick la donnee 255 c’est a dire qu’on charge tous les condensateurs (En fait on peut se contenter d’envoyer la donnee 31 (si je ne me trompe pas ;) ). Des lors les condensateurs charges se dechargent ! Comme ils se dechargent il faut regarder combien de temps ils se dechargent ! Donc il faut regarder combien de temps l’etat des bits 0 a 3 (qui sont associes aux entrees analogiques) reste a 1 ! (Dans la pratique on regarde durant une duree predefinie combien de fois l’etat des entrees analogiques ont ete a 1 !) Bon je vais tout de meme vous mettre les instructions assembleurs qui permettent d’effectuer ceci . ;) ( Dans la pratique on regarde durant une duree predefinie l’etat des entrees analogiques ! )
Donc vous vous rendez compte que la deuxieme methode est un plus complique que la premiere ! Il ne vous reste plus qu’a en choisir une ;) Je vous conseille tout de meme d’utiliser la deuxieme methode.
Le port imprimante est associe a un connecteur SUB-D 25 points femelle. ![]()
Dans le protocole utilisé entre une imprimante et un ordinateur on a :
Les niveaux electriques varient comme dans le port joystick entre 0 Volts et 5 Volts. Il existe 4 interfaces paralleles : LPT1, LPT2, LPT3, LPT4. Toutes ces interfaces possedent trois registres d’interface : Registre de donnees, Registre d’etat, Registre commande ! Je detaillerai l’utilisation de ces registres lorsque je parlerai de la programmation du port parallele par l’intermediaire des ports d’entree/sortie.
Ici encore on a le choix entre : programmation a l’aide du BIOS ou programmation par l’intermediaire des ports d’entree/sortie !
Le BIOS possede une interruption ( l’interruption 17h ) qui permet de gerer le port parallele. Cette interruption detient 3 fonctions.
Cette fonction permet, a l’origine, d’envoyer des caracteres vers une imprimante. Pour pouvoir appeler cette fonction il faut affecter a AH la valeur 00h, a AL le code du caractere a sortir et a DX le numero de l’imprimante. (et ceci sachant qu’une imprimante connectee a LPT1 ( LPT1 sous DOS ) porte le numero 0 ). Ensuite on appelle l’interruption avec " int 17h " Des lors a AH est affecte l’etat de l’imprimante.
Cette fonction permet, a l’origine, d’initialiser une imprimante. Pour pouvoir appeler cette fonction il faut affecter a AH la valeur 01h et a DX le numero de l’imprimante. (et ceci sachant qu’une imprimante connectee a LPT1 ( LPT1 sous DOS ) porte le numero 0 ). Ensuite on appelle l’interruption avec " int 17h " Des lors a AH est affecte l’etat de l’imprimante.
Cette fonction permet, a l’origine, de tester l’etat d’une imprimante. Pour pouvoir appeler cette fonction il faut affecter a AH la valeur 02h et a DX le numero de l’imprimante. (et ceci sachant qu’une imprimante connectee a LPT1 ( LPT1 sous DOS ) porte le numero 0 ). Ensuite on appelle l’interruption avec " int 17h " Des lors a AH est affecte l’etat de l’imprimante.
Ces 3 fonctions renvoient dans AH l’etat de l’imprimante. AH a alors la structure suivante :
Je pense qu’un petit tableau fera l’affaire :
A l’initialisation du systeme le BIOS, s’il trouve des peripheriques sur les interfaces presentees dans le tableau ci-dessus, nomme les interfaces pourvues d’un peripherique : LPT1, LPT2, LPT3 et ceci dans l’ordre donne dans le tableau represente ci-dessus. On peut neanmoins neanmoins permuter deux interfaces, mais je pense que vous n’aurez pas besoin de pratiquer une telle manipulation ! Donc je ne vais pas vous expliquer comment permuter deux interfaces. Si certains ont besoin de permuter deux interfaces : qu’ils m’ecrivent a loubail@club-internet.fr ou bailsite@hotmail.com
AH ! Vous allez enfin pouvoir connaître les caracteristiques des 3 registres de l’interface.
Comment acceder a ce registre ? Comme on ne peut qu’ecrire dans ce registre il faut employer des instructions comme l’instruction assembleur " out " sur les ports suivants : Adresse de port : MDA avec connexion parallele : 3BCh
Comment acceder a ce registre ? Comme on ne peut que lire les donnes contenues dans ce registre il faut employer des instructions comme l’instruction assembleur " in " sur les ports suivants : Adresse de port : MDA avec connexion parallele : 3BDh
(le Bit 4 n’est associe a aucun connecteur du port imprimante s’il est a 1 alors l’interruption est declenche qand ACK passe a 0) Comment acceder a ce registre ? On peut lire et ecrire avec ce registre. On doit donc employer des instructions comme les instructions assembleurs " in " et " ou " sur les ports suivants : Adresse de port : MDA avec connexion parallele : 3BEh
Recapitulons : nous avons 1 registre Read-Only, 1 registre Write-Only et 1 registre Read/Write . Nous disposons d’apres ce qui a ete dit precedemment de :
(Ces bits etant chacun associe a un connecteur sur le port parallele !) Nous pouvons donc mettre au point deux nouveaux registres de 8 bits:
Des communications 8 Bits lecture/ecriture peuvent donc etre etablies. Si on veut seulement receptionner des donnees on peut donc aussi utiliser une lecture 9 Bits (les 5 bits Read-Only et les 4 bits Read/Write) Si on veut seulement envoyer des donnees on peut aussi utiliser une ecriture 12 Bits (les 8 bits Write-Only et les 4 bits Read/Write). Vous comprenez donc pourquoi de nombreux constructeurs elaborent des peripheriques ( scanners, lecteur CD, disque dur, streamer ) qui utilisent le port parallele.
Comme vous avez assimile les connaissances necessaires a la realisation de peripheriques utilisant le port joystick ou le port parallele vous allez concevoir un premier peripherique qui utilise le port parallele. Pour commencer vous allez realiser une " guirlande lumineuse " (si on peut appeler ca ainsi ;) ) qui utilise 8 D.E.L (Diodes Electro Luminescente ( pour ceux qui ne le savait pas ;) ). Nous allons associe chacune de ces L.E.D. ( L.E.D. est l’equivalent anglais de D.E.L. ;) ) a une resistance puis a un connecteur du port parallele. Comme on utilise 8 D.E.L. nous allons utiliser le port de donnees. Bien je vais vous faire un petit schema : ;) ![]() Je vous conseille d’utiliser : 8 resistances a 1kohms et 8 LEDs de 3mm de diametre. Il ne vous reste plus qu’a realiser le montage. ;) Desormais il ne vous reste plus qu’a realiser un programme pour gerer ce peripherique. Un tel programme est relativement facile a realiser. Vous pourrez ainsi mettre au point de belles animations. Je vous donne une petite aide : En assembleur il faudra utiliser les instructions suivantes pour ecrire dans le registre de donnees :
Je vous invite a taper des programmes qui mettent en place des animations et de me les mailer. Dans un prochain article j’incluerai des sources que vous m’aurez envoye. N’oubliez pas de commenter votre code. ( si vous ne les commentez pas envoyez moi quand meme le sources). Si vous voulez mettre au point une animation originale pensez a utiliser la persistence retinienne ;)) Pour me contacter : loubail@club-internet.fr ou bailsite@hotmail.com Vous pouvez visiter mon site : vous pourrez y trouver un projet, que je decrirais probablement dans un prochain article, qui utilise le port joystick : ce projet est un crayon optique ! Mon site en francais : http://www.multimania.com/loubail/ Mon site en anglais : http://www.geocities.com/SiliconValley/Chip/8195 Bonne programmation ;) |
Cet article est la propriété de Loubail. La copie et la diffusion sont libres sauf dans un but lucratif sans accord explicite de l'auteur. |