dimanche 6 avril 2014

Étude de CI: registre à décalage HC595

J'inaugure aujourd'hui une nouvelle série d'articles qui consistera à explorer le fonctionnement d'un circuit intégré.  Pour cette première livraison, j'ai choisi le registre à décalage HC595, dont voici la fiche technique.

Ce circuit intégré est largement utilisé pour augmenter le nombre de sorties d'un microcontrôleur. Votre Arduino ne comporte pas suffisamment de sorties pour une application précise?  Vous y ajoutez un ou plusieurs registres à décalage et le problème est réglé!

Le registre à décalage HC595 comporte 16 pins.  8 d'entre elles (QA, QB, etc) sont des sorties qui peuvent prendre une valeur logique haute ou basse. L'état de ces 8 sorties dépendra des informations envoyées à l'entrée du signal série (pin numéro 14) ainsi qu'aux entrées d'horloge (pins numéros 11 et 12).

Chaque sortie du registre à décalage est associée à une mémoire qui peu prendre la valeur logique 0 et 1.

Chaque fois que la pin 11 passe du niveau logique 0 au niveau logique 1 (donc de 0 V à 5 V), le contenu de chaque mémoire est décalé d'une position:  la mémoire associée à la pin 7 prend le contenu de la mémoire associée à la pin 6, la mémoire associée à la pin 6 prend le contenu de la mémoire associée à la pin 5, etc.   Et la mémoire associée à la pin 15?  Elle prend la valeur qui correspond à l'état de la pin 14:  0 si la pin 14 est à 0 V, 1 si la pin 14 est à 5 V.


Mais jusque là, seul l'état des mémoires associées aux sorties à changé:  l'état des sorties elles-mêmes ne changera que lorsque la pin 12 passera du niveau logique 0 au niveau logique 1:  à ce moment, chaque sortie prendra l'état logique correspondant au contenu de la mémoire qui lui est associée.

Vous me suivez?  ... Hum...la meilleure façon, c'est d'essayer vous-mêmes!

Pour bien comprendre le comportement d'un registre à décalage, je vous invite à construire sur un breadboard un petit circuit d'expérimentation qui consistera en un HC595 (évidemment), une alimentation continue de 5 V, 8 LEDs qui indiqueront l'état des sorties, et 3 interrupteurs sans rebond pour contrôler l'état des 3 principales entrées (je vous réfère à cet article pour la construction d'un module de 6 interrupteurs sans rebonds).  Si vous ne disposez pas du matériel nécessaire (ou si vous n'aimez pas construire des circuits électroniques, auquel cas je ne sais pas ce que vous êtes venus faire ici!), vous pouvez toujours vous rabattre sur ce simulateur en ligne, mais c'est moins amusant.

En ce qui concerne l'alimentation, le HC595 tolère n'importe quelle source de tension continue située entre 2 et 6 V:  j'utiliserai 5 V pour cette expérience (vous n'avez pas de source de tension de 5 V?  Vous pouvez utiliser la sortie 5 V d'un Arduino, ou encore 3 piles AA placées en série).

Mais attention:  d'après la fiche technique,  l'intensité de courant traversant le circuit intégré. ne doit pas dépasser 70 mA:  il faut donc prendre soin d'accompagner chaque LED d'une résistance de protection suffisante pour que le courant à travers celle-ci ne dépasse pas un huitième de 70 mA, soit 8,75 mA. Puisque la chute de potentiel aux bornes d'une LED rouge avoisine 2 V, il y aura 3 V aux bornes de la résistance. Selon la loi d'Ohm, nous avons donc besoin d'une résistance égale à (3 V)/(0,00875 A), soit 343 Ω. Alors on choisit la résistance conventionnelle la plus proche, soit 390 Ω.

Voici donc notre montage.  L'alimentation de 5 V est branchée aux pins 16 (+) et 8 (-). Chacune des sorties (pins 15, 1, 2, 3, 4, 5, 6, 7) est reliée à une LED en série avec une résistance de 390 Ω. Chacune des entrées (pins 11, 12 et 14) est reliée à un interrupteur de façon à ce que l'entrée prenne une valeur logique haute lorsqu'on appuie sur le bouton.  Le schéma ne comporte aucun anti-rebond pour les interrupteurs, mais au minimum l'interrupteur relié à la pin 11 devrait être sans rebonds, sinon vous risquez d'obtenir des résultats assez imprévisibles.  La pin 13 (output enable) est reliée à la masse en permanence, et c'est le contraire pour la pin 10  (reset), qu'on désactive en la maintenant à 5 V.



Prêts à expérimenter?  Au départ, lorsque vous alimentez le circuit, il est possible que certaines des LEDs soient déjà allumées.  Si c'est le cas, initialisez votre circuit par une des deux méthodes suivantes:

1) Branchez temporairement la pin 10 à la masse (0 V) avant de la brancher à nouveau à 5 V
ou
2) Appuyez 8 fois sur le bouton qui est relié à la pin 11, et ensuite appuyez une fois sur le bouton qui est relié à la pin 12.

Si tout va bien, vos 8 LEDs sont maintenant éteintes, ce qui indique que chacune des 8 sorties est au niveau logique bas (0 V).


Maintenant, appuyez sur le bouton qui est relié à la pin 14 pour envoyer un signal logique haut.  Tout en le maintenant enfoncé, appuyez brièvement sur le bouton qui est relié à la pin 11:  Aucune LED ne s'allume, mais l'état des mémoires à changé: la mémoire associée à la pin 15 est maintenant haute (car la pin 14 était dans cet état lorsque la pin 11 est passée de bas à haut), et le contenu de chaque mémoire est décalé d'une position.


Pour que ces modifications deviennent visibles, il s'agit d'appuyer brièvement sur le bouton qui est relié à la pin 12:  chaque sortie prend alors la valeur stockée dans sa mémoire (et la LED reliée à la pin 15 s'allume).


Envoyons un deuxième signal logique haut.  Encore une fois, vous appuyez sur le bouton qui est relié à la pin 14 et, tout en le maintenant enfoncé, vous appuyez sur le bouton qui est relié à la pin 11.   Toutes les valeurs étant décalées d'une position, l'état des mémoires est maintenant le suivant:


Et l'état des mémoires est transféré aux sorties lorsque vous appuyez sur le bouton de la pin 12:


Pour envoyer un signal logique bas, vous appuyez sur le bouton de la pin 11 sans appuyer sur le bouton de la pin 14.  La mémoire de la pin 15 prendra donc une valeur basse, et toutes les autres valeurs sont décalées d'une position:


Et vous appuyez encore une fois sur le bouton de la pin 12 pour que les sorties soient modifiées en conséquence.

Entrée d'une nouvelle valeur logique haute (on enfonce le bouton de la pin 11 pendant que le bouton de la pin 15 est déjà enfoncé):


On appuie sur le bouton de la pin 12:


Entrée d'une nouvelle valeur basse (bouton de la pin 11 seulement):


On appuie sur le bouton de la pin 12:


Dans la plupart des applications, on commence par régler une par une l'état des mémoires, et leur transfert vers les sorties n'est effectué qu'à la fin, lorsque toutes les mémoires ont la valeur désirée.

Ainsi, pour allumer toutes les LEDs en même temps, vous envoyez 8 messages hauts consécutifs (vous appuyez 8 fois de suite sur le bouton de la pin 11 tout en maintenant le bouton de la pin 15 enfoncé), et vous n'appuyez sur le bouton 12 qu'à la toute fin.

Pour terminer, voyons comment nous pouvons contrôler un registre à décalage au moyen d'un Arduino.  Nous n'avons plus besoin des 3 interrupteurs, ni de la source d'alimentation externe qui sera remplacée par la sortie 5 V de l'Arduino.  La pin 2 de l'Arduino est reliée à la pin 15 du 595, la pin 3 de l'Arduino est reliée à la pin 12 du 595, et la pin 4 de l'Arduino est reliée à la pin 11 du 595 (n'oubliez pas de relier toutes les masses:  GND de l'Arduino avec la pin 8 du 595).



Le sketch ci-dessous allume les 4 LEDs impaires pendant 1 seconde, puis les 4 LEDs paires.  Comme nous le verrons ensuite, ce n'est pas nécessairement la façon la plus simple de procéder, mais vous pouvez constater que l'Arduino gère les pins 11, 12 et 15 du 595 de la même façon que vous le faisiez avec les interrupteurs.

---
---

Mieux encore:  il existe une fonction conçue spécialement pour contrôler un registre à décalage:  la fonction ShiftOut.  Comme vous pouvez le constater dans le sketch ci-dessous (qui accomplit exactement la même action que le sketch précédent), il s'agit de passer à la fonction shiftOut un nombre binaire de 8 bits indiquant l'état désiré de chacune des 8 sorties du registre à décalage, la fonction s'occupe automatiquement de la gestion des pins 11 et 15 du 595 (il ne nous reste plus qu'à gérer la pin 12).

---
---

Et la pin 9 du 595, elle sert à quoi?  Il s'agit d'une sortie qui permet d'ajouter un deuxième registre à décalage (on branche la pin 9 du premier registre à la pin 15 du second).  Lorsque la pin 11 passe de 0 V à 5 V, la valeur qui était stockée dans la mémoire associée à la pin 7 est transférée à la pin 9 (vous pouvez vous en convaincre en ajoutant une neuvième LED reliée à cette pin).  En pratique, ça nous permet d'ajouter un deuxième registre à décalage:  il s'agit de relier la pin 9 du 1er registre à la pin 15 du deuxième, et vos 3 interrupteurs contrôlent maintenant l'état de 16 sorties!  (Et rien ne vous empêche d'ajouter un 3e registre relié au 2e, puis un quatrième relié au 3e, etc.).

Yves Pelletier (Twitter:  @ElectroAmateur)

3 commentaires:

Related Posts Plugin for WordPress, Blogger...