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 broches.  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 (broche numéro 14) ainsi qu'aux entrées d'horloge (broches 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 broche 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 broche 7 prend le contenu de la mémoire associée à la broche 6, la mémoire associée à la broche 6 prend le contenu de la mémoire associée à la broche 5, etc.   Et la mémoire associée à la broche 15?  Elle prend la valeur qui correspond à l'état de la broche 14:  0 si la broche 14 est à 0 V, 1 si la broche 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 broche 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 broches 16 (+) et 8 (-). Chacune des sorties (broches 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 (broches 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 broche 11 devrait être sans rebonds, sinon vous risquez d'obtenir des résultats assez imprévisibles.  La broche 13 (output enable) est reliée à la masse en permanence, et c'est le contraire pour la broche 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 broche 10 à la masse (0 V) avant de la brancher à nouveau à 5 V
ou
2) Appuyez 8 fois sur le bouton qui est relié à la broche 11, et ensuite appuyez une fois sur le bouton qui est relié à la broche 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 broche 14 pour envoyer un signal logique haut.  Tout en le maintenant enfoncé, appuyez brièvement sur le bouton qui est relié à la broche 11:  Aucune LED ne s'allume, mais l'état des mémoires à changé: la mémoire associée à la broche 15 est maintenant haute (car la broche 14 était dans cet état lorsque la broche 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 broche 12:  chaque sortie prend alors la valeur stockée dans sa mémoire (et la LED reliée à la broche 15 s'allume).


Envoyons un deuxième signal logique haut.  Encore une fois, vous appuyez sur le bouton qui est relié à la broche 14 et, tout en le maintenant enfoncé, vous appuyez sur le bouton qui est relié à la broche 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 broche 12:


Pour envoyer un signal logique bas, vous appuyez sur le bouton de la broche 11 sans appuyer sur le bouton de la broche 14.  La mémoire de la broche 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 broche 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 broche 11 pendant que le bouton de la broche 15 est déjà enfoncé):


On appuie sur le bouton de la broche 12:


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


On appuie sur le bouton de la broche 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 broche 11 tout en maintenant le bouton de la broche 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 broche 2 de l'Arduino est reliée à la broche 15 du 595, la broche 3 de l'Arduino est reliée à la broche 12 du 595, et la broche 4 de l'Arduino est reliée à la broche 11 du 595 (n'oubliez pas de relier toutes les masses:  GND de l'Arduino avec la broche 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 broches 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 broches 11 et 15 du 595 (il ne nous reste plus qu'à gérer la broche 12).

---
---

Et la broche 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 broche 9 du premier registre à la broche 15 du second).  Lorsque la broche 11 passe de 0 V à 5 V, la valeur qui était stockée dans la mémoire associée à la broche 7 est transférée à la broche 9 (vous pouvez vous en convaincre en ajoutant une neuvième LED reliée à cette broche).  En pratique, ça nous permet d'ajouter un deuxième registre à décalage:  il s'agit de relier la broche 9 du 1er registre à la broche 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)

9 commentaires:

  1. bravo pour vos articles. ils sont vraiment tres bien écrit. ces petits projets electroniques purs à l'ancienne (sans micro controlleur) sont un régal. Continuez

    RépondreSupprimer
  2. bonjour, j'essaye de bricoler un clavier midi, je me demande quel est le délai introduit par le registre à décalage? qu'en est-il avec plusieurs registre en série?
    est-ce possible selon vous de brancher les sorties du registre sur chaques notes de chaques octave ( tous les sol sur Q1 par exemple) et de relier toute les sorties de chaque notes d'une même octave à une entré de l'arduino? cela donnerai 12 pin de sortie grâce à 2 registres et n pin d'entré pour n octaves? quel précision en terme de délai?

    enfin est-ce possible de brancher deux registres en dérivation plutôt qu'en série pour tester deux demie octave simultanément?

    RépondreSupprimer
  3. le montage avec les boutons ne fonctionne pas, tel qu'ils sont disposés, ils ne servent à rien car les résistances sont connectées sur la même ligne que le 11, 12 et 14. Il y a de toute évidence une erreur dans ce montage, j'ai essayé de différente façon avec les boutons et ça n'a jamais fonctionné, seulement avec l'arduino ça fonctionne.

    RépondreSupprimer
    Réponses
    1. En effet, deux des boutons n'étaient pas reliés à 5 V. J'ai corrigé le schéma en y ajoutant les 2 fils manquants.

      Supprimer
  4. Bonjour, et bonne année!
    Encore mieux que ShiftOut, il y a... le SPI! ça mermet de piloter un 595 à 16MHz, ça marche du tonnerre, comme n'importeque périphérique SPI!
    Ce branchement pourrait être un ajout intéressant à ce très bon article. Je ne vois jamais personne utiliser SPI et 595 ensemble.

    RépondreSupprimer
  5. Bonjour, très bon site
    Ce circuit est très intéressant
    Concernant la commande shiftOut
    Si on veut modifier que certains bits de l'octet et garder les autres(exemple interface de commande à transistors , il faut normalement réaliser un ou inclusif (masque)sur les différents bits ?
    Bien cordialement
    Fabrice

    RépondreSupprimer