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).
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.
- JP1 retiré (RC7 = 0) : la sortie S0 est désactivé pour le mot binaire
d'entrée 0000 et s'active pour le mot binaire 0001 (1 en décimal). Dans ce
cas, S15 n'est jamais activé, la dernière sortie qui s'active pour
l'entrée binaire 1111 est la sortie S14.
- JP1 en place (RC7 = 1) : la sortie S0 est activée pour le mot binaire d'entrée 0000. Dans
ce cas la sortie S15 est activée pour le mot d'entrée binaire 1111.
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.
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.
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