Comment programmer un PIC avec SDCC et Code::Blocks

Bonjour à toutes et à tous !

En attendant de pouvoir récupérer mon matériel pour la suite du projet de programmateur de PIC – et parce que je ne tiens plus en place tellement je suis impatient – j’ai décidé d’ouvrir une rubrique Tutoriels pour expliquer certaines choses pour lesquelles il est difficile de trouver des informations sur internet. Je commence donc cette rubrique avec un tutoriel pour expliquer comment programmer sur des microcontrôleurs PIC – de Microchip – avec le compilateur SDCC et l’environnement de développement Code::Blocks.

Pour commencer, je vais vous présenter un petit peu ce qu’est SDCC. C’est un compilateur libre développé pour programmer en C sur différents microcontrôleurs – on parle alors de compilateur multi-cibles. Il gère différentes familles de microcontrôleurs dont une courte liste est disponible en page d’accueil du site : SDCC – Small Device C Compiler.

Concernant la programmation sur cible PIC, celle-ci n’est pas totalement intégrée bien qu’il soit tout à fait possible de programmer des PIC avec. Il faut cependant, en plus du compilateur SDCC, utiliser une autre chaine de compilation – en assembleur cette fois – qui se nomme GPUTILS, pour GNU PIC Utilities. Rassurez-vous, vous ne serez pas obligés d’apprendre l’assembleur pour programmer sur des PIC. SDCC utilise simplement GPUTILS comme outil pour transformer son code compilé en un fichier HEX exécutable par le PIC.

Notez que SDCC, en complément de GPUTILS, est très certainement l’un des meilleurs compilateurs pour microcontrôleurs qui existent dans le domaine du logiciel libre.

Passons désormais à la problématique, où je vous explique le pourquoi de ce tutoriel. Code::Blocks intègre bien la notion de systèmes embarqués, et comprend même SDCC dans sa liste de compilateurs. Néanmoins, parmi les templates de projet disponibles, il n’en existe pas pour le développement sur PIC. Il existe bien quelques tutoriels sur internet pour utiliser SDCC avec Code::Blocks mais ceux-ci sont soit obsolètes soit erronés – c’est bien connu que ce qui se trouve sur internet ne fonctionne jamais comme on le souhaite. ;)

J’ai passé un long moment à chercher comment paramétrer Code::Blocks pour créer un template personnalisé de projet PIC et il s’est finalement avéré que la solution était assez simple.

Pour commencer, si ce n’est déjà fait, téléchargez et installez Code::Blocks, GPUTILS et SDCC sur leurs sites respectifs. Le site de SDCC recommande de télécharger une version snapshot si la dernière version stable disponible date de plus de deux mois. À l’heure où j’écris ces lignes, la dernière version date de Juillet 2012, mais pensez à vérifier régulièrement la sortie d’une nouvelle mise à jour – sachez qu’il sort quasiment un snapshot par jour pour SDCC voire plus.

Configuration de SDCC

Une fois que tout est installé, ouvrez le programme Code::Blocks et dès que celui-ci est démarré, allez dans « Settings » > « Compiler… ». La fenêtre de configuration des compilateurs s’affiche. En haut, sélectionnez dans la liste « SDCC Compiler ». Sélectionnez ensuite l’onglet « Toolchain executables » et appuyez sur le bouton « Auto-detect » pour que Code::Blocks détecte automatiquement l’emplacement du compilateur SDCC.

configsdcc01

Il nous reste une dernière chose à configurer avant la création d’un projet. Il faut que l’extension pour les fichiers sources compilés soit « .o » et non « .rel ». Faites défiler les onglets avec les flèches à droite jusqu’à voir apparaître l’onglet « Other Settings ». Là, cliquez sur le bouton « Advanced options… ».

configsdcc02

Une autre fenêtre s’ouvre alors. Sélectionnez l’onglet « Others » et vérifiez que la valeur pour « Object file extension » est bien une lettre ‘o’. Si ce n’est pas le cas, modifiez la valeur qui s’y trouve – « rel » – par la lettre ‘o’. Cliquez sur « OK » pour quitter la fenêtre des options avancées et encore sur « OK » pour quitter la configuration du compilateur.

configsdcc03

Créer un projet PIC

Maintenant que SDCC est bien configuré, passons à la création d’un projet. Pour cela, cliquez sur le bouton de la barre des tâches en haut à gauche et sélectionnez « Project… » dans la liste qui apparait. Dans la fenêtre de sélection du type de projet, choisissez « Empty Project » et cliquez sur « Go ».

newprj01

Saisissez le nom de votre projet et son emplacement sur votre disque, puis faites « Next ».

newprj02

Sélectionnez le compilateur « SDCC Compiler » et vérifiez que la case « Create Release configuration » est bien cochée – personnellement je n’utilise plus « Debug » – puis cliquez sur « Finish ».

newprj03

Votre projet est maintenant créé, mais avant de programmer, il reste encore quelques petites choses à régler.

Configurer le projet

Première chose, nous allons configurer le compilateur pour ce projet. Faites un clic-droit sur le projet dans la partie « Management » à gauche, et sélectionnez « Build options » dans la liste. Une fenêtre s’ouvre, sélectionnez le nom du projet dans la partie gauche de cette fenêtre. Dans la partie droite, sélectionnez l’onglet « Compiler settings » puis l’onglet « Compiler Flags ». Dans la liste des options de compilation, toutes les cases doivent être décochées, à l’exception de :

Be verbose [--verbose],

Output Intel Hex (default) [--out-fmt-ihx],

[CPU] Microchip PIC 14-bit[-mpic14] si vous utilisez un PIC10, PIC12, un PIC14 ou un PIC16,

OU

[CPU] PIC 16-bit[-mpic16] si vous utilisez un PIC18.

configprjbuild01

Sélectionnez maintenant l’onglet « Other options » et écrivez-y --use-non-free pour indiquer au compilateur qu’il doit chercher les entêtes correspondant aux PIC dans ses dossiers d’entêtes non libres, et -pxxxxxxx pour le microcontrôleur que vous utilisez – pour moi qui utilise un PIC18F2550, je saisis -p18f2550.

configprjbuild02

Cliquez maintenant sur « OK » pour valider les changements. Si une fenêtre vous demande de confirmer que vous voulez appliquer les changements, acceptez.

Il reste une dernière étape. Faites à nouveau un clic droit sur le nom du projet et sélectionnez cette fois « Properties… ». Dans la nouvelle fenêtre, sélectionnez l’onglet « Build targets ». Dans la partie droite, pour l’attribut « Type », sélectionnez « Native ». Plus bas, pour « Output filename », remplacez le « .sys » par « .hex », puis décochez les cases « Auto-generate filename prefix » et « Auto-generate filename extension ». Enfin, cliquez sur « OK » pour quitter la fenêtre.

configprjproperties

Créer un fichier

Votre projet est désormais prêt pour la programmation. Ce dernier aspect sera abordé plus en détails dans un autre tutoriel. En attendant, voici un petit programme basique pour vous donner un aperçu d’un fichier source en C pour microcontrôleur.

</p>

<blockquote><span style="color: #008000;">#define __18F2550</span>
<span style="color: #008000;"> #include &lt;pic18f2550.h&gt;</span>

<span style="color: #008000;">#pragma stack 0x200 100</span>

<span style="color: #ff00ff;">void</span> main(<span style="color: #ff00ff;">void</span>)
{
<p style="padding-left: 30px;"><span style="color: #ff00ff;">unsigned</span> <span style="color: #ff00ff;">int</span> i;</p>
<p style="padding-left: 30px;">TRISB = <span style="color: #ff00ff;">0</span>;</p>
<p style="padding-left: 30px;"><span style="color: #ff00ff;">while</span>(<span style="color: #ff00ff;">1</span>)
{</p>
<p style="padding-left: 60px;">PORTBbits.RB7 = <span style="color: #ff00ff;">1</span>;
<span style="color: #ff00ff;">for</span> (i = <span style="color: #ff00ff;">1</span>; i &lt; <span style="color: #ff00ff;">1000</span>; i++);
PORTBbits.RB7 = 0;
<span style="color: #ff00ff;">for</span> (i = <span style="color: #ff00ff;">1</span>; i &lt; <span style="color: #ff00ff;">1000</span>; i++);</p>
<p style="padding-left: 30px;">}</p>
}

Il faut bien évidemment adapter __18F2550 et pic18f2550 selon le modèle de PIC que vous utilisez. Ce programme se contente en fait de faire clignoter en boucle la LED qui se trouve en sortie de PORTBbits.RB7 – qui est l’adresse d’un port d’entrée/sortie du microcontrôleur vous l’aurez compris. Ça fait rêver, n’est-ce pas ? ;)

EDIT : En essayant de faire fonctionner ce programme avec un PIC16F690, j’ai eu la désagréable surprise de constater que PORTBbits.RB7 n’est pas reconnu. Pas de panique, il suffit d’enlever « PORTBbits. » avant RB7. En effet, avec SDCC, les entrées/sorties sont définies différemment des cibles PIC18F. Nous reviendrons sur la portabilité dans une leçon ultérieure.

Vous pouvez enregistrer ce projet comme template personnalisé pour ne plus avoir à tout reconfigurer. Pour cela, Allez dans le menu « File » et sélectionnez « Save project as template… ». Il ne vous reste plus qu’à nommer ce template et à cliquer sur « OK ». Désormais, lors de la création d’un projet, il vous suffira d’aller dans la catégorie « User templates » et de choisir le template pour pouvoir créer un projet sur le modèle de celui que vous venez de créer et de configurer.

Pour le reste, je vous encourage à lire la documentation du compilateur SDCC et celle du microcontrôleur que vous utilisez. Nul besoin de les connaître sur le bout des doigts, mais cela vous permettra de vous familiariser avec la structure des programmes que vous devrez écrire. C’est d’ailleurs comme ça pour tous les outils de développement que vous serez amenés à utiliser. ;)

Sur ce, je vous laisse et vous dis à bientôt.

Nicolas SAN AGUSTIN

Qu’est-ce qu’un système embarqué ?

« Système embarqué »

Vous vous demandez sûrement ce que cache cette expression.

Définition

Un système embarqué (ou système enfoui) est un système électronique programmé pour effectuer une tâche à laquelle il est dédié. Il peut s’agir, pour le grand public, d’un téléphone portable, une calculatrice, un GPS…

Calculatrice TI82
Cette calculatrice graphique a 20 ans, elle permet de faire beaucoup de choses, dont de la programmation en BASIC. Et elle fonctionne parfaitement ! Un vrai bonheur !

Il a la particularité d’être peu encombrant, économique en énergie et en coût. Il a cependant des performances limitées mais généralement suffisantes pour accomplir sa tâche. Cet aspect restreint se ressent également lors de son développement, car il faut prendre en compte les limites du système sur lequel on travaille pour éviter des catastrophes comme celle d’Ariane 5.

Pourquoi cet engouement ?

Pour la simple et bonne raison qu’il s’agit là d’un domaine en pleine expansion. Ils coûtent relativement peu chers en matériaux et consomment peu d’énergie. Il faut cependant noter qu’ils nécessitent un type de développement particulier.

Raspberry Pi
Le Raspberry Pi, un ordinateur de la taille d’une carte de crédit. Petit, relativement performant, consommant peu d’énergie, et surtout pas cher ($25 à $35). Une solution honorable pour apporter facilement une solution de développement de logiciel embarqué à moindre coût.

S’il vous vient d’autres questions concernant les systèmes embarqués, n’hésitez-pas à poster vos commentaires.

Qu’est-ce qu’un microcontrôleur ?

Définition

Un microcontrôleur est un composant électronique, que l’on peut qualifier de condensé de tout ce que contient un ordinateur. Un microcontrôleur intègre entre autres un processeur, une mémoire ROM pour stocker le programme, une mémoire RAM pour stocker les données temporaires et un certain nombre d’entrées/sorties (analogiques et numériques), dont certaines dédiées à des usages particuliers.

Microcontrôleurs PIC
Quatre microcontrôleurs PIC de familles différentes : 18F, 16F, 12F et 10F.

Quelle est la différence avec un microprocesseur ?

Hormis le fait qu’un microprocesseur fait lui-même partie d’un microcontrôleur, ce dernier permet une économie par rapport à la consommation électrique, l’encombrement et le coût d’un microprocesseur.

D’un autre côté, les processeurs seuls sont plus performants que les microcontrôleurs. Le choix d’utiliser l’un ou l’autre dépend grandement des besoins du système.

Un processeur Intel 80486DX2
Un processeur Intel 80486DX2

Quels sont les constructeurs de microcontrôleurs ?

Microchip propose des microcontrôleurs peu coûteux, suffisamment performants et polyvalents. Ils représentent une bonne solution pour les petites entreprises ou les indépendants disposant de peu de moyens.

Silicon Labs fournit des microcontrôleurs relativement coûteux mais performants dans le domaine de l’acquisition et le traitement numérique de signaux. Leurs microcontrôleurs, les C8051, sont basés sur les 8051 d’Intel, comme beaucoup d’autres familles de microcontrôleurs.

Il existe aussi Atmel, NXP (anciennement Philips), Freescale (anciennement Motorola), NEC, Cypress et leur PSoC (Programmable System on Chip).

Ce ne sont pas les constructeurs qui manquent, certains étant plus spécialisés que d’autres pour un domaine particulier. Le tout est de savoir ce que l’on veut pour son projet et de se renseigner en conséquence pour savoir quel matériel est le plus adapté.

Si vous avez d’autres questions, n’hésitez pas à me les poser dans les commentaires.

Copyright Nicolas SAN AGUSTIN 2018
Tech Nerd theme designed by Siteturner