Profitons à fond des trois états |
Pour augmenter encore le nombre
de leds allumables par un nombre restreint de pins, on va étudier puis
adopter le montage ci-dessous [c´est un schéma signé Microchip, qu´on
trouve dans
un document (en anglais) consacré spécialement aux PIC à
faible nombre de pattes !], où le
troisième état
logique est utilisé : z,
la haute impédance.
 |
 |
  Une led est allumée :
a) quand
son anode est sur une patte niveau du
microP ;
b) et
sa cathode est sur une patte au niveau du
microP ;
c) et
quand une (ou des) résistance(s) chutrice(s) l´empêche(nt)
d´exploser |
 |
Une led est éteinte dans
toutes les autres conditions (deux pattes au ,
deux pattes au ,
une patte à et
une patte à haute impédance, deux pattes à haute
impédance, etc.)
Vérifions
pour la led ci-dessous (quand
elle est seule), par exemple : la cathode de cette led est
sur GP1, son anode sur GP2 ; nous devons mettre GP2 en sortie
et porter cette sortie à (elle
va fournir, source, du courant) ;
GP1 en sortie et la porter à (elle
va absorber, sink, du courant), tous les autres GP étant
négligeables
(0 ou 1, on s´en fiche).
Pour ce
faire nous allons écrire dans le registre TRISIO qui mémorise
si les pattes sont en entrée (bit à 1) ou en sortie
(bit à zéro) : un dans
GP1 et GP2 les met tous les deux en sortie (mnémonique :
zéro
—> O —> Output). Puis nous allons écrire
dans GPIO qui
mémorise
si les pattes sont à (bit à 1)
ou à (bit à zéro) :
et voilà,
notre led est allumée !
Toutes
les autres combinaisons des bits 1 et 2 de TRISIO/GPIO entraînent
une led éteinte... Vérifiez-le sur ces deux exemples :
ici TRISIO2
est en entrée (donc en haute impédance : tout
se passe comme si la pin GP2 n´était reliée à rien)...
Ici GPIO2
est à zéro...
 |
 |
 |
Reprenons
notre schéma de tout à l´heure :
L1 (qu´on
vient de traiter sous toutes les coutures) s´y retrouve,
avec quatre autres leds. Chacune pourra être allumée
ou éteinte
indépendamment de ses voisines, grâce à ce
biais de la logique trois états ( ou ou
Z)...
N.-B.
— Pour éviter une éventuelle confusion :
le
“Z” qui dénote en électronique la haute impédance n´a rien
à voir avec le “Z” du registre STATUS des PIC. |
|
 |
FAQ Séraphin
nous écrit : “Ça
n´a pas de bon sens de prendre un microP pour
faire des jeux de lumière, câlice
! On a le LM3914 ou le UAA 170 qui sont exprès
pour ça !”

Faux, mon cher Séraphin, on ne trouve
presque plus dans le commerce de ces “drivers
de bargraph” (ou alors avec la mention “jusqu´à épuisement
du stock”) ! Et pour cause : leur prix, entre 3 et 5 euros (soit le
prix de un à onze microP !), et qu´on ne pourra jamais espérer
voir baisser...
FAQ Séraphin
insiste : “Ouais, mais quand même : faire clignoter
des lampions, c´est niaiseux.”
 Soit, alors disons
qu´à partir
d´aujourd´hui une led représente
n´importe quel organe de train électrique : moteur de loco,
d´accessoire, aiguillage, fil à mémoire, dételeur,
relais, ampoule, fil chaud à découper le polystyrène, et
même la fournaise
pour chauffer ton local ! Et je n´invente rien ni ne fais de science-fiction
: pour protéger des parasites nos mignons microP, on les isole du monde
extérieur en les laissant seulement commander la led d´un optocoupleur
(cf. Pictrain2),
qui fait tout le reste du boulot. |
|
|
Pendant cette digression,
nos deux registres ont donc été modifiés et voici une
led qui s´allume !
Vérifions une dernière fois l´état des deux registres
, et qu´aucune des
autres leds n´est en état de s´illuminer... (un × dans ce
tableau signifie que l´état de ce bit 0 ou 1 est indifférent) :
 |
 |
Pourquoi deux résistances ?
Parce que le courant circulera toujours (quelle que soit la configuration)
par ces deux R (en série et dont les valeurs s´additionnent), à laquelle
nous allons donc accorder la demi-valeur d´une R toute seule, soit environ
220 ohms (note 1).
Voici le tableau complet
d´une solution plus riche encore , commandant huit lampes avec quatre
pins...
 |
 |
Et “la totale” (toujours
selon un schéma de Microchip [note 3], ne croyez pas que sommes
en train de délirer), douze
leds — soit plus qu´avec un 4017 à quatorze pattes,
C.Q.F.D. !
On pourra battre facilement
ce record car vous avez remarqué que GP0 restait
inutilisée (et GP3 aussi, mais sachant que cette dernière
est confinée
au rôle
d´entrée
et que son bit TRISIO reste
éternellement à ,
elle peut être considérée comme perdue)... Avec cette pin GP0 en plus,
on commande vingt leds, la formule étant : nombre_de_leds_maximal
= nombre_de_pins × (nombre_de_pins – 1).
 |
 |
 |
 |
|
Après
cela, il n´y a plus qu´à saisir le code nécessaire à ces
opérations...
 Ci-contre,
un extrait du programme (sans la zone d´en-tête habituelle,
que vous pourrez copier
à partir d´une des applications Pictrain).
Il faudra, évidemment, introduire une pause à chaque
changement de led (si l'on recopiait ce code sans pause, c'est quelques
millionièmes de seconde que chaque led éclairerait !)...
Dans un premier
temps, on se rend en bank 1 et tout TRISIO est mis à zéro
(clear). Puis on s´occupe de la led n° 1 : quatre
des bits de TRISIO sont réglés en entrée ou sortie
(lignes 6 et 7), puis on passe en bank 0
et un bit est écrit dans GPIO, celui de la led 1... (lignes
9 et 10).
Pour la led 2,
le contenu de TRISIO n´a pas à être modifié, on
reste en bank 0
et on change juste la position du bit de GPIO pour viser la led 2
(lignes 13 et 14).
Le reste est à l´avenant...
Si l´on voulait commander les leds dans un autre ordre (1,7,6,2,4,10...)
il serait nécessaire de modifier TRISIO à chaque opération.
Dans l´état
actuel de nos connaissances, la saisie de ce code est longue et fastidieuse ;
mais personne d´entre nos lecteurs ne peut douter qu´il
existe des solutions bien plus rapides et élégantes de
faire la même
chose et
que nous découvrirons bientôt...
Vous trouverez ci-dessous
le pense-bête graphique que je m´étais fait pour m´aider à la saisie : |
 |
 |
|