Logiciels > Electronique > Programmation PIC

Dernière mise à jour : 23/05/2021

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 520ST couplé au logiciel Pro24), j'avais la ferme intention de ne m'en servir que pour faire de la musique. Je me voyais mal faire autre chose avec cet ordinateur. De la programmation ? Jamais de la vie ! ce n'était pas du tout, mais alors pas du tout mon truc ! Puis, pour faire évoluer un peu mes séquences musicales MIDI, j'ai taté le montage audio. A ce moment-là, je disais encore que jamais je ne toucherai au montage vidéo. Promis, juré, craché, pas fait pour moi. Et pourtant quelques années après, je me suis mis à la programmation informatique et au montage vidéo. Hum...

Ce qui m'est arrivé pour les PIC était donc prévisible. Un peu d'électronique par-ci, un peu d'informatique par-là... J'ai fini par craquer et vouloir explorer de nouveaux outils de développement. C'est ainsi qu'en 2007 je me suis lancé dans la programmation des PIC. Bien entendu, comme je n'y connaissais rien et que je n'aime pas me fatiguer pour rien, j'ai cherché une solution qui réclamait le minimum de temps d'apprentissage. 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 (mon PicKit2 que j'avais aussi sous le coude a été sorti de son emballage des années après, quelle honte), mon compilateur MikroPascal (ce compilateur permet de créer le fichier binaire hex à partir d'un code écrit en langage Pascal, et je me sentais plus à l'aise avec ce langage). J'y suis allé un peu au pif en fin de compte, comme quand j'ai commencé avec Delphi 1 (langage Pascal également, pour du développement Windows).


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. 

On ne doit pas se tromper de cible et penser que le PIC est le composant idéal pour assurer des fonctions "trop simples", ou à l'inverse qu'il convient pour des fonctions 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 cela n'a pris que cinq 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), documents papier et CD. Les documents donnent immédiatement un 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 LED 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 microcontrôleur, il est automatiquement exécuté et je vois le résultat... Enfin je suis censé le voir. Ca bouge bien (les LED 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 LED "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 longuement 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 sait pas de quoi il s'agit, il y a de quoi se creuser des rides). Je ne m'en suis finalement 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 d'en 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 a comblé 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. Le fabricant a même eu l'idée 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 EasyPic 4 ne me sert plus beaucoup, elle pourra peut-être servir de secours un jour). 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 depuis 2 ans 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... Ce n'est qu'en 2021 que la démangeaison de réaliser un clone de PICkit2 est devenue insupportable :


pickit2-rm_001_proto_rm_001a

Mon clone de PICkit2, le PK2-RM


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 (trop) 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 (ah, cette manie de commencer avant de lire les manuels utilisateur).


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

Les modèles que j'ai privilégiés pour commencer 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)...
- 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é).
- 18F26K22 et 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 !
- 16F1826/1827 - Un remplaçant idéal du 16F628 : moins cher, plus puissant et même brochage.

Au 10/08/2014, je n'ai pas encore essayé le 16F870, allez donc savoir pourquoi (sans doute parce qu'il existe des centaines de modèles qu'on a pas le temps de tester). 

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/dsPIC

Le temps aidant, je me suis naturellement attelé aux PIC de la famille 24F et 24EP :

- 24F16KA101 et 24F16KA102 -
- 24F04KA200 -
- 24FJ32GA002 -
- 24FJ64GA002 -
- 24EP512GU810 - sur la platine "Mikromedia for PIC24EP", avec écran TFT et dalle tactile
- 33FJ128GP802 (dsPIC) -

Je me suis fait la main avec les 24F16KA102 et 24FJ32GA002, pour mes projets Interface DMX 003d et Métronome 008b. J'ai ensuite testé avec succès le 24EP512GU810 inclus sur la platine "Mikromedia for PIC24EP" (écran TFT et dalle tactile) pour mon indicateur de niveau batteries 008. J'avoue sans honte que je me serais bien emmêlé les pinceaux si j'avais tout de suite démarré avec des PIC24 sans passer avant par les "petits" 12F et 16F !


Et les PIC32...

Et que dire des PIC32 ! Ces coquins offrent des subtilités qui imposent pas mal d'heures de lecture (datasheet et autres sources de connaissances), et le simple portage sur un PIC32 d'un programme écrit pour un PIC18 peut vite devenir très rigolo. Le pas est franchi !

32MX170OP256B -
- 32MX250F128B -
- 32MX270F256B -
- 32MX534F064H -

Bien que possédant quelques PIC32 en boîtier DIL, j'ai réalisé mon premier montage fonctionnel avec un PIC 32MX534F064H soudé sur une platine "Mini-32" proposée par Mikroe (interface DMX 003e). Cette mini carte comporte deux rangées de contacts 20 points et se présente comme un boîtier DIL40 standard au pas de 2,54 mm (brochage ainsi obtenu "compatible" PIC 18F45xx).


mikroe_mini-32_pic32mx  interface_dmx_003e_proto_001b

Le PIC 32MX534F064H qui est un CMS y est soudé avec un connecteur USB et un régulateur de tension 3,3 V. Toutes les broches du PIC32 ne sont pas accessibles, mais pour se lancer dans l'aventure, ce petit bout de montage est très pratique (fait pour les débutants comme moi). Le PIC est préchargé avec un bootloader USB et peut être alimentée via USB, ce qui rend bien pratique sa première prise en main.

Et pour continuer l'aventure (août 2017), je me suis attaqué aux PIC suivants (QFP 64 broches) :

- 32MX575F512H
- 32MX795F512H

avec un petit CI adaptateur CMS "universel" pour le premier et une carte d'adaptation un peu plus évoluée pour le second (merci à Matthieu pour le soudage des CMS)... 


pic_mx32575f512h_proto_001a pic_mx32575f512h_proto_001c adaptateur_qfp50-64_dil64_001_proto_001d

Programmation avec MikroPascal Pro pour PIC32, et cette fois j'ai accès à toutes les broches des deux microcontrôleurs !

L'aventure a continué avec les PIC32, je me suis enfin décidé de faire le pas et de souder manuellement ces circuits de 1 cm de côté avec 16 broches espacées de 0,5 mm (projet Processeur MIDI 001) :

midi_processor_001_proto_rm_001b

Programmation en ICSP, cela va (presque) de soi...


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 programmateurs :

Nota 1 : mon expérience avec la première version du logiciel PICkit3 pour utiliser le programmateur PICkit3 en standalone (hors environnement MPLAB) s'est révélée catastrophique. Le seul moyen d'utiliser ce programmateur était de passer par le logiciel IPE (non IDE) de Microchip. A ce jour, je n'utilise mon PICkit3 qu'avec MPLAB IPE.

Merci de ne pas me demander si tel ou tel autre compilateur ou platine de programmation est "bien", je ne sais 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 bien sûr 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_mp_pic_couverture_001_tn Les microcontrôleurs PIC (avec MikroPascal) pour les débutants...
Entre "trop facile" et "trop dur"... le langage Pascal pour écrire des logiciels pour PIC

Paru le 16 décembre 2013 chez l'éditeur Publitronic / Elektor.


ISBN 978-2-86661-193-4

On ne sait jamais, ça peut 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