Les lignes d’entrée peuvent être utilisées pour lire l’état de contacts, boutons, détecteurs d’occupation de voie, etc.
Sommaire
Lecture directe d’entrées permanentes
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.
Lecture d’un grand nombre d’entrées permanentes
Voici une façon simple de lire 5×8=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.
L’instruction INP lit ces entrées 4 par 4. La seule difficulté consiste à extraire les bits intéressants.
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.
Lorsque le PC exécute une opération de lecture, le numéro du bouton à lire est affiché sur les bits D0 à D5.
Le 138 met alors une de ses sorties à « 0 » (celle correspondant aux bits D3 à D5), et le 251 sélecte l’état d’une de ses entrée (celle correspondant aux bits D0 à D1).
Si le bouton câblé entre cette sortie et cette entrée est enfoncé, la sortie du 251 passe à « 0 » et peut être lue dur la ligne -D7.
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.
Mais en pratique, pour exécuter simplement le câblage, on n’a pas à se soucier du numéro réel des boutons: on procède ainsi :
- 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.
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.
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é »
…
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 »
…
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 »
…
0 commentaires