Accueil

LE PIC PAR LA PRATIQUE

Par Michel Vonlanthen
 


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

  1. Ecrire le programme en basic avec CDLite. Sauvegarder le fichier en .BAS

  2. Compiler ce fichier dans une fenêtre DOS avec PBM. Sauvegardé en .HEX

  3. Charger le fichier .HEX dans PicProg2006 et programmer le PIC

 



Premier programme 1: LA LED CLIGNOTANTE


Schéma
 

 

Schéma 1

 

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

  1. Mettre le PIC à programmer sur le socle ZIF du programmateur

  2. Relier le programmateur au PC au moyen du câble série DB9

  3. Alimenter le programmateur en 15V.La led verte doit s'allumer.

Logiciel PicProg2006

  1. Sélectionner PIC16F et 16F84A dans les fenêtre en haut à droite

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

  3. Si le PIC n'est pas vide, tout remettre à zéro au préalable
     

  4. Charger le fichier LED_VON.HEX (2ème icône depuis la gauche, en haut)

  5. Programmer le PIC (4ème icône depuis la gauche). La lampe rouge clignote un instant et s'éteint. Le PIC est programmé.

  6. 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:

  • LCDOUT $FE,1    = effacement du display

  • LCDOUT "texte"   = affichage du mot "texte" sur l'affichage

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

 

 
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