vendredi 25 avril 2014

Étude de CI: Registre à décalage 74HC165

Après avoir exploré le fonctionnement du registre à décalage 74HC595 qui permet, entre autres choses, d'ajouter des sorties numériques supplémentaires à votre Arduino, nous étudions aujourd'hui son complément, le 74HC165 qui vous permettra, en cas de besoin, d'ajouter des entrées numériques supplémentaires à votre Arduino (vous pouvez, par exemple, brancher à l'Arduino un nombre quasi illimité d'interrupteurs).

Car alors que le 74HC595 est doté d'une entrée série et de 8 sorties parallèles, c'est exactement le contraire pour le 74HC165:  il comporte 8 entrées parallèles et une sortie série.

Sur le schéma de brochage ci-contre, les 8 entrées sont identifiées par les symboles D0, D1, D2, etc.  Chaque entrée pourrait, par exemple, être reliée à un interrupteur permettant de sélectionner le niveau logique bas (0 V) ou haut (5 V).

Q7 (broche 9) est la sortie, et la broche 7 (Q7 avec une barre au-dessus) est une sortie complémentaire dont l'état est toujours contraire à Q7.

La broche 10 (DS) est une entrée série, qui sera utile lorsque vous désirez relier plusieurs HC165 en cascade (elle sera alors reliée à la sortie Q7 du HC165 précédent).

Lorsque la broche 1 PL (pour parallel load) est au niveau logique bas (0 V), l'état des 8 entrées parallèle (D0 à D7) est mémorisée par le HC165.  La sortie Q7 prend alors le même état logique que l'entrée D7.   Lorsque la broche 1 "PL" est au niveau logique haut (5 V), l'entrée série DS est activée.

Chaque fois que la broche 2 "CP" (horloge) passe de 0 à 5 V, les états logiques sont décalées d'une position dans le registre (DS vers D0, D0 vers D1, etc., et Q7 prend la nouvelle valeur de D7.

Si cette description rapide vous apparaît quelque peu nébuleuse, je vous invite à construire sur breadboard un petit circuit d'expérimentation avec le HC165.  On pourrait toujours utiliser 8 interrupteurs pour contrôler l'état de nos 8 entrées, mais pour plus de simplicité, on peut se contenter de les relier manuellement au potentiel approprié au moyen de câbles conducteurs.  Une exception, toutefois:  le signal d'horloge (broche 2) doit être contrôlé par un interrupteur sans rebond, question d'éviter...les rebonds (voir cet article sur la façon de construire des interrupteurs sans rebond).  Si vous utilisez un interrupteur qui n'est pas doté d'un mécanisme anti-rebond, vous risquez d'envoyer 2 ou 3 signaux d'horloge consécutifs lorsque vous désirez en produire un seul.

Réalisons donc notre circuit d'expérimentation:  nous alimentons le CI en branchant la broche 8 à la masse (GND) et la broche 16 à 5 V (si vous ne disposez pas d'une source d'alimentation continue de 5 V, vous pouvez utiliser la sortie 5 V d'un Arduino, ou mettre 3 piles AA en série).  La broche 15 (clock enable) doit être activée en la reliant à la masse (GND).

Pour connaître l'état logique de la sortie Q7, nous utiliserons  une LED protégée par une résistance d'au moins 330 Ω (vous pouvez aussi mesurer le signal de sortie au moyen d'un voltmètre, si vous préférez).

Initialement, la broche 1 (PL) est à 5 V, et la broche 2 (CP), reliée à un interrupteur sans rebond, est à 0 V (l'anti-rebond de l'interrupteur n'est pas représenté sur le circuit illustré ci-dessous).

Maintenant, ajustons le niveau logique des entrées, en essayant d'utiliser un motif que nous pourrons ensuite reconnaître.  Allons-y pour:
DS (broche 10) à 5 V
D0 (broche 11) à 0 V
D1 (broche 12) à 5 V
D2 (broche 13) à 0 V
D3 (broche 14) à 5 V
D4 (broche 3) à 5 V
D5 (broche 4) à 0 V
D6 (broche 5) à 0 V
D7 (broche 6) à 5 V

Ça devrait ressembler à ceci (le dessin ne montre pas la source de tension de 5 V):



Le registre comporte 8 mémoires, chacune d'entre elles pouvant être au niveau logique haut ou bas. Commençons par transférer en mémoire l'état des broches D0 à D7:  pour ce faire, vous mettez temporairement la broche 1 à 0 V, puis vous la remettez à 5 V (au moyen du fil jaune sur le circuit ci-dessus).

Le tableau ci-dessous montre l'état de chacune des mémoires du registre:



Vous devriez constater que la LED s'est allumée:  la sortie Q7 prend toujours le même état logique que la mémoire associée à D7, qui est dans l'état logique haut.

Envoyons maintenant un front ascendant sur le signal d'horloge:  on appuie une seule fois sur le bouton sans rebond de façons à faire passer temporairement la broche 2 de 0 V à 5 V.  Ce signal d'horloge cause un décalage des valeurs placées en mémoire (c'est pour cette raison que ça s'appelle un registre à décalage):  la mémoire D7 prend la valeur qui était précédemment dans D6, D6 prend la valeur qui était précédemment dans D5, et ainsi de suite jusqu'à D0, qui mémorise le niveau logique de l'entrée DS (broche 10).

Le tableau ci-dessous montre le nouveau contenu des mémoires:


Puisque le niveau de la mémoire D7 est maintenant bas, la sortie Q7 s'est mise à 0 V et la LED est maintenant éteinte.

On appuie à nouveau sur le bouton relié à la broche 2, et les valeurs sont à nouveau décalées d'une position:


La LED demeure éteinte, puisque la mémoire D7 est encore au niveau bas.

Pour varier un peu, on peut mettre l'entrée DS (broche 10) à 0 V avant d'appuyer à nouveau sur le bouton de la broche 2:




Chaque fois que vous appuyez sur le bouton, c'est maintenant la valeur 0 (de l'entrée DS) qui s'installera dans la mémoire D0.

Et vous pouvez continuer d'appuyer sur le bouton de la broche 2 pour constater que la LED s'allume ou s'éteint selon les valeurs mises en mémoire.

Supposons maintenant qu'on décide de changer l'état logique des entrées:  plaçons les toutes à 5 V, sauf DS qu'on laisse à 0 V.



Pour que ces changements aient un impact sur l'état des mémoires, il faut impérativement mettre temporairement la broche 1 à 0 V.


À vous d'expérimenter avec le circuit jusqu'à ce que vous ayez compris le fonctionnement du CI à votre entière satisfaction.  La LED devrait être allumée les 7 premières fois que vous appuyez sur le bouton, puis demeurer éteinte ensuite.

Maintenant, que nous comprenons bien son fonctionnement, tentons une application pratique:  relions le 74HC165 à un Arduino, afin que ce dernier puisse lire l'état des 8 entrées du HC165.

Le circuit:  Le HC165 est alimenté par la sortie 5 V de l'Arduino, on n'a plus besoin de la LED, ni de l'interrupteur sans rebond.  La broche 2 du HC165 est commandée par la broche 2 de l'Arduino, et la broche 1 du HC165 est contrôlée par la broche 3 de l'Arduino.  La broche 9 du HC165 (sortie) est reliée à la broche 4 de l'Arduino. Vous branchez les 8 entrées du HC165 comme vous voulez:  certaines d'entre elles à 5 V, d'autres à 0 V.


Et voici un sketch qui affiche l'état de chaque entrée du 74HC165 dans le moniteur série du logiciel Arduino:


Yves Pelletier (Twitter:  @ElectroAmateur)


3 commentaires:

  1. Bonjour,
    Merci pour ces articles sur les registres à décalage, j'en avais déjà entendu parlé mais je ne m'y étais jamais intéressé et j’imaginais donc cela plus compliqué. Vos explications les ont démystifiés ;-)

    RépondreSupprimer
    Réponses
    1. Merci, je suis heureux que cet article soit apprécié (il n'a pas été facile à rédiger!).

      Supprimer
  2. Merci, pour votre article. Passionants.........

    RépondreSupprimer