Démultiplexeur

2014-09-27

Introduction

Dans la section précédente, nous avons vu comment utiliser des transistors pour addresser un grand nombre de composants avec un faible nombre de connexions. Cependant, bien qu'utile, le montage devient très vite lourd à faire à la main. Pour réduire l'encombrement, ce système a été condensé dans un circuit électronique : un démultiplexeur. Puisque nous contrôlons l'activation des afficheurs par GND, il nous faut un démultiplexeur telles que toutes les sorties soient mises à HIGH, sauf celle sélectionnées. Un tel démultiplexeur est dit « inverseur ». J'utilise le 74HC138.

Le circuit intégré doit être alimenté (Vcc et GND) ; il possède 8 sorties Y0 à Y7 ; l'adresse de la sortie à sélectionner est indiquée à l'aide des trois pin d'adresse A0 à A2 ; le signal à imposer sur cette sortie est indiqué à l'aide des trois entrées E1, E2 et E3 (E pour Enable), qui doivent être respectivement à LOW, LOW et HIGH pour un signal de sortie HIGH ; les autres sorties seront à HIGH.

Le démultiplexeur inverseur 74HC138 (3-to-8) (source)
Le démultiplexeur inverseur 74HC138 (3-to-8) (source)

Pour un plus grand adressage, vous pouvez combiner les '138 ou bien utiliser le 74HCT154 (4-to-16).

Montage

La première étape est de relier les habituels 8 fils à un afficheur. Puisque le démultiplexeur a 8 sorties, nous allons contrôler 8 afficheurs. Nous ajoutons donc 7 afficheurs et relions les 8 pin de manière adéquate. L'étape suivante est de relier la masse de chaque afficheur à une sortie du démultiplexeur. Il ne reste plus qu'à s'occuper du démultiplexeur lui-même. Il faut donc relier Vcc et GND ; nous en profitons pour fixer les pin E1, E2 et E3 de manière à obtenir le résultat voulu. Enfin, les pin d'adressage sont contrôlés par la carte.

Contrôle (bleu), réplication du contrôle (orange), activation (vert), adressage (jaune), alimentation (rouge) et masse (noir) (source)
Contrôle (bleu), réplication du contrôle (orange), activation (vert), adressage (jaune), alimentation (rouge) et masse (noir) (source)

Il ne nous reste plus qu'à écrire le programme pour contrôler le montage.

Programme

Comme d'habitude, nous reprenons la fonction pour afficher la représentation d'un chiffre donné (à adapter pour le décodeur BCD ou le registre à décalage :

byte digits []={0xFC,0x60,0xDA,0xF2,0x66,0xB6,0xBE,0xE0,0xFE,0xF6};
int  led2pin[]={9, 8, 7,10,11,12,13, 6};
void displayDigit(int d)
{
    byte code = digits[d%10];
    for (int c = 7; c >= 0; c--)
    {   
        digitalWrite(led2pin[c], code%2 ? HIGH : LOW);
        code >>= 1;
    }   
}

Nous allons ensuite écrire une autre fonction pour utiliser ces afficheurs pour représenter un nombre (entre 0 et 10^8-1) (il est bien sur possible d'utiliser les afficheurs autrement) :

activeDisplay(int i)
{
    digitalwrite(5, i%2); i >>= 1;
    digitalwrite(4, i%2); i >>= 1;
    digitalwrite(3, i%2); i >>= 1;
}
displayNumber(int n)
{
    for (int i = 7; i >= 0; i++)
    {
        activeDisplay(i);
        displayDigit(n % 10);
        delay(1);
        n /= 10;
    }
}

Enfin, on peut par exemple écrire un programme pour compter les millisecondes :

byte digits []={0xFC,0x60,0xDA,0xF2,0x66,0xB6,0xBE,0xE0,0xFE,0xF6};
int  led2pin[]={9, 8, 7,10,11,12,13, 6};
void displayDigit(int d)
{
    byte code = digits[d%10];
    for (int c = 7; c >= 0; c--)
    {   
        digitalWrite(led2pin[c], code%2 ? HIGH : LOW);
        code >>= 1;
    }   
}
activeDisplay(int i)
{
    digitalwrite(5, i%2); i >>= 1;
    digitalwrite(4, i%2); i >>= 1;
    digitalwrite(3, i%2); i >>= 1;
}
displayNumber(int n)
{
    for (int i = 7; i >= 0; i++)
    {
        activeDisplay(i);
        displayDigit(n % 10);
        delay(1);
        n /= 10;
    }
}
int counter = 0;
void setup()
{
    counter = 0;
    for (int i = 5; i <= 13; i++)
        pinMode(i, OUTPUT);
}
void loop()
{
    displayNumber(counter);
    counter += 8;
}