Autour du PC

Chevaux de Troie

Electronique

Trucs et astuces

Sécurité

 

CSS Valide !

Site optimisé en 1024x768



 

Initiation au PIC 16F84

Je vais essayer dans ces quelques pages de mettre en evidence le principe de programmation d'un microcontrôleur de type PIC. J'utiliserai pour cela un type de composant bien connu dans ce domaine: le 16F84.

A quoi ça sert ?
 Programmer un composant revient en fait à lui demander d'executer les instructions fournies dans un programme afin d'automatiser des tâches ou de "surveiller" le comportement de composants externes. En fait cela s'approche un peu du fonctionnement d'un tout petit automate programmable de quelques centimètres carré.
 
Pour ceci, il faudra bien sur discuter le même langage que lui. Il fait parti de la famille des circuits RISC (Reduced Instruction Set Computer) ou jeu d'instructions réduit. En fait, son langage est, dans le principe, équivalent au langage assembleur des microprocesseurs que l'on utilise sur nos chers PC.

Ce dont nous allons avoir besoin :
 Le 16F84 est un composant electronique, il doit donc être programmé via une interface electronique.Cette interface, appellée programmateur, est branchée sur un ordinateur (c'est lui en faite qui s'occupe de la transition entre le programme et la mémoire du PIC). L'utilisateur pourra s'orienter vers un modèle tout prêt, ou en kit, ou bien (et c'est la solution la plus économique) se fabriquer la carte, car en fait les composants mis en oeuvre sont très peu nombreux et au prix très abordables. Le seul obstacle serai en fait la conception du circuit imprimé. Enfin, là aussi il est très facile de faire le boulot soit même.
 N'oublions pas non plus le logiciel d'ecriture du programme qui doit etre "compatible" avec le modèle de programmateur utilisé.
 Ensuite, il est judicieux de se monter une petite platine d'experimentation afin de tester la bonne fonctionnalité des programmes en situation réel (le PIC en mode execution).
Voila pour ce qui est de la partie hardware, pour les programmes c'est moins compliqué il faut:
-Un editeur de text (le bloc-notes de Windows)
-Un logiciel permettant de compiler les programmes en langage machine. Ce logiciel est founi gratuitement par Microchip Technologies (le fabriquant du composant), c'est MPLAB, la page de téléchargement se trouve sur :
www.microchip.com, à ce jour nous pouvons y trouver la version MPLAB IDE v7.00 .
-Un logiciel permettant d'ecrire le programme compilé dans le PIC situé sur le programmateur. Nous utiliserons ICPROG, qui permet de piloter le programmateur décrit plus bas.Ce logiciel ce trouve sur:
www.ic-prog.com/index1.htm.

Conception du programmateur :
J'ai opté pour la réalisation d'un montage paru dans Electronique Pratique (le typon est ici):

R1 : 1k
R2 : 10 k
R3 : 22 k
R4 : 470
R5-R7 : 2,2 k
R6 : 100 k
C1 à C4 : 1µ
C5 - C6 : 10µ
C7 : 470µ
C8-C9-C11 : 100 nF
C10 : 1 nF
D1 : 1N4004
D2-D3 : 1N4148
T1 : BC557 B
T2 : BC547 B
L1-L2: Leds
IC1 : 78L05
IC2 : 78L12
IC3 : 4093
IC4 : MAX232

Cliquer sur l'image pour agrandir

Con1: Prise DB9 Femelle
Con2: Prise pour alim
Prévoir un support de circuit intégré 18 broches de bonne qualité (si possible "tulipes")

Premiers programmes :
 Passons aux choses serieuses, nous allons tenter d'ecrire un programme permettant simplement l'allumage d'une Led:
Pour bien comprendre ce que nous voulons faire, nous devons étudiez le brochage du 16F84 :


Les deux ports d'entrées/sorties sont PORT A (broches RA0 à RA4) et PORT B (RBO à RB7). Ils sont bi-directionnels, c'est à dire qu'ils peuvent à la fois être initialisés en entrée ou bien en sortie.

 

Note: Il est vivement conseillé de consulter le plus possible le Datasheet du 16F84 au format PDF que je met à diposition sur ce site.

Structure du programme et expliquations des lignes de code:




;





start


;
LIST
#include
__config

org
bsf
movlw
movwf
bcf

bsf
goto

end
p=16f84
"p16f84.inc"
0x3FF9

0x00
STATUS,RP0
0xFE
TRISB
STATUS,RP0

PORTB,0
start
1
2
3

4
5
6
7
8

9
10

11

1 - Déclaration du type de composant utiliser

2
- C'est le fichier d'include du pic16F84 qui contient les valeurs d'adresses des registres. En effet chaque nom de registre est affecté à une adresse, par exemple le PORT B est en 0x08, le PORT A en 0x05,...Ce fichier est inclu dans la compilation du code par le compilateur de MPLAB.Version texte.

3
- Cela sert à configurer le PIC (positionnement des fusibles de fonctionnement).


La valeur de cette commande peut être (comme ci dessus en hexa, en binnaire ou en "texte").
CP : Code de protection de relecture du programme écrit dans le PIC.
PWRTE : Fonction PowerUp Timer, utilisation d'une temporisation de 72ms activée au démarrage du PIC).
WDT : Utilisation du WatchDog ou 'Chien de garde' permettant la surveillance interne du programme.
FOSC : Selection du type de quartz de l'horloge externe utilisé.

Dans notre cas la valeur est 0x3FF9 ou B'11111111111001' ou
_CP_OFF& _PWRTE_OFF&_WDT_OFF&_XT_OSC
Note: les valeurs hexa de chaque fusibles sont dans le fichier p16f84.inc .En effectuant un & logique sur chacun des fusibles nous retrouvons alors la valeur 0x3FF9.

4 - ORG signifie, "origine" du programme.C'est là que se place le PIC en tout debut d'un programme, lors d'un reset.

5 - Pour comprendre la suite du programme il faut voir la structure des registres en mémoire.(Voir tableau ci-dessous).

 Les registres sont situés dans deux parties differentes appelées BANK 0 et BANK 1.On ne peut accéder à la BANK 1 lorsque l'on se situe dans la BANK 0 et vice versa.

Au départ nous nous trouvons dans la BANK 0 et nous voulons accéder à la BANK 1.

Pour cela on met le bit RP0 du registre STATUS à 1 (le registre STATUS étant présent dans les deux banks , on peut changer de bank à partir de n'importe où).

La commande pour mettre le bit à 1 est bsf (bit set f) d'où la commande : bsf  STATUS,RP0


Ou bien mise à 1 du cinquieme bit du registre STATUS ce qui nous donne bsf STATUS,5

6 - L'instruction movlw 0xFE permet de charger le nombre hexadéciml FE dans le registre W ( c'est le registre de travail).

7 - La ligne movwf  TRISB permet de charger le nombre FE contenu dans W dans le registre TRISB.
Cette ligne est importante de par le fait, qu'elle sert à configuré le sens entrant ou sortant de chaque broche de chaque port.
Comme il à été dit plus haut les port A et B peut être configurés en entrées ou sorties.Dans notre exemple on utilisera le PORT B.
Ce qu'il faut savoir c'est que, pour mettre une broche en entrée il faut initialiser le bit correspondant à 1 et pour initialiser en sortie mettre le bit à 0.

Nous allons decider donc, de brancher notre LED sur labroche RB0 du 16F84, ce qui correspond au Bit 0 du PortB , une initilalisation de cette broche en sortie ainsi que toutes les autres en entrée se fera comme ceci : B'11111110' ce qui est bien égal à 0xFE .
Nous aurions pu tout aussi bien initialisé tout le Port B en sortie ce qui aurait donné B'00000000' soit 0x00. Il en est de même pour le Port A mise à part que lui est adressé sur 5 Bits.

TRISB se trouve dans la Bank 1, c'est pour cette raison que nous avons basculé dans cette zone mémoire en ligne 5.
Pour finir, on peut voir que l'on ne peut charger une valeur directement dans un registre, il faut en premier lieu passer par le registre de travail : W .

Broche en entrée : 1 - Broche en sortie : 0


8 - Ici on remet le bit RP0 du registre STATUS à 0 pour repasser en bank 0 (bcf: bit clear f ) .

9 - C'est grace à cette ligne que nous allons enfin allumer la Led en mettant à 1 (5V) la broche RB0 du Port B, toujours en utilisant l'instruction bsf.Ce qui nous est permis car cette broche à été initilisée en sortie via l'instruction TRISB (attention à ne pas se mélanger les pinceaux).

Juste au dessus de cette ligne, on peut voir un start en retrait, ce retrait est important, il permet de differencier les instructions du programmes , les commentaires (les caractère après un ; ), au même titre qu'un commentaire, start est un label (une etiquette).

10 - Cette ligne boucle le programme en utilisant un goto allant pointer sur l'etiquette start (c'est un saut inconditionnel).

11 - c'est l'instruction de fin de programme ; elle est indispensable dans tout programme.

Ouf ! voila pour la description de ce petit programme. Dans les lignes suivantes nous allons aborder la technique d'écriture de celui-ci dans le PIC.

La procédure d'écriture dans le PIC:
La procédure complète peut être schématiser comme ceci :


1- Ouvrir le bloc-note de Windows, écrire le programme ci-dessus en respectant les espaces entre et dans les lignes ou bien télécharger-le ici.Enregistrer le fichier dans un dossier par exemple C:\test\led1.asm.

2- Installer puis executer MPLAB.Lorsque celui-ci est ouvert suivre ce cheminement:
- Cliquer sur Project puis sur 'Project Wizard'
- Cliquer ensuite sur suivant
- Dans la nouvelle fenêtre, choisir le type de PIC (Device) à programmer.Exemple : 16F84A ou 16F84.Cliquer sur suivant.
- Dans la fenêtre suivante, laisser les choix par défaut (Microship MPASM Toolsuite), puis cliquer sur suivant.
- Ensuite renseigner les deux cases, le nom du projet (exemple: test) ainsi que le nom du dossier (nous avons choisi C:\test\ ). Cliquer sur suivant.
- Sur cette nouvelle fenêtre, selectionner dans la partie gauche, le nom du fichier ASM à traiter, selectionner led1.asm puis cliquer sur le bouton Add.Le fichier est pris en compte.Cliquer sur suivant.
- Cliquer enfin sur Terminer
- De retour sur la fenêtre principale de MPLab, il suffit de cliquer en haut sur Project puis sur Build all.
Une petite fenêtre de progression s'ouvre de façon rapide et, si tout s'est bien déroulé se referme.Une fenêtre plus imporante nous renseigne sur les differentes étapes de la compilation.Il est interessant de lire ces informations.La dernière ligne devrait être : BUILD SUCCEEDED: Sat Feb 19 13:08:48 2005 (avec la date du jour bien entendu).
Il suffit maintenant d'aller dans notre dossier C:\test\ et y trouvé tout une serie de fichier construit par MPLab, celui qui nous interesse est led1.hex, c'est un fichier compilé en hexadecimal. Il est possible de visionner son contenu en l'ouvrant avec le bloc-note.
Note: il existe un petit logiciel developpé par Microship permettant de compiler les programmes,il est moins lourd que MPLAB car il ne fais que la compilation (ce qui nous interresse dans l'immediat).On peut l'utiliser pour les expérimentations decrites dans cette page. Il est diponible sur ce site, il porte le nom: Mpasmwin.
Inutile de l'installer, cliquer sur Browse, pour aller chercher le fichier ASM, choisir le type de PIC utilisé dans le menu Processor sur la droite, laissé les valeurs par défaut puis cliquer sur Assemble.
 A savoir que si il y a des erreurs Mpasm vous les consigne dans un fichier appelé nomdeprogramme.ERR (dans notre cas c'est led1.err). En consultant dans notre exemple ce fichier il nous previens en ligne 8 que nous travaillons avec l'instruction STATUS dans le Bank 1.
ATTENTION: veiller à placer dans le même dossier que Mpasm, le fichier include p16f84.inc car il n'en est pas equipé.

3- Nous devons maintenant, 'écrire' ce programme dans le PIC, c'est là qu'intervient le logiciel Icprog.Il suffit de l'ouvrir :
- Cliquer sur Settings puis sur Hardware. Laisser le programmateur JDM Programmer, puis selectionner le port sur lequel la carte programmateur va être connectée.Cliquer sur OK.
- En haut à droit , dans le menu déroulant, selectionner le type de PIC à programmer.

- Placer le 16F84 sur le support à 18 broches de la platine (en respectant bien sur le sens d'implantation).Brancher une alimentation (de 12 à 15V continue) pour alimenter la platine et la brancher sur le port COM selectionné du PC en utilisant un cable 9 points male/femelle.Une fois branchée, alimenter le programmateur, la led verte doit s'allumer.

- Cliquer ensuite sur le menu Command puis sur Erase All, ceci aura pour but d'effacer le contenu du PIC.Confirmer.
A ce moment la led rouge s'allume pendant le temps necessaire (en géneral très court)..Puis le logiciel vous informe come ceci :"Device is erased".

- Cliquer ensuite sur Command puis Read all, à ce moment ICprog lit le contenu du PIC, comme celui-ci vient d'être effacé il ne doit apparaitre dans les deux fenêtres que des valeurs 3FFF.

- Maintenant il s'agit d'ecrire notre petit programme.
Donc pas de problèmes particuliers.
Cliquer sur le menu déroulant File puis sur Open File puis choisir notre programme: led1.hex.Cliquer sur Ouvrir, le programme se charge alors dans ICprog.
 
Il est interressant de voir que le logiciel nous renseigne sur plusieurs paramètres de compilation:
A droite il nous décrit l'oscillateur (Oscillator) qui doit être sur XT, tout comme nous l'avions paramétré dans le programme à la ligne 3 (__config), ainsi que les fusibles WDT, PWRT qui ne sont pas cochés, donc à zero et CP
(Code Protect) non activé.

- Aller! maintenant on peut ecrire, pour cela verifier bien les branchements, alimenter la platine si ce n'est pas deja le cas et cliquer sur Command puis sur Program All.

Cliquer sur Yes pour la confimation,la led rouge s'allume, le code est écrit puis verifié, à la fin du processus ICprog indique qu'il a terminé par 'Device successfully verified !"...cool.

- Et bien, je suis content d'avoir programmer mon PIC...Et maintenant il va bien falloir visualiser le programme en réel. Pour ceci il va falloir quelques composants et une platine d'essai.pour ma part j'utilise une plaque d'essai pastillée au pas.

 

 

 

Voici le montage à réaliser :

La led est bien branchée sur B0, normalement si tout s'est bien passé, lors de la mise sous tension, elle doit s'allumer.

Si ce n'est pas le cas, le problème peut venir, du programme en lui même, d'une mauvaise soudure, d'un composant deffectueux, enfin pas mal de choses.
Reprendre tout à zero et tester le montage experimental me parait le plus judicieux.

Pour ma part, je me suis fait une platine d'essai me permettant de visualiser sur des leds l'état des sorties du PIC.
Par contre, il est conseillé d'utiliser des supports de bonne qualité car lors des essais les pattes du PIC sont soumises à rude epreuve.

 

 

 

 

 

 

 

Et en plus ça marche !!!
Vempyr