La multiplication des pins (4)

Deuxième réalisation pratique : “Multipin20”
Pour cette deuxième réalisation pratique, copiable ou modifiable par chacun d´entre vous, nous nous sommes fixé le but ultime : utiliser au maximum, et toujours grâce à l´exploitation des trois états, les pattes d´un minuscule 675. On va aboutir à un défilement ininterrompu de vingt leds, grâce à cinq de ces pattes.
Nous allons donc prouver (vous prouver, mais aussi nous prouver) qu´on peut faire deux fois mieux que le 4017 chéri du Meccano électronique... et ce, uniquement avec du texte, quasiment sans câblage ni composants extérieurs (ni condensateurs, ni astable, juste 5 résistances). Car un programme, ça n´est après tout que texte et nous n´allons pas priver d´utiliser aussi au maximum les programmes informatiques ad hoc pour les faire... écrire à notre place !
En partant du schéma de Microchip :
nous allons compliquer en ajoutant la dernière patte libre, GP2 (on sait que la patte n° 3 n´est utilisable que comme une entrée ; et les septième et huitième sont celles de l´alimentation, plus et masse).
Avec 5 pattes on peut commander (5 — 4) = 20 leds, dont voici le schéma :
On voit clairement les huit leds ajoutées, D12 à D19 et la 5 résistance, sur GP2.
Rappelons le principe de la commande... Chaque patte peut être utilisée :
soit comme une entrée : soit comme une sortie :
Ça n´est pas la tension qui compte : un entrée peut être à 0 ou à 5 volts ; une sortie peut être à 0 ou à 5 volts aussi. C´est la fonction qui compte  : soit l´info entre pour être traitée (un bouton-poussoir, un phototransistor, une LDR, un détecteur de chaleur, de bruit, d´aimant...), soit l´info traitée sort (une led, un optocoupleur, un relais, un haut-parleur, un composant de puissance...).
Vous vous souvenez que c´est le registre TRISIO qui contient ces informations sur l´état des pattes : le bit 4 de TRISIO, s´il est à , commande que cette patte est une sortie (mnémo en anglais : zéro ressemble à un O, comme output).
Si ce bit était à , la patte de sortie n° 4 serait une entrée (mnémo angloglotte  : un un ressemble à un I comme input). Voilà un point de réglé.
Pour vous troubler encore un peu, une simple sortie peut être exploitée de quatre façons ! Je peux commander qu´une lampe m´alerte si la sortie est à (d sur le dessin), ou bien si cette sortie est à (c)... Et vous êtes bien d´accord que les lampes à gauche du dessin ne sont pas allumées si la sortie est à (a) ou à (d). La bonne nouvelle, c´est que c´est vous qui décidez de la façon dont la lampe est exploitée, chacune ayant un avantage particulier.
Le PIC peut donc fournir du courant (dessin d) (vous verrez souvent utiliser le mot anglais source) ou en consommer (dessin c) (en anglais sink). C´est le registre GPIO qui commande le niveau de sortie : le bit 4 de GPIO, s´il est à , commande à la patte n° 4 de présenter du + 5 volts. Ce bit à la patte 4 serait mise à la masse (0 volt). Et enfin : que cette sortie 4 allume ou éteigne la lampe, c´est décidé bêtement... par le câblage de cette lampe.
Si vous êtes de bonne foi, vous cesserez de dire que le PIC est compliqué, et vous vous souviendrez que c´était déjà le fonctionnement de la sortie du simplissime circuit 555 !

FAQJe compte de 0 à 16 et je présente ce nombre sur les sorties GPIO en espérant que les leds vont s´éclairer une à une, et que cela me fera un compteur binaire (j´avoue que c´est pour émuler visuellement un circuit CMOS 4029). Mais ça ne marche pas ! — Normal ! Le bit 3 de GPIO est “spécial” (c'est une entrée seulement, le bit 3 de TRISIO est toujours à ) est ne peut être utilisé pour ton montage ! Parions que tu t´étais inspiré d´un programme écrit pour un PIC à pattes plus nombreuses (comme le 16F84). Dans ces PIC-là, le registre de sortie a huit vrais bits et ces bits peuvent être copiés sur les pattes et montrer en effet avec huit leds un nombre en binaire. Oublie cette possibilité avec le 675 (pour le moment)... Note aussi que GPIO ne possède matériellement que 6 bits et saute de 111111 à 000000 quand il compte.
Bien, mettons maintenant en oeuvre les connaissances que nous venons de... rafraîchir. Examinons de près la diode D4 de notre schéma .
On voit que, pour qu´elle s´illumine, il faut que du courant sorte de GP1, traverse une résistance, la led (dans le bon sens), une deuxième résistance, puis pénètre dans GP5.
GP1 et GP5 doivent être déclarées comme étant des sorties, GP5 en sortie à la masse (s:0V), GP1 en sortie au + (s:5 V). Toutes les autres seront déclarées comme étant des entrées (haute impédance, abréviation Z)  :

Voici donc le registre TRISIO :
Les zones grisées sont sans intérêt.
Et voilà GPIO . Les zones en gris sont sans intérêt (on y met ce qu´on veut, des zéros par exemple).
Et notre programme sera ainsi fait : après un en-tête contenant tout le blablabla habituel et obligatoire, on place les nombres ad hoc dans les deux registres GPIO et TRISIO pour allumer la première led.
Puis on fait une pause pour que cette led soit visible pendant un temps humainement appréciable (sans pause, l´éclair durerait un millionième de seconde !)...
Puis on entre les nombres destinés à l´allumage de la deuxième led, on fait une pause, et cetera...
PTI+   Un bogue est connu concernant le 12F629/675 : il refuse souvent d´obéir quand on lui commande plusieurs changements successifs d´un bit de sortie. Les codes bcf GPIO,1 bsf GPIO,2 par exemple risquent de ne pas fonctionner. Il faut tourner le problème en commandant le changement de bits de GPIO en bloc, soit avec un "masque", soit avec un registre tampon temporaire. Ce que nous verrons dans le programme.
Voici l´extrait d´un programme pour utiliser les 20 leds dans un gros chenillard :
Rien de bien compliqué, n´est-ce pas  ? Juste à remarquer : mon choix d´utiliser le décimal (directive R = DEC dans l´en-tête) au lieu du binaire, qui pourtant est bien plus pratique dans ce cas particulier. C´est que, comme promis, nous allons plus tard faire écrire ces programmes par ordinateur... plus exactement par des logiciels “tableurs” du genre Excel, qui ne digèrent pas facilement le binaire ni l´hexadécimal...
Pour ces premiers tests, le sous-programme Tempo est le même que celui que celui déjà vu sur PicTrain ; bien sûr, le temps sera plus tard réglable, pour se prêter à toutes les applications prossibles (ça n´est pas un chenillard “dédié” que nous fabriquons, mais un “hyper-4017” à utilisation banalisée)...
Voilà le tableau Excel qui m´a permis de remplir les cases TRISIO et GPIO ; la seule chose que j´ai faite à la main (la seule chose intelligente, que l´ordinateur ne peut pas faire à ma place) est de placer les "0" et les "1" dans les 5 colonnes de gauche.
La prochaine fois, on traduira directement ce tableau de Excel vers du texte, on l´enrichira de façon automatique, puis on traduira ce texte vers un fichier .ASM.
(Sachez, pour votre gouverne, que l´assembleur Microchip MPLAB IDE est aussi un traitement de texte et une calculette : si c´est moins lourd (c´est-à-dire pas dans tous les cas), on pourra donc même éviter le passage par un tableur !)

Tous les fichiers de travail, .ASM (Multipin20.asm), .HEX et .INC, notamment le fichier SP_delai_version1.inc de la rubrique Briquothèque de Ptitrain, se trouvent comme d´habitude ici.

Jidé
06.12.2007

Cette page n´est pas à considérer comme une initiation aux PIC ; le lecteur est censé avoir lu les articles de PSi, à retrouver sur leur sommaire, ici.
Bibliogr. : Microchip, datasheet du 12F675, leds, ds91029
Ptitrain, l´e-magazine du train éclectique. — Directeur de la publication : Christophe Franchini.
Rédacteur en chef : Jean-Denis Rondinet