Développer sur PICs

23 septembre 2012

 Développer sur PICs

 Introduction

Le but de cette série d’articles est de présenter une plateforme de développement relativement accessible. Seule la première étape nécessite un programmateur de PIC. Le reste ne demande que des composants standards peu onéreux. Afin de faciliter la re-programmation du microcontrôleur, nous lui installons un bootloader USB. Ceci limite grandement la gamme de PIC utilisable. Nous n’utilisons que des PIC 8bits USB, et même quasi uniquement des PIC 18F2550.

Cette solution est idéal pour un club de robotique. Une fois que le club a investi dans un programmateur de PIC (pour une petite vingtaine d’euro), chaque membre peut se construire sa plateforme de développement et la programmer chez lui.

Toute la chaine de développement, du flashage du microcontrôleur au logiciel d’interface avec le bootloader, en passant par les compilateurs, marche sous Windows. Il est tout à fait possible de travailler sous GNU/Linux sans impact sur le code.

Nous utilisons le programmateur de Lionel, décrit sur le site de Fribotte. Il s’agit d’un programmateur de la famille des JDM, cette information est utile pour la configuration du logiciel de flashage.

 Bootloader

Un bootloader est un petit programme mis dans la mémoire du PIC. Ce programme est exécuté à chaque démarrage du PIC. Si une certaine condition est remplie (bouton appuyé, lien série établie...) le bootloader entre en mode re-programmation. Il attend que le PC lui envoie le programme qu’il enregistrera dans la mémoire du PIC. Si la condition n’est pas remplie, le bootloader laisse s’exécuter normalement le programme du PIC.

Il est alors possible de reprogrammer un microcontrôleur sans programmateur. Cependant, un programmateur est toujours nécessaire au moins une fois pour envoyer le bootloader au microcontrôleur.

Nous utilisons MCHPUSB, un bootloader USB de Microchip qui n’est plus distribué dans la version que nous utilisons. Les nouvelles versions sont tout à fait fonctionnelles, elles sont un petit peu plus gourmandes en espace mémoire. Changer de version aurait un impact (bien que minimes) sur la compatibilité avec les codes déjà écrits. Nous avons préférer garder la vieille version.

Le bootloader se trouve dans le paquet "Microchip Application Libraries", dans le répertoire "USB/Device - Bootloaders/MCHPUSB".

Attention : Le code n’est pas écrit pour un PIC 18F2550, mais pour un PIC 18F4550. Il faut changer le modèle de microcontrôleur utilisé et surtout vider de leur contenu les fonctions faisant clignoter les LEDs. Si vous en oubliez une, pas de panique, vous le verrez à la compilation. Le PIC 18F4550 dispose d’un port D dont le PIC 18F2550 est dépourvu. Les LEDs que le bootloader veut faire clignoter sont censées être sur le port D, d’où l’erreur lors de la compilation.

 Montage minimal

Le montage minimal pour un PIC est très simple, mais il ne permet pas de faire grand-chose
avec ce PIC. Ce montage consiste à relier :

  • VDD au +5V
  • VSS à la masse
  • VDD et VSS par un condensateur 100 nF

Avec un tel montage, il faut bien configurer le PIC en lui indiquant :

  • Que la source de temps est interne
  • Que la fonction reset de la patte 1 du PIC soit désactivée (sans quoi le PIC risque de redémarrer sans arrêt)

Utiliser l’oscillateur interne du PIC impose une vitesse de fonctionnement lente et rend inutilisable le module USB qui nécessite une fréquence de 48 MHz obtenue par PLL (asservissement de phase)

La fonction reset du PIC est active par défaut, il serait dommage de se retrouver bloqué au début de la programmation à cause d’un PIC mal configuré. La fonction reset est aussi pratique pour redémarrer le PIC, activer le bootloader et ainsi reprogrammer la puce.

Ce n’est donc pas ce montage que nous utiliserons comme base. A ce montage, nous allons rajouter :

  • Le nécessaire pour l’USB (une source d’horloge externe et un condensateur)
  • Un bouton sur la patte reset
  • Un bouton sur la patte RB4 du PIC (pour activer le bootloader). Il est possible de mettre ce bouton sur une autre patte, il faut alors modifier très légèrement le bootloader et le recompiler.

Les boutons doivent être câblés de telle manière qu’à leur position de repos, il y ait du +5V au niveau de la patte du PIC. Un condensateur est mis en parallèle du bouton pour limiter les effets de rebond.

 Les logiciels

 Les logiciels (Windows)

WinPic800 permet de flasher le bootloader sur le PIC à l’aide du programmateur.

Développement : il faut installer la suite de développement de Microchip : MPLAB et le compilateur C de Microchip MCC18.

Microchip fournit PDSFUSB, un logiciel pour communiquer avec le bootloader.

Note : il existe un autre compilateur, développé par Hi Tech. Les notations pour accéder aux registres ne sont pas les mêmes, ce qui nuit à la compatibilité du code.

 Les logiciels (Linux)

Picprog : permet de flasher le bootloader. Il est disponible dans les dépots de certaines distributions. Il est téléchargeable ici

Pour le développement, l’idée est d’utiliser MCC18 de Micronchip avec Wine. Ce n’est pas une usine à gaz. Il faut passer un peu de temps pour se créer un Makefile et tout marche tout seul. Le Makefile permet de se créer une commande pour programmer le microcontrôleur et avoir ainsi compilation et programmation du microcontrôleur en une commande.

L’idée est de se crée un makefile qui contient toutes les informations concernant le compilateur et un makefile spécifique au projet qui appelle le premier (voir les exemples joints).
Pour la programmation du microcontrôleur avec le bootloader, il y a fsusb.

 Les fonctions du PIC

Vous avez votre schéma de base et vous voulez rajouter un bouton, un voyant, un capteur ou un actionneur ? Votre arme ultime sera la page 4 de la fiche technique du PIC, avec ses schémas intitulés "Pin diagrams".


Pin diagram

Comment ce schéma se lit-il ? Avec un lexique, ce n’est pas très compliqué. Chaque patte du PIC peut avoir plusieurs fonctions (à quelques exceptions près). Ces fonctions sont notées sur le schéma à côté de chaque patte du PIC.

  • RAx, RBx, RCx, RDx, REx (avec x variant entre 0 et 7) sont les entrées ou sorties standards. On peut forcer leur état (0V ou 5V) ou lire leur état (0 ou 1 en fonction de la tension). La lettre définit le port auquel elles sont rattachées. On en dispose à foison, ce sont celles qu’on attribue en dernier. Elles servent pour les capteurs tout ou rien ou pour la commande de servomoteurs.
  • ANx (avec x variant de 0 à 12) sont des entrées analogiques. Attention, il faut les utiliser dans l’ordre, si AN2 doit être une entrée analogie, AN1 et AN0 devront être des entrées analogiques. Voir le registre ADCON1 dans la fiche technique du PIC pour plus d’informations (une fois configurée en analogique, il est peut-être possible de se servir de la patte comme sortie binaire, mais ce n’est pas garanti).
  • Vref+ / Vref- peuvent servir de tension de référence pour l’acquisition analogique d’une tension
  • T0CKI / T13CKI (comprendre « Timer 0 ClocK In » ou Timer 1/3 ClocK In ») sont les entrées des compteurs 0 et 1 ou 3. Particulièrement utile pour les roues codeuses. On peut incrémenter un registre à chaque front montant reçu sur l’une de ces pattes. Voir les sections « Timer » de la fiche technique du PIC pour plus de détails.
  • Les pattes SPPx, CK1SPP, CK2SPP, OESPP, CSSPP sont le port parallèle du PIC. Je ne m’en suis jamais servi.
  • CCP1 / CCP2 (Capture, Compare, PWM).
    • PWM pour Pulse Width Modulation, en français, MLI : modulation de largeur d’impulsion. C’est ce qui sert pour moduler la vitesse d’un moteur se trouvant derrière un pont en H. N’importe laquelle des deux pattes CCP2 peut être utilisée, cela se configure. Les Pattes P1A/P1B/P1C/P1D peuvent servir aussi pour contrôler un moteur en MLI, mais une lecture au préalable de la documentation s’impose.
    • Capture permet de sauvegarder la valeur d’un timer (1 ou 3) dans un registre lors d’un front sur la patte CCPx.
    • Compare permet de déclencher une interruption et de changer l’état de la patte CCPx lorsque le timer 1 ou 3 atteint la valeur définie dans les registres CCPRx
  • KBIx (x variant de 0 à 3) : Interruption sur changement d’état. Utile pour mesurer le temps d’un échelon ou pour réagir rapidement à une information provenant d’un capteur.
  • INTx (x variant de 0 à 2) : Interruption sur front montant ou descendant.
  • SDO, SDI, SCK : module de communication SPI (jamais utilisé)
  • SCL, SDA : module de communication I2C (Respectivement "Serial CLock" et "Serial DAta"). Utile pour communiquer avec plusieurs périphériques.
  • RX, TX : module de communication série. Communication simple et efficace. Permet de dialoguer avec le PC, la CMUcam ou un autre PIC.
  • D+, ²D- : module USB

Commentaires

Il n'y a pas de commentaires

Ajouter un commentaire

Pseudo :
Mail :

Texte :

Copyright "POIVRON" 2011-2023, tous droits réservés
Administration du site