Electronique > Réalisations > Décodeur logique 001

Dernière mise à jour : 22/09/2013

Présentation

Ce décodeur logique dispose de 4 entrées codées en binaire et de 16 sorties décodées en "vumètre à ruban". Il permet d'activer un nombre de sorties (par exemple allumer un nombre de LED) proportionnel à la valeur du mot binaire appliqué à l'entrée. Bien sûr ce genre de comportement peut être obtenu sans circuit programmable, mais au prix d'une complexité accrue. Deux schémas sont proposés :
- Schéma 001a : version avec PIC 18F2420 (à programmer avec le code fourni ici-même)
- Schéma 001b : version avec CD4067 (composant logique non programmable).

Schéma 001a - Avec PIC 18F2420

Oui, vous pouvez compter le nombre de composants requis (DSW1 et R1 à R4 ne comptent pas).

decodeur_logique_001a

Pourquoi un 18F2420 ? Parce que des PIC que j'avais sous la main, c'était le "plus petit" qui disposait d'assez de broches pour nos 4 entrées et 16 sorties.

Fonctionnement général
Rien de difficile. Chaque sortie ne s'active que si la valeur du mot binaire d'entrée est supérieur à son "rang" (rang 0 pour la sortie S0, rang 1 pour la sortie S1, etc.). Si par exemple le mot binaire d'entrée est 0011 (3 en décimal), alors les quatre sorties S0 à S3 s'activent (rangs 0 à 3). Et si le mot binaire d'entrée est 0110 (6 en décimal), alors les sept sorties S0 à S6 (rangs 0 à 6) s'activent. 

Mode
On dispose de deux modes de fonctionnement, selon que l'on désire que la sortie S0 soit oui ou non activée pour le mot binaire d'entrée de 0000 (0 en décimal). Ce mode est fixé par la mise en place ou le retrait du cavalier JP1/Mode.
Vous avez du mal à suivre ? Ne vous inquiétez pas, vous n'êtes pas seuls ;-) C'est pourquoi un jour (je crois) quelqu'un a inventé les tableaux.

electronique_decodeur_logique_001a_tdv_a

electronique_decodeur_logique_001a_tdv_b

Choix étranges
Vous vous demandez sans doute pourquoi la sortie S4 est reliée sur RC4 et non RA4. On connaissait l'histoire du drain ouvert sur les PIC 16F (16F628A par exemple) mais pour le 18F2420, la feuille de caractéristique de Microchip ne mentionne pas cela sous cette forme. En lisant le document du fabricant, on a l'impression que cette broche peut être utilisée en sortie normale, comme pour les autres sorties du port, puisqu'elle est dénommée Digital IO. Or si on regarde de plus près le tableau récapitulatif des entres/sorties, on constate que cette sortie RA4 "Digital IO" est aussi répertoriée ST (Schmitt Trigger Input). Et en allant plus loin dans le descriptif (chapitre sur les ports), il est mentionnée que "RA4 est une entrée à trigger de Schmitt et que toutes les autres broches du port A disposent d'une sortie standard CMOS". Ce que je constate de mon côté, c'est que sans résistance de rappel vers le +Alim (pullup) sur la broche RA4, on ne dispose que des états bas ou flottant. C'est sans doute la raison pour laquelle j'ai décidé de basculer sur une autre broche libre...

Et le code principal (de décodage) dans tout ça ?
Certes vous pouvez foncer sur le code source, il y en a tellement à voir que je vous conseille de prévoir dès maintenant quelques jours de repos. Jugez vous même (je ne montre pas ici la partie initialisation du microcontrôleur, c'est déjà assez dur comme ça).

while true do
begin
iIn := PORTC and $0F; // seuls les 4 premiers bits (#0 à #3) nous intéressent
if In_Mode then iIn := iIn + 1;
for i := 0 to 7 do
LATA.i := iIn > i;
for i := 0 to 7 do
LATB.i := iIn > (i + 8);
LATC.4 := iIn > 4; // LATB.4 = vilain petit canard
end;


Avec ce code, on définit l'état de chaque sortie en fonction de la valeur de son rang par rapport à la valeur du mot binaire d'entrée. C'est une méthode parmi d'autres. Une voici une autre.

while true do
begin
iIn := PORTC and $0F;
iOut := 1;
for i := 0 to iIn do
iOut := iOut * 2;
if iOut > 0 then
iOut := iOut - 1;
if not(In_Mode) then
iOut := iOut SHR 1;
LATA := lo(iOut);
LATB := hi(iOut);
LATC.4 := iOut.4; // LATA.4 = vilain petit canard
end;


Là, on utilise une variable additionnelle de type word (16 bits) qui contient l'état de toutes les sorties. L'idée est de transformer le mot binaire d'entrée qui tient sur 4 bits en un mot binaire de sortie qui tient sur 16 bits. A ce stade, un seul bit ne peut être actif à la fois (il correspond à une puissance de 2). Ensuite, on retranche 1 à la valeur en cours et le bit activé se désactive en même temps que tous les bits qui le précèdent s'activent. Par exemple, si on avait la valeur 5 en entrée binaire (0101), alors le mot iOut serait 0000000000100000 (2 puissance 6 en binaire, soit 32). En retranchant 1 à cette valeur, on obtient la valeur binaire 0000000000011111 (soit 31). Résultat, seules les cinq premières sorties sont activées, c'est ce qu'on voulait. Le décalage à droite du mot binaire (fonction SHR, SHift Right) est ou non utilisée selon le mode de sortie sélectionné par le cavalier JP1/Mode. On aurait pu aussi simplifier un peu en procédant ainsi :

while true do
begin
iIn := PORTC and $0F;
iOut := pow(2, iIn + 1) - 1; // waou, comme c'est simple !
if not(In_Mode) then
iOut := iOut SHR 1;
LATA := lo(iOut);
LATB := hi(iOut);
LATC.4 := iOut.4; // LATA.4 = vilain petit canard
end;


Pourquoi ne l'ai-je pas fait ? Mystère ! Mais attendez un peu avant de partir, et essayez donc de vous même...

Schéma 001b - avec CD4067

Et voici le décodeur logique dans sa version avec filtre de sortie. Pardon, je voulais dire avec sa matrice à diodes.

decodeur_logique_001b

Le schéma est allégé (non complet), je ne voulais pas le montrer avec toutes ses diodes, mais seulement vous inciter à en comprendre le principe général. Pour le coup, seules les cinq sorties S1 à S5 sont représentées fonctionnelles. Le principe repose sur la fonction OU à diodes. Là encore ce n'est pas bien compliqué, il suffit de câbler une diode entre chaque sortie principale (S1 à S15) et les sorties du multiplexeur U1/CD4067 (qu'on pourrait remplacer par un CD4514 n'est-ce pas) qui doivent les activer. Par exemple pour que les sorties principales [S1 et S2 et S3] s'activent quand les sorties [X1 ou X2 ou X3] du multiplexeur U1 s'activent, il faut trois diodes (voir schéma).

Logiciel du PIC

Le fichier binaire compilé *.hex à flasher dans le PIC et le code source sont disponibles dans l'archive zip ci-après. MikroPascal V5.30 utilisé pour le développement et la compilation.
Décodeur logique 001a - 18F2420 - (22/09/2013)
Si vous souhaitez recevoir par la poste un PIC préprogrammé et prêt à utiliser, merci de consulter la page PIC - Sources.

Prototype

Uniquement réalisé pour la version avec PIC, bien aidé par ma platine EasyPic7 (pas eu besoin de sortir ma plaque sans soudure, tests très rapides).
 

Circuit imprimé

Non réalisé.

Historique

22/09/2013
- Première mise à disposition