Le PIC16F84A est le microcontrôleur qui a mis le PIC entre toutes les mains : dix-huit broches, treize entrées-sorties, un cœur RISC dont le jeu d’instructions tient en trente-cinq mots, et une seule alimentation de 5 V. Il tient dans une main, se câble sur une plaque d’essai et se programme sans être dessoudé. C’est la puce des premiers automatismes, des premiers chenillards et des premiers cours d’électronique embarquée — et elle reste aujourd’hui le moyen le moins cher d’apprendre à faire parler un microcontrôleur autrement qu’avec une carte toute faite.
La référence vendue dans cette boutique est le PIC16F84A-04/P, la sérigraphie est lisible sur le boîtier : suffixe P pour un boîtier DIP plastique traversant, suffixe 04 pour une horloge garantie jusqu’à 4 MHz. Le cœur estampille 16F84A — la révision « A » du classique 16F84, dont elle remplace la mémoire programme par de la mémoire Flash reprogrammable une dizaine de milliers de fois.
Ce qui fait sa valeur tient dans trois nombres : 1 024 instructions de programme, 68 octets de mémoire vive et 64 octets de mémoire EEPROM de données qui survivent à la coupure d’alimentation. Les soixante-quatre octets sont la vraie particularité : un montage qui garde en mémoire un seuil, un compteur ou un réglage après avoir été débranché n’a rien d’autre à ajouter.
Caractéristiques techniques
| Référence | PIC16F84A-04/P, Microchip — sérigraphie du boîtier |
|---|---|
| Boîtier | DIP-18 traversant, pas de 2,54 mm, 18 broches (9 par rangée) |
| Cœur | RISC 8 bits, architecture Harvard, jeu de 35 instructions d’un mot |
| Mémoire programme | 1K mots de 14 bits, soit 1 024 instructions (les 1,75 Ko annoncés par le constructeur) |
| Mémoire vive | 68 octets de registres généraux |
| Mémoire EEPROM de données | 64 octets, lisibles et inscriptibles octet par octet, conservés hors tension |
| Entrées-sorties | 13 broches, configurées une à une : PORTA (RA0 à RA4) et PORTB (RB0 à RB7) |
| Cycle d’instruction | 4 coups d’horloge, soit 1 µs à 4 MHz et 200 ns sur la version à 20 MHz |
| Horloge | Externe uniquement : quartz ou résonateur (modes XT, LP ou HS selon la fréquence) ou circuit RC |
| Tension de service | 2,0 à 5,5 V ; les 4 MHz sont garantis sous 4,0 à 5,5 V, la fréquence maximale baisse à tension plus faible |
| Courant par broche | 25 mA absorbés au maximum, 20 mA fournis au maximum |
| Compteur | Un seul TMR0, 8 bits, avec prédiviseur 8 bits partagé avec le chien de garde |
| Interruptions | Quatre sources : broche RB0/INT, débordement de TMR0, changement d’état sur RB4 à RB7, fin d’écriture EEPROM |
| Remises à zéro | Mise sous tension, temporisation de démarrage, temporisation d’oscillateur, chien de garde, broche MCLR |
| Pile matérielle | 8 niveaux, ce qui fixe la profondeur maximale des appels imbriqués |
| Endurance mémoire | Flash programme : 10 000 cycles d’écriture, typiques — EEPROM de données : 1 à 10 millions de cycles selon la tension |
| Conservation des données | Garantie supérieure à 40 ans, EEPROM comprise |
| Programmation | Série en circuit (ICSP) sur cinq fils, ou dans un programmateur de support |
| Température | −40 à +85 °C en version industrielle |
| Ce qu’il n’a pas | Aucun convertisseur analogique-numérique, aucune modulation de largeur d’impulsion matérielle, aucun port série matériel |
Brochage du boîtier DIP-18
La broche 1 se repère à l’encoche en demi-lune, toujours à gauche quand le composant est vu de dessus et que les inscriptions se lisent normalement. Le brochage n’est pas symétrique : les entrées-sorties de PORTA encadrent les deux broches d’horloge, celles de PORTB sont rangées d’un seul côté.
| Broche 1 | RA2 — entrée-sortie, également broche de donnée du bus en mode parallèle |
|---|---|
| Broche 2 | RA3 — entrée-sortie |
| Broche 3 | RA4/T0CKI — entrée-sortie à drain ouvert : elle tire vers la masse mais ne fournit jamais de courant, et sert d’entrée d’horloge externe à TMR0 |
| Broche 4 | MCLR — remise à zéro, active à l’état bas ; c’est aussi l’entrée de tension de programmation |
| Broche 5 | VSS — masse |
| Broche 6 | RB0/INT — entrée-sortie, entrée d’interruption externe |
| Broches 7 à 9 | RB1, RB2, RB3 — entrées-sorties |
| Broches 10 et 11 | RB4, RB5 — entrées-sorties ; RB4 à RB7 peuvent réveiller le programme sur un changement d’état |
| Broche 12 | RB6/PGC — entrée-sortie, horloge de programmation en circuit |
| Broche 13 | RB7/PGD — entrée-sortie, données de programmation en circuit |
| Broche 14 | VDD — alimentation positive |
| Broche 15 | OSC2/CLKOUT — sortie de l’oscillateur à quartz, ou sortie d’horloge divisée par quatre en mode RC |
| Broche 16 | OSC1/CLKIN — entrée de l’oscillateur |
| Broche 17 | RA0 — entrée-sortie |
| Broche 18 | RA1 — entrée-sortie |
Deux points qui surprennent au premier montage. RA4 est à drain ouvert : cette broche ne peut pas allumer une LED par elle-même, il lui faut une résistance de rappel vers le +5 V. Et MCLR ne doit pas rester en l’air : une résistance de 4,7 kΩ entre la broche 4 et le +5 V suffit à la tenir haute, et cette broche doit de toute façon être accessible pour le programmateur.
Un condensateur de 100 nF entre VDD (broche 14) et VSS (broche 5), au plus près du boîtier, n’est pas un luxe : sans lui, un moteur ou un relais voisin fait redémarrer la puce de façon aléatoire.
Applications courantes
- Chenillards, feux tricolores, enseignes : huit sorties suffisent à animer une rangée de LED, et les 25 mA absorbés par broche laissent passer la LED directement, sans transistor.
- Minuteries et temporisations : TMR0 et le chien de garde donnent la base de temps, sans composant externe autre que le quartz.
- Serrures et digicodes : le code secret se range dans les 64 octets d’EEPROM et survit à la coupure d’alimentation.
- Compteurs d’impulsions : un capteur à sortie logique branché sur RB0/INT ou sur RA4/T0CKI se compte en matériel, sans scrutation.
- Automatismes simples : commander un relais, un ventilateur ou une électrovanne par l’intermédiaire d’un Darlington ou d’un transistor de puissance.
- Apprentissage de l’assembleur et du brochage : un jeu de trente-cinq instructions se retient en quelques soirées, et chaque broche fait exactement ce que le programme lui dit.
- Réparation de matériel ancien : beaucoup de cartes des années 1990 et 2000 embarquent ce boîtier, encore disponible neuf.
Mini-projet : faire défiler huit LED sur le port B
Le montage qui sert de premier programme à peu près partout : les huit broches de PORTB allument une LED chacune, et la puce décale l’allumage une par une, d’un bout à l’autre. Tout le montage tient sur une plaque d’essai, et le programme fait moins de quarante lignes d’assembleur.
Ce qu’il faut
| Le microcontrôleur | Le PIC16F84A de cette page |
|---|---|
| Le programmateur | PICKit 3.5 Microchip, qui prend en charge le PIC16F84A et le programme sur cinq fils |
| L’horloge | Un quartz 4 MHz (deux condensateurs de 22 pF) ou un résonateur céramique 4 MHz, à trois broches, qui se passe des condensateurs |
| Les voyants | LED 5 mm rouge, huit pièces |
| Les résistances des LED | 10 résistances 1/4 W 220 Ω, une par LED |
| Le support | Plaque d’essai 830 points, qui laisse la place aux huit résistances et aux huit LED |
| Les liaisons | 10 câbles Dupont mâle-mâle, plus quelques fils de liaison et une alimentation 5 V régulée |
Le câblage
Le boîtier se place à cheval sur la gouttière centrale, encoche de la broche 1 vers la gauche. Les broches de gauche sont alors numérotées 1 à 9 de haut en bas, celles de droite 18 à 10 — la broche 14, l’alimentation, se trouve en bas à droite.
Broche 5 (VSS) | → masse de l’alimentation 5 V |
|---|---|
Broche 14 (VDD) | → +5 V, avec un condensateur de 100 nF vers la masse au plus près du boîtier |
Broche 4 (MCLR) | → +5 V par une résistance de 4,7 kΩ ; la broche reste accessible pour le programmateur |
Broches 15 et 16 (OSC2, OSC1) | → les deux broches du quartz 4 MHz ; un condensateur de 22 pF de chaque broche vers la masse (inutile avec un résonateur céramique) |
Broches 6 à 13 (RB0 à RB7) | → une résistance de 220 Ω puis l’anode d’une LED ; la cathode de chaque LED va à la masse |
| Broches 1, 2, 3, 17, 18 | non connectées pour ce montage |
Les huit LED ne s’allument qu’une à la fois dans ce programme : le courant total reste celui d’une seule LED, environ 14 mA par la résistance de 220 Ω, largement dans les 20 mA qu’une broche peut fournir. Pour des LED plus lumineuses ou plusieurs LED par broche, il faut un étage de puissance — le ULN2803A en absorbe huit fois plus.
Le sens de la LED se vérifie avant de mettre sous tension. L’anode, la patte longue, du côté de la résistance et de la broche du PIC ; la cathode, la patte courte et le méplat du boîtier, vers la masse. Une LED montée à l’envers ne s’allume simplement pas — elle ne grille pas — mais on cherche longtemps le défaut dans le programme alors qu’il est sur la plaque.
Le programme
Assembleur MPASM, à assembler dans MPLAB X puis à téléverser avec le PICKit. Deux réglages sont à faire dans la fenêtre des bits de configuration avant la compilation : l’oscillateur en mode XT et le chien de garde désactivé pour ce premier essai.
/*
* Chenillard huit LED sur le port B - PIC16F84A-04/P a 4 MHz
*
* Cablage :
* RB0 a RB7 (broches 6 a 13) - 220 ohms - anode LED, cathode a la masse
* Quartz 4 MHz entre OSC1 (16) et OSC2 (15), 22 pF de chaque cote vers la masse
* MCLR (4) au +5 V par 4,7 kohms, VDD (14) au +5 V, VSS (5) a la masse
* Bits de configuration : oscillateur XT, chien de garde desactive
*
* Composants, brochage et fiche complete : www.marocproduits.com
*/
list p=16F84A
#include "p16f84a.inc"
compteur1 equ 0x0C ; deux octets de la memoire vive,
compteur2 equ 0x0D ; adresses libres en banque 0
org 0x0000
goto demarrage
demarrage
bsf STATUS,RP0 ; banque 1 : c'est la que sont TRISA et TRISB
movlw 0x00
movwf TRISB ; RB0 a RB7 toutes en sortie
movlw 0xFF
movwf TRISA ; PORTA en entree, inutilise ici
bcf STATUS,RP0 ; retour en banque 0 : c'est la que sont les ports
clrf PORTB ; toutes les LED eteintes au depart
boucle
movlw 0x01
movwf PORTB ; motif de depart : RB0 allume, les autres eteints
suivant
call attente
btfsc PORTB,7 ; RB7 allume ? le motif est arrive au bout
goto boucle
rlf PORTB,1 ; sinon on decale le motif d'un rang vers la gauche
goto suivant
attente
movlw 0xFF
movwf compteur1
suite1
movlw 0xFF
movwf compteur2
suite2
decfsz compteur2,1
goto suite2
decfsz compteur1,1
goto suite1
return
endComment ça marche
- TRISB décide du sens des broches, PORTB de leur état. Les deux registres portent le même numéro de bit : écrire 0 dans un bit de TRISB met la broche correspondante en sortie, écrire 1 la met en entrée. C’est le début de tous les problèmes : un programme qui remplit PORTB sans avoir écrit TRISB ne fait rien du tout, les broches restent des entrées.
- Les banques de mémoire obligent à basculer. TRISA et TRISB vivent en banque 1, PORTA et PORTB en banque 0. On y va en posant le bit RP0 de STATUS à 1, on en revient en le remettant à 0. Un oubli, et le programme écrit dans un registre fantôme — le symptôme classique du premier programme PIC.
- Le défilement est un décalage.
rlf PORTB,1décale les huit bits du port d’un rang vers la gauche : RB0 devient RB1, RB1 devient RB2, et ainsi de suite jusqu’à RB7. Le testbtfsc PORTB,7regarde si le motif est arrivé sur la dernière broche, et si oui, le programme repart de RB0. - La temporisation est une double boucle. Deux compteurs imbriqués décrémentés par
decfszfont environ 260 000 cycles d’instruction, soit un quart de seconde à 4 MHz. Chaque LED reste donc allumée environ un quart de seconde : c’est ce qui rend le défilement lisible. - La vitesse se règle sur la valeur de compteur1. Plus le nombre chargé dans les compteurs est petit, plus le défilement est rapide. Une valeur de 0x20 donne à peu près 4 ms par LED, un défilement continu qu’il faut alors regarder de près pour distinguer les rangs.
Si rien ne s’allume
Quatre vérifications, dans l’ordre où elles résolvent le cas. Les bits de configuration d’abord : sur un projet neuf, MPLAB X propose une configuration par défaut qui ne correspond ni au quartz ni au chien de garde désactivé, et la puce démarre alors sur un oscillateur interne RC qui n’existe pas sur ce boîtier — le programme tourne, mais à une fréquence qui n’a rien à voir avec le quartz. Ensuite le programmateur : sa masse doit être reliée à celle du montage pendant l’écriture, et la puce doit être alimentée. Puis le sens des LED et la résistance, la plaque étant vérifiée ligne par ligne. Enfin le quartz : deux condensateurs de 22 pF au lieu de 22 nF, ou l’oubli de l’un des deux, et l’oscillateur démarre mal ou pas du tout.
Un seul point de mesure suffit souvent : le multimètre sur la broche 15 du boîtier, en mesure de fréquence, doit lire 4 MHz. Si elle lit quelques centaines de kilohertz, la puce tourne sur le mauvais oscillateur et tout le reste est faux.
Variante : afficher sur un écran LCD 1602
Les huit broches de PORTB servent aussi bien à faire parler un afficheur LCD 1602 en mode quatre bits : quatre fils de données (RB4 à RB7), les deux fils de commande RS et E, et la broche de lecture écriture (RW) reliée à la masse puisque le microcontrôleur n’a rien à lire dans l’afficheur. Le contraste se règle par un potentiomètre sur la broche V0, et le rétroéclairage se branche par une résistance de 220 Ω sur le +5 V. Il ne reste alors que cinq broches de PORTB pour les LED, ce qui suffit pour un affichage et deux voyants d’état.
Le programme, lui, ne s’improvise pas : un afficheur LCD se pilote par une séquence d’initialisation précise en mode quatre bits, et l’assembleur du chenillard ne se réutilise pas tel quel. C’est le passage naturel après ce premier montage, mais il s’écrit à partir de la documentation de l’afficheur.
Questions fréquentes
Peut-on encore utiliser ce microcontrôleur aujourd’hui ?
Oui, et il garde deux avantages sur une carte moderne : il est très bon marché, et il n’y a rien entre le programme et les broches. Sa limite est le confort : cinq instructions de retard de plus pour changer une LED, aucune bibliothèque, et un cycle d’écriture de la mémoire programme limité à dix mille fois. Pour tout ce qui demande du calcul, du série ou de l’analogique, une ATmega328P en boîtier DIP est plus confortable — c’est la puce d’un Arduino, et elle se câble seul à seul presque comme celle-ci.
Faut-il un quartz, ou peut-on s’en passer ?
Il en faut un, ou son équivalent : ce boîtier n’a pas d’oscillateur interne. Trois possibilités — un quartz entre OSC1 et OSC2 avec un condensateur de 22 pF de chaque côté vers la masse, un résonateur céramique à trois broches qui se passe des condensateurs, ou un réseau RC sur OSC1, avec l’horloge divisée par quatre disponibles sur OSC2/CLKOUT. Le quartz est le plus juste, le résonateur le plus tolérant aux chocs, le RC le plus économique et le moins stable, tout juste bon à faire clignoter une LED.
Peut-on le programmer sans le sortir du montage ?
Oui, la programmation série en circuit ne demande que cinq fils : VDD, VSS, MCLR et les deux broches RB6 et RB7, qui sont le bus de programmation. C’est ce qui permet de mettre à jour un automatisme en place, sans dessouder. Il faut simplement que le programmateur et le montage partagent la même masse, et que rien d’autre ne tire sur RB6 et RB7 pendant l’écriture.
Combien de courant une sortie peut-elle fournir ?
20 mA au maximum en sortie haute, 25 mA au maximum en sortie basse. Une LED avec sa résistance passe sans discussion ; un relais, un moteur ou un buzzer, non — leur bobine demande plus, et la tension de retour qu’elle produit à l’extinction peut abîmer la puce. Dans ce cas, on interpose un étage : le ULN2803A pour huit charges absorbées à la masse, ou un transistor seul pour une bobine de relais 5 V.
À quoi servent les 64 octets d’EEPROM de données ?
À garder des valeurs après la coupure d’alimentation : un seuil de température, une position, un compteur d’heures, un code d’accès. Cette mémoire a une endurance bien plus élevée que la mémoire programme — de un à dix millions d’écritures — et sa durée de conservation dépasse quarante ans. C’est elle qui rend possible un montage qui se souvient, alors que la mémoire programme, elle, ne doit être écrite que lorsqu’on change le programme.
Pourquoi la broche RA4 n’allume-t-elle pas de LED ?
Parce qu’elle est à drain ouvert : elle sait tirer sa sortie vers la masse, jamais la pousser vers le +5 V. Une LED branchée entre RA4 et la masse reste éteinte. Deux solutions : une résistance de rappel de 10 kΩ entre RA4 et le +5 V, la LED restant pilotée en absorption, ou l’usage d’une autre broche pour la sortie haute. Cette particularité est propre à RA4, et elle explique aussi son intérêt comme entrée d’horloge externe pour TMR0 sur cette broche.
Le boîtier chauffe-t-il en fonctionnement ?
Non, il reste froid. Ce microcontrôleur ne dissipe rien par lui-même : la seule chaleur vient des courants qui traversent ses broches. Un boîtier tiède signale une sortie trop chargée, ou une sortie reliée directement au +5 V ou à la masse sans résistance — c’est le cas à corriger tout de suite, la puce ne survit pas longtemps à une sortie court-circuitée en permanence.
Un support DIP-14 convient-il pour ce boîtier ?
Non. L’écartement entre les deux rangées est le même, mais il manque deux broches de chaque côté : le boîtier 18 broches ne rentre pas. Il faut un support 18 broches, et le placer encoche du côté où se trouvait la broche 1 — un boîtier monté à l’envers échange l’alimentation et la masse, et la puce ne s’en remet pas.
À combiner avec
Pour le chenillard de cette page, il faut le PICKit 3.5 pour écrire le programme, une plaque d’essai 830 points, huit LED 5 mm rouge, des résistances 220 Ω et des câbles Dupont. Pour aller plus loin, le afficheur LCD 1602 se pilote directement depuis PORTB, le bouton poussoir se branche sur RB0/INT pour déclencher une interruption, et le ULN2803A ou un relais 5 V prennent le relais dès qu’il faut commander autre chose qu’une LED.









