> 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 ! ;) ).
>I\ Le port Joystick :
>a)Brochage du connecteur :

    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 !
EntréeA1A2A3A4N1N2N3N4
Point 361113271014

     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.
  • >Un condensateur est constitue par deux armatures conductrices separees par un isolant ou dielectrique.
  • Lorsque la tension entre les armatures est UAB = VA – VB, l’armature A porte la charge qA=C.UAB et l’armature B porte la charge qB = - qA
  • C est la capacite du condensateur ; elle s’exprime en farad (F).
  • Les phenomenes de charge et de decharge d’un condensateur dans un conducteur ohmique ne sont pas instantannes. Ce sont des phenomenes transitoires.
  • La constante de temps ð = R.C donne l’ordre de grandee de la duree de charge (ou de decharge) ; elle depend donc du condensateur et de la resistance danslaquelle le condensateur se charge ou se decharge.
  • Apres une duree egale a 5 ð le condensateur est charge ou decharge a 99% de sa charge maximale.

    Voilà ceci permet d’expliquer l’utilite de resistances variables !
>c.Programmation du port joystick :

    On peut programmer le port joystick de deux manieres : via le BIOS ou a l’aide des ports d’entrees/sorties
>Programmation du port joystick a l’aide du BIOS :

    On peut ainsi utiliser deux sous fonctions de la fonction 84h de l’interruption 15h du BIOS.
>Interruption 15h Fonction 84h Sous-fonction 0 :

    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 :
  • Si aucun peripherique n’est relie au port joystick alors le Flag Carry est a 1 sinon le Flag Carry est a 0.
  • Si le Flag Carry est a 0 alors a AL est affecte l’etat des entrees numeriques !

    Les Bits 4 a 7 sont alors associes aux entrees numeriques N1 a N4.
Bit de AL4567
Entrée NumériqueN1N2N3N4
> Interruption 15h Fonction 84h Sous-fonction 1 :

    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 :
  • Si aucun peripherique n’est relie au port joystick alors le Flag Carry est a 1 sinon le Flag Carry est a 0.
  • Si le Flag Carry est a 0 alors les valeurs associees aux entrees analogiques sont contenues dans les registres AX, BX, CX, DX.
RegistreAXBXCXDX
Entrée AnalogiqueA1A2A3A4
>Programmation du port joystick a l’aide des ports d’entree/sortie :

    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.
> La lecture de l’etat des entrees numeriques :

    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 :
mov dx,201h
in al,dx
l

    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 !
Bit de AL4567
Entrée NumériqueN1N2N3N4
>La lecture des entrees analogiques :

    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 !)
%%%%BEGINTAB%%%% Bit de AL#0#1#2#3 Entrée Analogique#A1#A2#A3#A4 %%%%ENDTAB%%%%

    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 ! )
	mov dx,201h
	mov al,255
	out dx,al

	mov cx, Duree ;Disons 100h ;) c’est a vous de regarder qu’elle est la meilleur valeur
	mov bl,00001111b

	cli ;On inhibe les interruptions pour ne pas perdre de temps
Boucle1 :
	in al,dx
	and al,bl ;Ceci permet d’eliminer l’etat des entrees numeriques
	cmp al,bl ;On compare al et bl pour voir s’il n’y a pas de changement

	loopz Boucle1 ;Si al=bl on retourne a Boucle1 et decremente cx
	jcxz Boucle2 ;Si cx=0 on a plus rien a faire

	xor al,bl ;On met l’etat des entrees analogiques qui ont changes a 1
	mov ah,cl ;On place dans ah le temps restant

	push ax ;On met la valeur de ax sur la pile

	dec cx ;On decremente la valeur de cx car les cycles processeurs font perdre du temps ;)
	xor bl,al ;Ceci correspond a affecter a bl la valeur de al apres in a,ldx
	
	jnz Boucle1 
	jmp Boucle3
Boucle2 :
	Push bx ;Comme cx=0 l’etat des entrees analogiques est restee a 1
Boucle3 :
	sti ;Les interruptions n’ont plus besoin d’etre inhiber ! ;)
	pop ax ; Donc soit la valeur de ax lors du push ax soit la valeur de bx lors du push bx
	sub ah,MAX_COUNT –1 
	neg ah ;On a ainsi dans AH la duree durant laquelle les etats de toutes les entrees
		; analogiques etaient a 1
		;Ensuite il suffit de regarder quel bit est a 1
		;Je vous laisse taper vous meme le code necessaire ;)
l

    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.
>II\ Le port parallele :
>a.Brochage du connecteur :

    Le port imprimante est associe a un connecteur SUB-D 25 points femelle.
ConnecteurSignalNiveauEntrée/Sortie
1Strobe0S
2Data 11S
3Data 21S
4Data 31S
5Data 41S
6Data 51S
7Data 61S
8Data 71S
9Data 81S
10AcknowledgeOE
11Busy1E
12Paper Out1E
13Select Out1E
14AutoFeed0S
15Error0E
16Printer Reset0S
17Select In0S
18Ground//
19Ground//
20Ground//
21Ground//
22Ground//
23Ground//
24Ground//
25Ground//

     Dans le protocole utilisé entre une imprimante et un ordinateur on a :
     Error : si 0 il y a erreur
     Select Out : si 1 l’imprimante est ON-LINE
     Paper Out : si 1 l’imprimante n’a plus de papier
     Acknowledge : si 0 l’imprimante est prete pour le prochain signal
     Busy : si 0 l’imprimante est utilisee
     Select In : si 1 met l’imprimante ON-LINE
     Printer Reset : si 0 provoque un reset de l’imprimante
     Autofeed : si 1 LF a CR (Auto Linefeed)
     Strobe : si 0 les donnees se strouve en D0-D7
l

     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.
>c)Programmation du port parallele :

    Ici encore on a le choix entre : programmation a l’aide du BIOS ou programmation par l’intermediaire des ports d’entree/sortie !
>Programmation du port parallele a l’aide du BIOS :

    Le BIOS possede une interruption ( l’interruption 17h ) qui permet de gerer le port parallele. Cette interruption detient 3 fonctions.
>Interruption 17h Fonction 00h :

    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.
>Interruption 17h Fonction 01h :

    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.
>Interruption 17h Fonction 02h :

    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.
>Etat de l’imprimante :

    Ces 3 fonctions renvoient dans AH l’etat de l’imprimante. AH a alors la structure suivante :
Bit76543210
SpécificitéSi 0 imprimante occupéeSi1 Accusé de recpectionSi 1 imprimante On LineSi 1 Plus de papierSi 1 Erreur de transm.RIENRIENSi 1 Erreur de Time Out
>Programmation du port parallele a l’aide des ports d’entree/sortie :
>Quels ports d’entree/sortie doit – on utiliser ?

    Je pense qu’un petit tableau fera l’affaire :
PortInterface
3BCh - 2BFhInterface parallèle sur la carte MDA
378h - 37Fh1ère interface parallèle
278h - 27Fh2nde interface parallèle

    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
>Les registres de l’interface :

    AH ! Vous allez enfin pouvoir connaître les caracteristiques des 3 registres de l’interface.
  • Registre de donnees :
Bit76543210
SpécificitéD7D6D5D4D3D2D1D0

    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
  • Connexion parallele sur la premiere interface parallele : 378h
  • Connexion parallele sur la seconde interface parallele : 278h
  • Registre d’etat :
Bit76543210
SpécificitéBUSYACKPESLCTERRORRienRienRien

    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
  • Connexion parallele sur la premiere interface parallele : 379h
  • Connexion parallele sur la seconde interface parallele : 279h
  • Registre de commande :
Bit76543210
SpécificitéRienRienRienIRQ EnableSLCT ININITAUTO FEEDSTROBE

    (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
  • Connexion parallele sur la premiere interface parallele : 37Ah
  • Connexion parallele sur la seconde interface parallele : 27Ah
>Que peut-on faire avec ces 3 registres ?

    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 :
  • 8 bits Write-Only
  • 5 bits Read-Only
  • 4 bits Read/Write

    (Ces bits etant chacun associe a un connecteur sur le port parallele !)

    Nous pouvons donc mettre au point deux nouveaux registres de 8 bits:
  • Un registre de lecture qui comprendra les 5 bits Read-Only et 3 bits Read/Write
  • Un registre d’ecriture qui comprendra les 8 Bits Write-Only

    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.
>III\ Votre premier peripherique :

    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 :
mov dx,378h ;ou 278h ou 3BCh
mov al,Donnee
out dx,al
l

    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.