Présentation du microcontrôleur PIC 16F84A de Microchip
Présentation
Le fabricant de circuits intégrés Microchip a développé et fabriqué une gamme très large de microcontrôleurs.
Parmi eux, le PIC 16F84A.
Ce microcontrôleur s’est très vite répandu, et reste aujourd’hui l’un des plus utilisé dans le monde de l’électronique amateur.
- facilité de mise en œuvre du composant
- facilité de programmation grâce à un jeu d’instruction limité (35)
- gratuité (ou presque) d’outils et des programmateurs
- faible coût du composant
Le composant
Le PIC 16F84A se présente sous forme de 2 types de boîtiers différents.
Le classique « traversant » DIP18, ou 2 versions CMS (SOIC 18 et SSOP20).
La version DIP18 classique possède l’avantage d’utiliser un support 18 points simple pour sa programmation
et sa mise en œuvre.
La fréquence maximale est donnée à 20Mhz, soit 1 cycle d’horloge de 50ns et un temps par instruction de 4x50ns soit 200ns.
En effet chaque instruction demande 4 cycles d’horloge de la CPU pour être exécutée.
Attention, cela dépend aussi du type d’instructions : pour cela voir le tableau récapitulatif du jeu d’instruction du composant.
Version 18 pins vue de dessus
Le PIC 16F84 s’alimente par une tension continue comprise entre 2 et 5V pour les versions commerciales et industrielles, par les broches VSS (pin 5) et VDD (pin 14).
Il possède 2 pins pour l’horloge notées OSC1 et OSC2 : on placera le quartz entre ces 2 pattes, ou la sortie d’un oscillateur sur l’entre OSC1/CLKIN.
Nous trouvons 2 ports A et B : le port B est composé de 8 entrées sorties (IO paramétrables par logiciel) et un port A composé de 5 entrées sorties uniquement.
En tout le nombre d’entrées sorties est de 5+8=13. Chacune de ces entrées sorties peut alimenter une LED et le courant maximal disponible est donné inférieur à 25mA.
Pour driver des composants demandant plus que ce courant, il faudra alors penser à placer un driver externe.
Il possède une zone de mémoire flash pour stocker le programme (1024 mots), une zone de ram (68 octets) pour les variables et une zone d’EEprom (64 octets) pour stocker des données non volatiles qui seront donc conservées après une coupure d’alimentation.
Les instructions
Descriptions | Nombre de cycles | Registres impactés | ||
---|---|---|---|---|
ADDWF | Somme W et f | 1 | C,DC,Z | |
ANDWF | Et logique de W et f | 1 | Z | |
CLRF | Efface f | 1 | Z | |
CLRW | Efface W | 1 | Z | |
COMF | Complément à 2 de f | 1 | Z | |
DECF | Décrémente f | 1 | Z | |
DECFSZ | Décrémente f et saute si le résultat est 0 | 1 (2) | ||
INCF | Incrémente f | 1 | Z | |
INCFSZ | Incrémente f et saute si le résultat est 0 | 1 (2) | ||
IORWF | Ou logique entre W et f | 1 | Z | |
MOVF | Placer dans f | 1 | ||
MOVWF | Placer W dans f | 1 | ||
NOP | Instruction vide | 1 | Z | |
RLF | Rotation de bit à gauche avec injection dans la retenue | 1 | C | |
RRF | Rotation de bit à droite avec injection dans la retenue | 1 | C | |
SUBWF | Soustrait W de f | 1 | C,DC,Z | |
SWAPF | Inversion des 4 bits haut et bas | 1 | ||
XORWF | OU exclusif logique entre W et f | 1 | Z | |
BCF | Efface un bit dans f | 1 | ||
BSF | Place un bit dans f | 1 | ||
BTFSC | Vérifie l'état d'un bit dans f et saute s'il est nulle | 1 (2) | ||
BTFSS | Vérifie l'état d'un bit dans f et saute s'il est 1 | 1 (2) | ||
ADDLW | Ajoute une valeur littérale à W | 1 | C,DC,Z | |
ANDLW | Et logique d'une valeur littérale avec W | 1 | Z | |
CALL | Appelle une sous fonction | 2 | ||
CLRWDT | Efface le chien de garde | 1 | TO,PD | |
GOTO | Aller à l'adresse du programme | 2 | ||
IORLW | Ou logique d'une valeur littérale et W | 1 | Z | |
MOVLW | Placer une valeur littérale dans W | 1 | ||
RETFIE | Retour d'une interruption | 2 | ||
RETLW | Retourne une valeur littérale dans W | 2 | ||
RETURN | Retour d'une sous fonction | 2 | ||
SLEEP | Entre dans le mode stand bye, s'endort | 1 | TO,PD | |
SUBLW | Soustrait W d'une valeur littérale | 1 | C,DC,Z | |
XORLW | Ou exclusif logique d'une valeur littérale et W | 1 | Z |
Le jeu d’instruction reste limité. Ce qui permet de programmer assez facilement le microcontrôleur directement en assembleur.
Toutefois de nombreux exemples sont disponibles en C.
La colonne nombre de cycle permet de voir que certaines instructions peuvent avoir un temps d’exécution plus important. Lors de la conception du logiciel, nous devrons en tenir compte pour régler les timings par exemple.
- TO (Time Out)
- PD (Power Down)
- C (Carry) est la retenue, ou la détection d’un overflow (255+1 par exemple)
- Z (Zero) est actif à 1 si le résultat de l’instruction est 0
- DC (Digital Carry) passe à 1 si nous avons un débordement des 4 derniers bits
Plan de la mémoire ou mapping
Toutes les adresses ont leur « coordonnées » écrites en hexadécimal.
Nous ne décrirons pas en détails tous les registres dans cet article qui n’est qu’une présentation du 16F84A.
Nous remarquons que la mémoire est organisée en 2 banques.
La RAM commence à partir de l’adresse 0Ch (12 en décimal) sur 68 octets.
Les registres de configuration sont quant çà eux placés entre l’adresse 00h et 0Bh inclus.
Nous retrouvons le registre de statut en 03h.
Mise en œuvre
La mise en œuvre reste assez simple :- prévoir une alimentation 5V, avec un régulateur de tension linéaire, quelques condensateurs de découplage et de filtrage
- prévoir un quartz compris entre 32kHz et 20Mhz et ses 2 condensateurs de pied (voir dans les spécifications du composant pour trouver les valeurs adéquates en fonction de la fréquence.
- prévoir un programmateur
On soudera un support 18 points sur une plaque à trou et on évitera de souder directement le PIC sur le circuit imprimé afin de pouvoir mettre au point le logiciel. Cela permettra de remplacer le composant en cas de casse.
Exemple en assembleur
Les exemples étant très répandus, nous ne décrirons qu’un exemple vraiment très simple et qui a juste le mérite d’exister (il ne sert à rien) : il permet de visualiser néanmoins un code source assembleur.
VARIABLE EQU 0Ch org 0 ;Reset goto START org 4 ;Interrupt retfie org 10 ;adresse du START START movlw 255 movwf VARIABLE BCF VARIABLE,0 NOP NOP BSF VARIABLE,0 NOP call FONCTION nop goto START FONCTION addlw 1 retlw 55 end
Comment programmer le composant
Les versions de PIC à mémoire flash sont très pratiques à utiliser :
en effet, cette mémoire et réinscriptible (contrairement à la version OTP, One Time Programming)
et elle permet bien sur de conserver le programme une fois que le composant est mis hors tension.
Pour écrire votre programme en assembleur, il suffit de créer un simple fichier texte.
En suite vous taper votre programme.
Pour le compiler, il faudra utiliser un compilateur :
son rôle est de prendre en entrée votre code source et de générer un fichier binaire en sortie : c’est le fichier hex.
Notons que SPASM.exe fait très bien l’affaire.
Une fois le fichier hex compilé, vous n’avez qu’à le charger dans l’outil de programmation qui va programmer le composant.
Il existe des versions de programmateur qui se branche sur le port parallèle.
Mais il devient difficile de nos jours de trouver des ordinateurs possédant ce type de sorties.
On se rapprochera donc de programmateur USB.
Microchip propose ce type de programmateurs pour une trentaine d’euros avec l’outil PC de programmation, debug.
Conclusion
Le 16F84A est un microcontrôleur des plus séduisants à utiliser par l’amateur : simple et peu couteux.
De nombreux autres fondeurs ont essayé et essaient encore de le concurrencer :
ST, TI par exemple, en proposant des microcontrôleurs similaires et des outils de développement simples et peu chers.
Mais il semble que la communauté reste très attachée à Microchip pour le moment.