A.M.F.N. |
Ce schéma représente des
interrupteurs, ou des contacts de relais, mais il pourrait aussi bien inclure
des sorties TTL (0/5V) de dispositifs électroniques. Dans ce dernier
cas, les "pull-ups" de 10k seraient inutiles.
On a utilisé quatre lignes non inverseuses, ce qui fait qu'on lit un bit à 0 lorsque le contact est fermé, et inversement. L'instruction INP lit ces entrées 4 par 4. La seule difficulté consiste à extraire les bits intéressants. |
Exemple de programmation en BASIC: |
DEFINT A-Z 'toutes les variables
sont entières
... DEF SEG=&h40 'chargement du pointeur de segment A0=PEEK(8)+256*PEEK(9) 'lecture de la valeur entière sur 2 octets DEF SEG 'restauration du pointeur de segment A1=A0+1: A2=A1+1 'calcul des adresses des 2 autres registres ... def FnLecture(UnBit) 'lit un bit sur l'interface. UnBit=3, 4, 5 ou 6 Masque=2^UnBit 'peut aussi se faire par indexation EtatDuPort=inp(A1) if EtatDuPort and Masque = Masque then FnLecture=0 'inversion else FnLecture=1 'inversion end if end def ... ... 'utilisation: if FnLecture(3)=1 then print "l'inter sur le fil 3 est fermé" ... |
Lecture
d'un grand nombre d'entrées permanentes:
Voici une façon simple de lire
5x8=40 entrées à niveaux TTL (0/5V) avec des sélecteurs
74HCT251.
Le numéro de l'entrée à lire est donné par les bits D0 à D5, et l'état de l'entrée est lu sur la ligne I3. Les bits D0 à D2 sont décodés par les 251, et les bits D3 à D5 par le 138 en tête. Ce montage est extensible à 64 points simplement en rajoutant trois autres 74HCT251. On a été limité ici par la taille du dessin. On peut également étendre la capacité du montage en utilisant les lignes de lecture I4, I5 et I6 et -I7. Il suffit pour cela de rajouter des 74HCT251 commandés par le même 74HCT138. La capacité maximum est alors portée à 320 points. |
Exemple de programmation en BASIC: |
DEFINT A-Z 'toutes les variables
sont entières
... DEF SEG=&h40 'chargement du pointeur de segment A0=PEEK(8)+256*PEEK(9) 'lecture de la valeur entière sur 2 octets DEF SEG 'restauration du pointeur de segment A1=A0+1: A2=A1+1 'calcul des adresses des 2 autres registres ... def FnEntree(NumeroEntree) 'lit une entrée sur l'interface. out(A0),NumeroEntree EtatDuPort1=inp(a1) if EtatDuPort1 and 3 = 3 then FnEntree=1 else FnEntree=0 end if end def ... ... 'utilisation: if FnEntree(24)=1 then print "l'entrée numéro 24 est à 1" ... |
Lecture d'entrées fugitives (boutons poussoirs):
Lorsqu'on a besoin de lire des entrées
fugitives (en pratique des boutons poussoirs, qui ne restent enfoncés
que que pendant un temps assez court), il est possible de faire d'importantes
économies de composants en "matriçant" ces contacts, c'est-à-dire
en les connectant en lignes et en colonnes. Nous utilisons ce montage pour
gérer des pupitres de commande de gare.
Voici une façon simple de lire
l'état de 64 boutons avec seulement 2 circuits intégrés
et 8 diodes.
Au repos, les sorties du 74HCT138 sont
à "1" ainsi que les entrées du 74HCT251.
Ce montage est extensible à un plus grand nombre de contacts en rajoutant des diodes en sortie du 138, et d'autres 251 connectés aux lignes I4 à I6. La capacité est alors portée à 320 contacts avec seulement 6 circuits intégrés. Important: les diodes doivent impérativement être du type Schottky. |
Pour plus de clarté,
voici le détail de la connexion des 64 boutons.
Les fils U0 à
U7 représentent les unités, et les fils H0 à H7 les
huitaines.
- les boutons sont d'abord numérotés au hasard, mais en n'utilisant que les numéros ci-contre, - ensuite on tire le fil U0 vers tous les boutons ayant comme numéro d'unité: 0, - on fait de même pour les autres fils d'unité, puis on passe aux dizaines, Quand le câblage est terminé, on fait tourner dans le PC un programme qui affiche le numéro des boutons enfoncés. On appuie alors à tour de rôle sur tous les boutons, on relève leur numéro sur l'écran et on le reporte sur le plan du pupitre. Cette méthode
fait gagner beaucoup de temps parce qu'elle évite d'avoir à
câbler en suivant un plan pré-établi (inutile donc
de rédiger ce plan) et qu'elle supprime radicalement les erreurs.
|
Exemple de programmation en BASIC: |
DEFINT A-Z 'toutes les variables
sont entières
... DEF SEG=&h40 'chargement du pointeur de segment A0=PEEK(8)+256*PEEK(9) 'lecture de la valeur entière sur 2 octets DEF SEG 'restauration du pointeur de segment A1=A0+1: A2=A1+1 'calcul des adresses des 2 autres registres ... def FnEntree(NumeroEntree) 'lit une entrée sur l'interface. out(A0),NumeroEntree EtatDuPort1=inp(a1) if EtatDuPort1 and 3 = 3 then FnEntree=1 else FnEntree=0 end if end def ... ... 'utilisation: if FnEntree(24)=1 then print "l'entrée numéro 24 est à 1" ... |
Remarque:
avec un tel montage, il y a une
limitation relative
au nombre de boutons enfoncés simultanément.
Cette situation se présente couramment
avec les pupitres de commande "géographiques", où l'opérateur
doit appuyer simultanément sur les boutons "origine" et "destination"
des itinéraires pour les réaliser.
En pratique, le matriçage
permet de détecter correctement l'enfoncement simultané de
trois
boutons quelconques, ce qui est tout à fait suffisant pour l'application
considérée, ou plus de boutons, à condition qu'ils
ne soient pas disposés "en rectangle", ce qui permet de traiter
plusieurs postes de commande en une seule matrice.
Notons enfin que ce type de montage convient parfaitement aux PICs et aux micro-contrôleurs. Certains incluent même des ports de sortie en collecteur ouvert et des résistances pull-up sur les entrées, ce qui permet d'y connecter nos boutons sans aucun composant additionnel.
Page suivante: extension
du nombre d'entrée-sorties.
sommaire pages techniques | sommaire port parallèle | page suivante |