Logiciels > Electronique > Programmation PIC

Dernière mise à jour : 21/04/2016

Livre PIC pour les débutants avec MikroPascal

Présentation

Le jour où j'ai acheté mon premier ordinateur et mon premier logiciel (un Atari 512 couplé au logiciel Pro24), j'avais la ferme intention de m'en servir pour faire de la musique. Je me voyais mal faire autre chose de cet ordinateur. La programmation ? Ca va pas, non ? Jamais de la vie, ce n'est pas du tout, mais alors pas du tout mon truc ! Puis pour faire suite aux séquences MIDI, je me suis taté au montage audio. A ce moment, je disais que je ne toucherai jamais au montage vidéo. Promis, juré, craché, pas fait pour moi. Et je me suis évidement mis à la programmation informatique et au montage vidéo. Hum...
Ce qui m'arrive donc maintenant devait arriver : un peu d'électronique par ci, un peu d'informatique par là... il a fallu que je craque et que je me commande de nouveaux outils de développement. Me voici donc lancé dans la programmation des PIC. Et bien entendu, comme je n'y connais rien et que je suis partisant du moindre effort, j'ai cherché une solution qui me demande moins de temps d'apprentissage pour commencer. Utopique ? Peut-on se lancer dans la programmation des PIC sans avoir à se dépatouiller dans les lignes de code en assembleur ? Voir même sans lire les fameux documents de BigOnOff ? Figurez-vous que j'avais envie de voir si cela était possible, et ai commencé tout doucement avec mon starterkit EasyPic4, (j'ai aussi un PicKit2 mais ne l'ai même pas encore déballé, quelle honte), mon compilateur MikroPascal (ce compilateur permet de générer le fichier binaire hex à partir d'un code écrit en langage Pascal, et je me sens plus à l'aise avec ce langage). Un peu à l'intuition, en somme, comme quand j'ai commencé avec Delphi 1 (langage Pascal également).

Que peut-on faire avec un PIC ?

Quand on parcours les forums de discussion techniques, de nombreuses questions de type "Comment faire clignoter une LED ?" amènent une réponse du type "tu n'as qu'à utiliser un PIC, c'est super simple" (je carricature, mais pas tant que ça). Je ne suis pas tout à fait d'accord, utiliser un PIC pour faire clignoter une LED n'est pas forcement la solution la plus simple, sauf bien sûr pour celui qui connait le PIC et qui est déjà équipé pour le programmer. Je ne parle pas de faire clignoter une LED pour s'initier au PIC, ce qui est totalement différent et chose pour laquelle je suis totalement pour, évidement (ça me semble même être un passage obligé, au même titre que le "Hello World" en développement ordinateur). Pour moi, il n'y a pas plus simple qu'un ou deux transistors, ou un NE555, pour faire clignoter une LED. Alors pourquoi dire que l'usage d'un PIC est très simple ? Parce que le nombre de composants nécessaires pour réaliser des fonctions complexes peut être extrêmement faible ? Peut-être, et dans ce cas, je ne contredirai personne. Mais pour comprendre comment fonctionne un PIC, il faut tout de même se documenter un peu. Et ce n'est pas moi qui conseillerai d'utiliser un PIC pour une fonction que l'on peut réaliser simplement avec quelques composants électroniques non programmables. Je pense que le PIC à sa place dans plein de domaines : jeux, utilitaires (alarmes, programmateurs divers), commandes séquentielle ou évenementielle, convertisseurs de formats de données, acquisition de données sur courte ou longue durée, transmission de données en s'appuyant sur des normes connues (RS232, MIDI, USB, Ethernet), etc. Et j'ai bien l'intention d'explorer tous ces domaines, car je suis loin d'être un expert dans ce domaine. Je pense qu'on ne doit pas se tromper de cible, et penser que le PIC est le composant qu'il faut pour assurer des fonctions "trop" simples", ou à l'inverse penser qu'il est le composant idéal pour assurer des fonctions extrêmement complexes que seul un DSP pourrait accomplir. Pour ma part, je me suis fait une petite idée de ce qu'on pouvait réaliser avec des PIC, en parcourant les sites de passionnés, oeuvrant dans les domaines de la musique, de la HF et de la mesure.

Alors, dis-nous...

Je ne vais pas vous mentir et vous dire que ma première expérience avec les PIC s'est déroulée sans aucun problème, ce serait faux. Mais tout de même, j'ai écrit, compilé et flashé (envoyé dans le PIC) mon premier programme, en 1h30 clé en main à partir de la réception du colis par la poste.

Première expérience, nous sommes en 2007
9h00 - Driiing, c'est le facteur ! Je fais un sourire et dis bonjour, je signe, je dis au revoir, et je fonce à la cuisine pour déballer le paquet. Tout ceci a du me prendre cinq bonnes secondes.
9h02 - Je contrôle le contenu du pack, qui contient la platine EasyPic4, le compilateur MikroPascal, les deux afficheurs LCD (LCD 2x16 et LCD graphique), docs et CD. Les docs donnent immédiatement un très bonne impression de qualité et de sérieux.
9h20 - Je me fais un café et lis les docs d'installation pour le matériel et les logiciels / drivers USB.
9h30 - Je branche une alim externe sur ma platine EasyPic4 après positionnement adéquat du cavalier d'alim. La platine s'allume et en plus il y a activité des leds et afficheurs, donc côté initialisation et horloge, ça semble correctement tourner.
9h35 - J'installe PicFlash et les drivers non pas comme indiqué dans le doc d'install, puisque les répertoires du CD spécifiés pour les programmes d'installation n'existent pas. Pénible mais pas insurmontable, il suffit de parcourir le CD pour trouver le bon emplacement. L'enquiquinant étant que quand on rencontre ce type de problème dès la procédure d'installation, ça fait un peu peur par la suite. Le vendeur (Lextronic) m'avait annoncé que je pouvais rencontrer des problèmes d'installation avec WinXP Pro (refus d'installation du driver), ça n'a pas été le cas sur ma machine.
9h55 - J'installe le compilateur MikroPascal pour Pic, qui me force, le coquin, à installer PicFlash qui a été installé juste avant. Je ne peux pas désactiver cette option d'installation, je continue donc contraint et forcé, en me demandant évidement si cela ne va pas causer des soucis coté drivers. Par acquis de conscience, je compare la version du driver déjà installé avec celle du driver qu'on me force à installer : V7.03 dans les deux cas, ça me rassure un peu, alors je continue.
10h00 - Je lance le logiciel PicFlash afin de voir si connection avec la platine de développement il y a, et je fais un rapide tour des fonctionnalités. Ca roule, le contact est bien établi entre matériel et logiciel.
10h10 - Je lance MikroPascal, car mon envie de taper des lignes de code en Pascal est devenue insupportable. Puis je lis et exécute les instructions données dans le document papier appelé "Je crée mon premier projet dans MikroPascal" (bonne idée de l'avoir mis sous forme papier dans la boite). Ca me rappelle mon premier projet avec Delphi, avec le célèbre "Hello World". J'écris mon premier programme en toutes lettres (je ne charge pas un programme d'exemple tout fait), le compile (je corrige une faute et je recommence), et l'envoie dans le PIC. Une fois le programme chargé dans le PIC, il est automatiquement exécuté et je vois le résultat... Enfin je suis censé le voir. Ca bouge bien (les leds qui doivent clignoter clignotent) mais ça fait la même chose qu'avant la programmation du PIC. Deux solutions : soit ce que j'ai fait n'a pas fonctionné, soit le PIC était déjà programmé avec leur projet d'exemple et le résultat visuel est le même avant et après mes opérations. Pour en avoir le coeur net, je change donc quelques paramètres dans mon code pascal (ports différents, durées d'allumage différentes) et recompile le tout. Après transfert du fichier binaire dans le PIC, les leds "suivent" les modifications apportées. Tout cela fonctionne donc bien et il est 10h30.

logiciels_pics_easypic4

Je suis vraiment impressionné, car avant d'acheter cet ensemble, je m'étais pas mal documenté, et avait lu plein de choses concernant les "bootloader" qui me faisaient un peu peur (bah oui, quand un terme revient souvent et qu'on ne connait pas le domaine, on ne sait pas dans l'immédiat si on risque d'être concerné). Je ne m'en suis pas préoccupé, me disant que si j'avais un soucis avec ça, je trouverais de quoi m'en sortir en farfouillant dans la toile. Bien sûr, vous allez me dire que le programme simple fourni en exemple ne pouvait que fonctionner, et qu'à partir de maintenant, les choses vont se corser. Et alors, même si c'est le cas, ça donne envie de continuer, vous ne pensez pas ?

Suite de l'expérience, nous sommes en 2012
Que le temps passe vite ! Ma EasyPic4 fonctionne encore parfaitement, même si on tente de me faire croire qu'elle est démodée.

logiciels_pics_easypic4_001b

Certes, avec le temps, je me rend compte que cette platine de développement aurait eu avantage à bénéficer de deux ou trois petits ajustements pour la rendre encore plus pratique. Mais je n'oublie pas que je la trouvais (et que je la trouve encore) géniale. Savez-vous qu'en 2012 nous en somme à la EasyPic7 ? Eh bien, je me suis mis à jour.

logiciels_pics_easypic7_001

Trois générations de carte ont passé, et les petits ajustements que j'aurais trouvés utiles sur la EasyPic4 se retrouvent finalement sur la EasyPic7. Mais de quels ajustements parle donc Rémy ? Oh, rien qui vaille la peine de faire la une des journaux. Mais quand on ne se contente pas d'utiliser la carte pour y flasher un PIC qu'on retire aussitôt de son support (ce serait du luxe de se cantonner à cette unique fonction de programmation avec ce genre de platine), les petites subtilités deviennent de grands atouts. Comme vous le savez peut-être maintenant, on peut utiliser les lignes d'un port de PIC en entrée ou en sortie. Quand on l'utilise en entrée et surtout avec des boutons poussoir, on peut avoir besoin d'ajouter ce qu'on appelle des résistances de rappel qui fixent le potentiel au repos, soit au +V, soit à la masse. Sur la EasyPic4, on peut placer des résistances de rappel sur un port grâce à un petit cavalier, mais on ne peut pas le faire de façon individuelle : soit ces résistances sont câblées sur l'ensemble des lignes du même port, soit elles sont déconnectées. C'est embêtant si on veut en même temps disposer de lignes qui présentent un potentiel positif au repos et de lignes qui présentent un potentiel nul au repos. Contourner ce petit manque ne m'a jamais posé de problème, car la plupart du temps j'utilise la EasyPic avec une platine sans soudure, sur laquelle je mets ce que je veux pour n'importe quel port. La EasyPic7 comble ce manque de façon simple : on dispose maintenant d'un interrupteur à trois positions pour chaque ligne de chaque port, qui permet de porter ces lignes au potentiel désiré, et ce de façon totalement indépendante. Je vous assure qu'il ne s'agit pas d'un gadget ! Je ne vais pas développer ici la liste des ajouts ou améliorations apportés par la carte EasyPic7, ce n'est pas le but de cet article. Je souhaite juste ajouter que je travaille maintenant avec cette nouvelle platine de développement et que le fabricant a vraiment fait très fort. Il a même eu l'idée absolument géniale de fournir le schéma de la carte en ajoutant dessus des photos qui montrent à quoi ressemblent les symboles des composants utilisés. Très nettement, il ne pense pas qu'aux pros.

Le temps passe, 2013...
J'aime beaucoup mes platines EasyPic 4 et 7 (j'avoue que la 4 ne me sert plus beaucoup, elle est en secours). Mais il m'arrive si souvent de devoir programmer un PIC avec un fichier hex tout prêt qu'il me manquait ce petit accessoire bien pratique que constitue un programmateur miniature et donc portable. J'ai donc décidé d'utiliser le PICkit2 qui dormait dans une enveloppe à bulles (sic) et l'ai également rapidement adopté.

microchip_pickit2_001a

J'en suis arrivé au point de développer deux applis en même temps (quand elles communiquent entre elles, c'est bien pratique !) avec d'un côté ma EasyPIC et de l'autre mon PICkit2. Au fil du temps j'ai aussi appris à aimer le mode de programmation "in-situ", si pratique quand on ne veut pas déplacer sans arrêt le PIC en cours de développement. Bref, avec mes deux programmateurs, je suis très content, le plus gros me sert quand il faut peaufiner autour du PIC, le plus petit me sert quand je suis en déplacement ou sur un coin de table encombré de maquettes électroniques...

Le temps ne s'arrête pas... 2015
Oui, bien heureux j'étais avec mes programmateurs EasyPic7 et PICkit2. Mais comme vous le savez, et même si au fond de mon âme je ne suis pas matérialiste, il me fallait un nouveau programmateur facile à transporter et apte à faire du débogage matériel. Mon choix s'est porté sur le programmateur MikroProg :

mikroe_mikroprog_001a

Ce dernier dispose d'un connecteur 10 points qui permet de "l'insérer" dans un circuit existant, avec la possibilité de libérer les lignes de programmation ICSP (PGC, PGD et MCLR) en période d'inactivité. Cette particularité permet plus de souplesse avec les broches dédiées programmation, quand on veut les utiliser "à fond", c'est à dire en temps que ligne d'entrée/sortie quand le circuit travaille de façon nominale (hors étape de programmation). J'avoue avoir eu quelques difficultés à le faire fonctionner correctement au début (il est plus chatouilleux que le PICkit2) mais en respectant à la lettre les indications données dans le manuel utilisateur, tout est OK.

PICs que j'ai choisis pour apprendre

Dans les forêts de composants qui nous entourent, difficile de faire son choix, en tout cas quand on est débutant. Vouloir attaquer de front plusieurs types de PIC en même temps me semblait un peu cavalier, et j'ai donc tout naturellement fait mes premiers pas avec le 16F84 et le 16F877, qui étaient tous deux livrés avec la platine EasyPic4. Rien qu'avec ces deux là, il y avait déjà de quoi manger. Puis au hasard de mes ballades sur la toile, j'ai appris que le 16F84 était dépassé et qu'il vallait mieux désormais lui préférer les 16F628A ou 16F648A, plus performants et moins chers. Je m'y suis donc attelé.

pic_16f648_001a

Autre modèle qui m'a interressé assez rapidement, le 12F675, pour ses entrées analogiques (je le sentais bien pour un usage en vumètre stéréo ou en indicateur de tension). Puis je me suis aussi un peu penché sur le 18F2520, et je suis bien persuadé qu'au fil du temps, d'autres modèles vont s'imposer tout naturellement à moi, surtout dans la série des 16F "mid-range" ou 18F.

On commence avec les "petits" PIC 12F, 16F et 18F...
Pour l'heure (les choses vont si vite !) les modèles que j'ai privilégiés sont les suivants :
- 12F675 - Pour ses dimensions physiques réduites (8 pattes), son CAN 10 bits.
- 16F88 - Pour son faible coût, son CAN 10 bits, son USART.
- 16F627A - Reconnu comme étant idéal pour des petits projets.
- 16F628A ou 16F648A - Pour son faible coût, son USART (RS232, MIDI), mais pas de CAN...
- 16F690 - Mine de rien, lui aussi permet de bien bosser pour pas cher !
- 16F886 - Pour son faible coût, son CAN 10 bits, son USART, plus de lignes d'E/S que le 16F88.
- 18F2420/2520 - Pour son CAN 10 bits, son USART, son module MSSP (I2C) son générateur PWM évolué, son horloge 32 MHz interne (mais prix plus élevé).
- 18F45K22 - Difficile de tout lister tellement il y en a ! Tout ce qui est décrit ci-avant, avec en plus un module MCCU qui permet de nouvelles choses...
- 18F2550 et 18F4550 - Plein de choses aussi avec ces deux-là, mais surtout... un module USB intégré.
- 16F1705 - Un petit bijoux pour 1 euro ! CAN et DAC, oscillateur interne de 32 MHz, il y a de quoi faire !
Au 10/08/2014, je n'ai pas encore essayé le 16F870, allez donc savoir pourquoi. Oh, un détail : s'il est sympa de disposer de quelques PIC pour se faire la main, il l'est tout autant d'avoir un petit stock de quartz de valeurs différentes. Je dispose pour mes divers bricolages de quartz 32,768 kHz, 4 MHz, 4,096 MHz, 4,194304 MHz, 8 MHz, 8,192 MHz, 10 MHz, 10,240 MHz, 12 MHz, 16 MHz et 20 MHz, auxquels s'additionnent quelques oscillateurs à quartz intégrés de 8,192 MHz, 12,288 MHz, 16 MHz, 27 MHz et 40,960 MHz. Ces oscillateurs intégrés me servent parfois de source d'horloge pour le PIC, mais leur principal usage reside dans la mise en place rapide d'une fréquence de référence stable, pratique pour les systèmes de mesure de fréquence ou de temps.

On continue avec les PIC24
Le temps aidant, je me suis naturellement aussi attelé aux PIC de la famille 24F et 24EP. Je me suis ainsi fait la main avec les 24F16KA102 et 24FJ32GA002, pour mes projets Interface DMX 003d et Métronome 008b. J'ai ensuite effectués quelques tests (positifs) avec le 24EP512GU810 inclus sur la platine "Mikromedia for PIC24EP" (écran TFT et dalle tactile). J'avoue sans honte que je me serais bien emmêlé les pinceaux si j'avais tout de suite démarré avec des PIC24 !

Et les PIC32 ?
Je possède déjà dans mon stock, un PIC 32MX534F064H sur une petite platine "Mini32 board" avec connecteurs au pas de 2,54 mm. Mais chaque chose en son temps ;-)

Choix du programmateur

Même si Arduino et Raspberry ont le vent en poupe, vous êtes encore nombreux à vouloir débuter avec les PICs et à me demander conseil pour le choix d'un programmateur. Je ne suis malheureusement pas très bien placé pour donner des conseils objectifs. Ceci dit je peux parler un peu des outils que j'utilise et qui fonctionnent bien. Au départ j'ai choisi la platine de développement EasyPic parce qu'elle était disponible avec le logiciel MikroPascal, et parce que le langage Pascal était le seul avec lequel je me sentais à l'aise. De plus, le simple fait de trouver un compilateur venant du même éditeur que celui produisant la carte de dévelopement (MikroE) me mettait en confiance. Oui, j'y suis allé au hasard et mon choix m'a satisfait, je peux vraiment l'affirmer après avoir laissé pas mal de bidouilles derrière moi. Je constate que le support après vente de MikroPascal est excellent, leur forum est très actif et l'équipe de développement fait preuve d'une véritable écoute envers les utilisateurs. C'est important pour un produit qui doit évoluer avec l'arrivé de nouveaux composants programmables. J'ai aussi fait acheter une platine à mon ancien travail (c'était une EasyPic6) pour des besoins assez sérieux dans le domaine de la TV numérique. Mes (anciens) collègues ont été épatés de la rapidité avec laquelle on pouvait développer une application PIC. Je suis ensuite passé à la EasyPic7, et en parallèle j'utilise un programmateur Microchip PICKit2, pour les programmations en mode ICSP (composant programmable en place dans le circuit cible, liaison avec un câble 4 ou 5 conducteurs). Cette interface fonctionne très bien aussi ! Depuis 2015, j'utilise également le programmateur MikroProg de MikroE. Pour faire simple, voici comment j'utilise mes trois programmateurs :
Nota 1 : autant j'appércie le PICkit2, autant je suis à la limite de considérer comme une vraie catastrophe les logiciels mis à disposition pour utiliser le PICkit3 en standalone, hors environnement MPLAB ! Même avec l'outil IPE (non IDE) de Microchip, j'ai eu un mal fou à tirer profit du PICkit3. Un coup ça marche, un coup ça marche pas, comme dirait Pease. Le PICkit3 est reconnu par le logiciel IPE quand il le veut bien (il faut souvent débrancher le PICkit3 du port USB et le rebrancher) et quand il est reconnu (lecture effective de son numéro de série) j'ai droit une fois sur deux à un échec de connexion quand je tente d'envoyer le fichier hex au PIC (bien sûr avec les mêmes pratiques que celles utilisées avec mon PICkit2 qui lui ne m'embête pas). Je me demande vraiment si on peut conseiller le PICkit3 aux débutants !
Merci de ne pas me demander si tel ou tel autre compilateur ou autre platine de programmation est bien, je ne saurais absolument pas répondre.

Sources pour PIC

Mes réalisations mettent en oeuvre des pics "classiques", tels les 12F675, 16F84A, 16F628A, 16F877, 18F2520, 18F4520, 18F45K22. Comme ce que j'ai appris (et apprend toujours) au niveau codage vient en majeure partie des questions / réponses lues à gauche et à droite sur les forums utilisateurs, je ne vois aucune raison de ne pas mettre à disposition mes codes sources (à l'exclusion des projets professionnels réalisés sur demande).
Voir page Programmation PIC - Sources.

Quelques exemples pratiques pour démarrer

Je me suis décidé à écrire quelques lignes de code pour exemples simples d'applications, à destination des débutants. Voyez ça comme des tutoriels, qui expliquent les bases de la programmation des PIC avec MikroPascal, et qui permettent de s'aventurer dans le monde de la lecture de CAN, des liaisons I2C / SPI ou de l'écriture / lecture de mémoire externes. Voir page PIC - Bases pour présentation et conventions, et page PIC - Bases - Exemples MikroPascal pour plonger directement dans le sujet.

Ca ne m'a pas l'air si simple...

Ca ne l'était pas pour moi au début, car je n'arrivais pas facilement à combiner les différentes infos que je trouvais ici et là. Pour ceux qui se trouveraient dans la même situation que moi, j'ai écrit une petite page où j'explique ma façon d'aborder mes développements électroniques qui intègrent des PICs, à la page Electronique - Développements. Et puis tiens, pendant qu'on y est, un petit livre pour les débutants...

livre_pic_mp_couverture

On ne sait jamais, ça peut vous donner des idées ;-)

Service gratuit de programmation de PIC

Quand on débute, il est parfois difficile de se lancer, surtout si le montage qu'on veut réaliser comporte un PIC et qu'on n'a pas encore de programmateur. Pour cette raison, j'accèpte à titre gracieux de programmer votre PIC.
Programmation gratuite de PIC