Le 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.



Pourquoi : sans doute pour de multiples raisons :
  • 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
Ce qui fait qu’actuellement il existe une multitude de kit ou montage les utilisant : du chenillard simple pour piloter des LED et illuminer ainsi l’arbre de Noël, jusqu’au contrôle de LCD et de DDS pour des récepteurs décamétriques.



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.

pic 16F84A 18 pins

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.

La colonne de droite présente les registres ou bit de ces registres impactés par l’appel de l’instruction :
  • 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
Note : tous ces bits sont situés dans le registre de statut à l’adresse 0x03 (3 en hexadécimal).



Plan de la mémoire ou mapping

Mapping PIC 16F84A

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.

Aucun commentaire:

Enregistrer un commentaire