LA PROGRAMMATION DE PIC
expliquée pas à pas
Ce qui suit n'est pas un cours ex-cathedra mais
le fruit de mes propres expérimentations, avec des composants courants et
des équipements facilement accessibles. Il s'agit d'une façon de voir et de
faire parmi d'autres, le but étant, pour moi en l'écrivant, de mémoriser et
de garder des traces de ces manipulations. Et accessoirement de faire
profiter toute la communauté de cette expérience et de cette vulgarisation.
C'est une façon pour moi de rendre ce que j'ai reçu de mes copains, qui
m'ont fait bénéficier de leur expérience, m'ont donné des informations et
aussi des encouragements. Un merci tout spécial aux deux extrémités de la
boucle historique de mon approche des PIC: à Jean-Daniel Nicoud et à Charles
Monod.
Processus de programmation
Un PIC (Programmable
Interface Controller, copyright Microchip ) est, comme son nom l'indique, un microprocesseur
équipé de périphériques internes, le tout programmable. On
l'appelle "Interface" parce qu'il peut s'adapter à n'importe-quel contexte et
constitue ainsi un circuit-intégré dont on peut modifier la destination
simplement en le programmant. Le gros avantage de ce genre de composant, c'est
qu'avec lui on peut construire des applications simplement en le programmant
différemment. Plus besoin de souder des composants, on peut se contenter d'un
circuit-imprimé standard et se confectionner une foule
d'applications différentes. Ceux qui préfèrent le clavier au fer à souder seront
comblés !...
Rappelez-vous l'époque où la
confection d'un montage passait par la réalisation d'un prototype sur carte
pastillée (les fameuses Veroboard) en assemblant des des transistors, des circuits-intégrés, des résistances, des condensateurs, et
autres. Un fois le proto à-peu-près au point, il fallait réaliser un circuit-imprimé, insérer et souder les éléments et tester le tout.
Avec la génération PIC, il suffit de
disposer d'une carte de base (circuit-imprimé) sur laquelle on a disposé le PIC
et les quelques composants les plus couramment utilisés par les applications: un
affichage, des switches, une entrée-sortie RS232 et autres selon ce qu'on
développe habituellement.
Le hardware peut donc être commun à plusieurs
applications et seul le logiciel mis dans le PIC différera une application d'une
autre. Avec cette façon de faire, on peut passer très rapidement de l'idée à la
réalisation puisqu'il suffit d'écrire du logiciel et de programmer le
PIC.
Le processus de fabrication d'une
application basée sur un PIC est donc le suivant:
-
Mise sur papier des idées
et préparation du logiciel sous forme d'ordinogramme (flow chart) ou autre.
-
A l'aide d'un éditeur
de texte intelligent, écriture du programme soit en assembleur soit
en basic (ou avec d'autres langages tel le C par exemple). On peut utiliser n'importe-quel
éditeur de texte comme par exemple le Bloc notes (Notepad) de Windows.
Cependant un éditeur dédié à la programmation de PIC dans le langage prévu
est plus confortable. Il reconnaît les fautes de frappe, ce qui évite les
erreurs grossières et facilite l'écriture des programmes.
Le langage de base du PIC et de tout microprocesseur est le langage machine.
Dans le cas des 3 processeurs étudiés ici, il s'agit de 35 instructions de
14 bits. Elles sont mises en mémoire une à une. A l'exécution du
programme, le processeur lit chaque case mémoire l'une après l'autre,
interprète chaque bit et exécute les actions demandées. Cette façon de faire
oblige le programmeur de coder à la main chaque instruction ce qui est très
fastidieux.

Fig 1
-
C'est ce que j'ai fait lorsque j'ai construit mon tout
premier ordinateur (ci-dessus) à partir de rien. Je le programmais en langage
machine à l'aide de switches installés sur le panneau avant de la machine.
Des LED (diodes électro-luminescentes) permettaient de lire les positions
mémoire. Tout cela parce que je devais bien avoir un premier moyen d'entrer
des instructions dans l'ordinateur. Cela m'a permis ensuite de développer le
logiciel permettant d'utiliser un clavier et un écran plutôt que des
switches et des led.
Maintenant plus personne n'utilise le langage machine, à part pour du dépannage.
J'ai moi-même dépanné des mini-ordinateurs pendant une dizaines d'années
uniquement avec leurs schémas et un oscilloscope. Il me fallait réaliser de
petites boucles de programme pour tester ou actionner telle ou telle partie
de l'ordinateur et j'en contrôlais le résultats avec l'oscilloscope. A cette
époque, les mini-ordinateurs étaient équipés de switches et de lampes
sur panneau avant pour pouvoir le faire. Avec ce genre d'expérience, c'est clair qu'un ordinateur n'a plus de secret pour
un
dépanneur !...
Actuellement on utilise plutôt un langage intermédiaire, l'assembleur,
qui se charge de composer les instructions à mettre en mémoire. Il suffit
d'écrire les actions à réaliser en langage clair, ce qui est bien plus
explicite, surtout à la lecture, qu'une suite de "0" et de "1". Le cours Bigonoff utilise ce langage de programmation.
Un langage encore plus évolué est le basic, qui est un niveau
au-dessus de l'assembleur. Ses instructions englobent plusieurs instruction
assembleur et sont bien plus puissantes. Avec lui, il n'est pas absolument
nécessaire de connaître à fond l'intimité du PIC, ce qui est indispensable
en assembleur. C'est le langage que nous allons utiliser par la suite.
-
Une fois le programme
écrit en basic à l'aide d'un éditeur (si possible intelligent afin qu'il
offre un peu de confort, par exemple qu'il reconnaisse si une instruction
comporte une faute de frappe), il faut le transformer en une série de
nombres hexadécimaux qu'utilisera le programmateur pour programme le
IC. C'est la procédure de compilation, faite par un logiciel qui
transforme le langage basic écrit avec l'éditeur en un fichier
reconnaissable par le PIC.
-
Il suffit ensuite de
mettre le circuit-intégré PIC sur le programmateur de PIC (sur un socle à
force d'insertion zéro) et d'initier la procédure de programmation du PIC.
-
Dernière opération,
remettre le PIC maintenant programmé sur son socle sur le circuit-imprimé
destinataire et tester l'application.
Matériel et logiciels utilisés
1. Pic
Les PIC à programmer sont le 16F84, l'ancêtre et le
16F628 ainsi que le 16F876, plus récents. Ce sont les PIC les plus populaires.
Leurs feuilles de caractéristiques (data sheet) sont
ici:
Voir aussi le
cours sur le 16F84 de F5AD.
Cette série est de la catégorie mid-range de
Microchip, avec 35 instructions RISC (nombre d'in struction réduit afin
d'augmenter la vitesse de travail). "L'ancêtre" est le 16F84 (18 pins), qui
convient encore parfaitement à beaucoup d'applications. Le 16F628 (18 pins) et
16F876 (28 pins) en sont des extensions, plus de pattes et plus de mémoire, mais
tous sont compatibles entre eux.
Les PIC peuvent monter jusqu'à 20MHz d'horloge (le suffixe "-XX"), celle-ci
étant ensuite divisée par 4. Ainsi, un chip à 20MHz pourra exécuter 5 millions
d'instructions par seconde (à part les sauts qui comportent plusieurs mots par
instruction), ce qui correspond à 5 MIPS, ce qui est excellent.
Chaque PIC comporte plusieurs types de mémoire et seuls ceux dont la mémoire
programme est en mémoire de type Flash (Le "F" du 16F84) peuvent être
programmés. Le 16F84 a 1k soit 1000 pas de mémoire de 14 bits pour le
programme, raison pour laquelle on voit 2 bytes pour chaque instruction dans le
programmateur. Il a également 64 bytes (=octets, 1 octet contient 8 bits)
de mémoire EEPROM (Electrical Erasable Programmable Read
Only Memory) dans lesquels le programme peut lire et écrire mais
qui ne s'effacent pas lorsqu'on coupe la tension du chip. Il a également de
68 bytes de RAM (Random Access Memory) pour y mettre
des données temporaires (qui s'effacent à chaque coupure de courant) ainsi que
d'autres cases mémoires utilisées comme registres pour les différentes fonctions
mais non directement utilisables par programmation.
A noter que les PIC sont statiques. Cela signifie qu'on peut abaisser leur
horloge sans problème, ce qui n'est pas le cas avec les chips dynamiques,
mémoires et processeurs, les Pentium par exemple, qui cessent alors de
fonctionner. Cette fonction de ralentissement est d'ailleurs intéressante car
elle permet de réaliser des applications qui consomment très peu de courant
(plus la vitesse d'exécution est élevée, plus la consommation est grande).
2. Editeur
C'est l'éditeur intelligent Code Designer Lite.
Il crée des fichier .PBP
Il est gratuit.
3. Compilateur basic
Le basic est le
PicBasic Pro Compiler de
MicroEngineering Labs Inc www.melabs.com.
Cet outil coûte 249,95 Dollars et peut se télécharger. Il permet de faire des
programmes pour la plupart des PIC du commerce.
4. Programmateur
Fig 2
C'est le kit Velleman K8076. Il se relie au
PC, sur le port série 1, à l'aide d'un câble série DB9 dont les fiches sont
livrées avec le kit (mais pas le câble 6 fils). Il est livré avec un mini CD
contenant le logiciel de programmation PicProg2006 qui tourne sans
problème sous Windows XP.
Il coûte moins de Fr. 100.- en Suisse.
J'ai inversé le sens sur socle à force d'insertion
zéro sur le print car la manette de blocage était peu pratique à manipuler.
Comme je l'ai monté, elle sort du print ce qui la rend nettement plus
accessible. Le PIC se place par contre comme prévu sur le plan de montage.
Il faut alimenter le programmateur par une
alimentation de 15 Volts/ 400 mA. Elle peut être non stabilisée.
Cycle de
programmation
-
Ecrire le programme en basic avec CDLite.
Sauvegarder le fichier en .BAS
-
Compiler ce fichier dans une fenêtre DOS avec
PBM. Sauvegardé en .HEX
-
Charger le fichier .HEX dans PicProg2006 et
programmer le PIC
Premier programme 1: LA LED CLIGNOTANTE
Schéma
On voit que le PIC a un oscillateur piloté par un
Quartz de 4 MHz, qu'il est alimenté en +5V, qu'une résistance exécute un reset
au démarrage sur la pin 4 et qu'une LED est connectée au port RA0.
J'ai monté ce petit schéma sur une plaque d'expérimentation.
Programme Basic
L'écrire avec le logiciel Code Designer Lite.
Le PIC 16F84 doit être sélectionné dans la fenêtre
Sauvegarder le programme dans le répertoire où se trouve le compilateur
PBP.EXE. Lui donner le nom de LED_VON.BAS.
' Michel Vonlanthen 2007
' Clignotement d'une LED
' Connectée au PORTB.0
' 1 fois par seconde
loop:
High PORTB.0 ' allume la LED
Pause 500
' attente 0.5 sec
Low PORTB.0 '
éteint la LED
Pause 500
' attente 0.5 sec
GoTo Loop
End |
Compilation Basic
Il faut que le programme PBP.EXE s'exécute automatiquement lorsqu'on double
clique sur un fichier .BAS. Pour ce faire, dans l'Explorer de Windows, option
Outils/Options des dossiers/Types de fichiers, il faut faire correspondre
l'extension .BAS au programme PBP.EXE.
Pour compiler un programme basic, il suffit de double-cliquer sur le fichier
LED_VON.BAS. Le compilateur PBP.EXE s'exécute alors
dans une fenêtre DOS. Un fichier LED_VON.HEX est
automatiquement créé dans le même répertoire.
Deux autres fichiers sont également générés par le compilateur:
- LED_VON.ASM l'équivalent en assembleur du
programme en basic
- LED_VON.MAC image au format Mac Intosh
Il ne servent à rien.
Programmation du PIC
Programmateur
-
Mettre le PIC à programmer sur le socle ZIF du
programmateur
-
Relier le programmateur au PC au moyen du câble
série DB9
-
Alimenter le programmateur en 15V.La led verte
doit s'allumer.
Logiciel PicProg2006
-
Sélectionner PIC16F et 16F84A dans les fenêtre
en haut à droite
-
Cliquer sur l'icône verte montrant un
circuit-imprimé tout en haut à droite. Le logiciel contrôle la présence du
programmateur et donne la position des fils jumpers correspondant au PIC
choisi. S'ils ne sont pas à la bonne place, déconnecter l'alimentation 15V
du programmateur avant de les déplacer.
Fig 3
-
Si le PIC n'est pas vide, tout remettre à zéro
au préalable
-
Charger le fichier
LED_VON.HEX (2ème icône depuis la gauche, en haut)
-
Programmer le PIC (4ème icône depuis la gauche).
La lampe rouge clignote un instant et s'éteint. Le PIC est programmé.
-
Couper la tension d'alimentation du
programmateur, enlever le PIC et le mettre sur le montage de test.

Fig 4
Test du montage
A la mise sous tension, la LED doit clignoter au
rythme de une fois par seconde.
2.
AFFICHAGE LCD

Schéma 2
Le circuit de base est toujours le même: le
16F84, l'alimentation, le master clear et le quartz. On y rajoute maintenant un
affichage LCD standard de 1 ligne de 16 caractères, ses 6 fils de liaison au PIC
et son potentiomètre de réglage du contraste de l'affichage. Sur le schéma
ci-dessus, on trouve également un interrupteur câblé sur la pin 6 du PIC, en
prévision de la prochaine commande à étudier, l'entrée de données par des
switches.

Fig 5: Câblage sur une plaque d'expérimentation
Le câblage de l'affichage LCD est déterminé par la command LCDOUT du
basic, avec ses valeurs par défaut. On peut utiliser n'importe-quelles pins pour
attaquer l'affichage mais il faut alors en donner l'équivalence avec des
commandes DEFINE. Nous ne le ferons pas pour ce premier exemple.
L'affichage doit être du type compatible avec le contrôleur d'affichage
intelligent Hitachi 44780 bien connu. On en trouve toutes sortes de modèles dans
le commerce, allant d'une ligne de 8 caractères à plusieurs lignes, mais
toujours des caractères alphanumériques, pas de graphique. On peut lui envoyer
des données soit en mode 8 bits, qui doivent toutes être envoyées par le même
port du PIC ou en mode 4 bits, plus flexible. C'est ce dernier qui est illustré
sur le schéma ci-dessus.
Sur l'affchage LCD, on a:
-
données = pins 11, 12, 13 et 14, envoyées depuis
les pins RA0, RA1, RA2 et RA3 du PIC
-
RS (Registre sélect) sur la pin 4, envoyée
depuis la pin RA4
-
R/W (Read/Write, lit/écrit) sur la pin 5 mis à
la masse ici car la commande LCDIN n'est pas utilisée dans ce premier
exemple
-
E (chip Enable) sur la pin 6 , envoyée par la
pin RB3 du PIC
La commande basic est LCDOUT, suivie des
données:
En principe, chaque envoi de texte aura la forme:
LCDOUT $FE,1, "Hello" soit
effacement du texte précédent et affichage de Hello |
Programme basic: Il est dérivé du
précédent. Il continue à allumer une LED mais en plus il affiche
alternativement "HB9AFO" et "Indicatif" sur l'écran LCD.
' Michel Vonlanthen 2007
' Clignotement d'une LED et afichage LCD
' Connectée au PORTB.0
' 1 fois par seconde
Loop:
High PORTB.0
' allume la LED
LCDOut $FE,1
' efface contenu LCD
LCDOut "HB9AFO"
Pause 1000
' attente 1 sec
Low PORTB.0
' éteint la LED
LCDOut $FE,1
' efface contenu LCD
LCDOut "Indicatif"
Pause 1000
' attente 1 sec
GoTo Loop
End |
3. LECTURE D'UN
BOUTON
Le schéma 2, ci-dessus, est utilisé. Il s'agit de
programmer l'action du poussoir S1. Nous allons programmer le PIC pour qu'une
pression sur S1 affiche "S1 pressé" sur l'affichage à cristaux liquides et "S1
off" lorsque S1 n'est pas pressé.
La commande de lecture d'un port est la suivante:
BUTTON pin, Down, Delay, Rate, bVar,
Action, Label |
Où |
|
Pin = |
Nom de la pin (ex: Port B.1), ou
variable ou constante |
Down = |
Etat de la pin lorsque le bouton est
pressé (0 ou 1) |
Delay =
|
Nombre de cycles avant
l''auto-répétition.
0 = pas de debounce ou d'auto-repeat
255 = debounce mais pas d'autorepeat |
Rate = |
Nombre d'auto-repeat (0..255) |
bVar =
|
Variable Bytenutilisée en interne
pour le décomptedu delay/repeat. Doit être initialisé à 0 avant
utilisation |
Action =
|
Etat du bouton à la pression (0 si
pas pressé, 1 si pressé) |
Label =
|
L'exécution du programme se poursuit
à ce label |
|
|
ex:
BUTTON PortB.1, 0, 100y, 10, B2, pressed, Pressed
Le programme va à "pressed" lorsque le bouton connecté au Port B.1
est pressé |
' Michel Vonlanthen 2007
' Lecture d'un poussoir (ou commutateur)
' Connectée au PORTB.1
Loop:
Low PORTB.0
' éteint la LED
LCDOut $FE,1 ' efface contenu LCD
LCDOut "S1 off"
' affiche "S1 off"
BUTTON PortB.1, 0, 100y, 10,
B2, pressed, Pressed ' Lecture bouton
GoTo Loop
Pressed:
High PORTB.0
' allume la LED
LCDOut $FE,1 ' efface contenu LCD
LCDOut "S1 pressé" ' affiche "S1 pressé"
GoTo Loop
End |
Application:
Mire couleur pour station ATV
Par HB9MPL, Carlo Luè
Cette série se poursuit avec l'
Arduino
Michel Vonlanthen Septembre 2007
|