Programmer un PIC18F à partir d’un Raspberry Pi

30 janvier 2022

Notre robot est programmé sur 2 microcontrôleurs. L’un gère les moteurs et le positionnement, l’autre, un PIC18F4550 gère le reste, dont la stratégie. C’est sur ce dernier que se concentre les modifications de code.

L’un de nos objectifs est de pouvoir programmer ce robot à distance, principalement le PIC18F4550. C’est maintenant chose possible, mais le chemin ne fut pas simple.

 Le bootloader historique

Nous utilisions le bootloader USB de Microchip, probablement développé à l’origine pour leur carte PICDEM. Le code côté PIC était écrit pour MCC18, le compilateur C pour PIC de Microchip. Ce compilateur n’est plus distribué. Le portage du code vers leur nouveau compilateur n’était pas trivial, à cause des différences dans gestion de la mémoire. Nous avions bien un fichier compilé qui traînait sur le disque en cas de besoin, mais le moindre changement dans la configuration matériel (fréquence d’horloge, pin alternatives pour certaines fonctions) demande d’éditer l’hexadécimal directement.

Côté PC, la situation n’était pas vraiment meilleure. Microchip n’avait qu’un exécutable pour Windows XP. Sur les versions plus récentes de Windows, l’utilisation du bootloader nécessite un pilote. Sous Linux, on trouvait quelque part sur internet un programme fsusb qui permettait de communiquer avec le bootloader.

Bref la solution ne semblait pas pérenne.

 Le bootloader HID/USB

Sans rentrer dans les détails, sachez que l’USB fonctionne par classe. Tant que vous restez dans le fonctionnement de l’une des classes standard définie dans la norme, votre périphérique ne nécessite pas de pilote particulier. Oui, Windows fait semblant d’installer un pilote quand vous branchez une clé USB...

Donc voilà que nous trouvons ce bootloader HID/USB fourni par Microchip, dans leur "Microchip Librairie Application". Ce bootloader est sous licence "Apache 2", donc libre. Ce code ne compilait plus avec les dernières version du compilateur de Microchip xc8. Mais l’incompatibilité vient de la manière d’insérer de l’assembleur dans le code C. A une erreur près qui nous a fait transpirer plusieurs jours, ce n’était pas trop compliqué. Le code est sur notre dépot Github : HID_PIC18F_Bootloader.

Côté PC, nous utilisons mphidflash, un logiciel libre, GPLv3.

 Le Raspberry Pi

Notre carte, dès le départ, a été conçue pour s’interfacer avec un Rasbperry Pi. Les signaux RX et TX du PIC sont reliés à ceux du Raspberri Pi, les boutons Boot et Reset peuvent être activés par le Raspberry Pi. Les premiers essais sont infructueux. Le PIC ne fonctionne pas lorsque le Raspberry Pi est branché. Nous pensons à un problème dû à la manière donc le Raspberry Pi pilote en direct les boutons Boot et Reset.

Nous rajoutons une mini carte d’interface, pour activer les fonctions Boot et Reset à travers des transistors. Le problème perdure. Mais avec cette carte interface, nous pouvons observer ce qui se passe. Le signal Reset est à l’état haut. Une recherche nous indique que le Raspberri Pi Zero est basé sur la puce BCM2835. En ouvrant la fiche technique du BCM2835, page 102, nous observons qu’une résistance de pull-up est présente pour les sorties GPIO0 à GPIO8, désactivant notre PIC. En nous aidant du brochage fourni par pinout.xyz nous choisissons les GPIO17 et 27. Nous créons deux scripts pour activer ou désactiver le bootloader.

bootloader_mode.py from gpiozero import LED from time import sleep reset = LED(17) bootloader = LED(27) reset.on() bootloader.on() sleep(0.1) reset.off() sleep(1) bootloader.off()

user_mode.py from gpiozero import LED from time import sleep reset = LED(17) bootloader = LED(27) reset.on() bootloader.off() sleep(1) reset.off() sleep(1)

Rien de sorcier, il faut juste réaliser que les broches ne sont contrôlées que le temps de l’exécution du programme et reprennent leur configuration par défaut à la fin du programme.

Utilisant un Raspberry Pi Zero, nous achetons un câble USB OTG. Micro USB-B vers USB A femelle auquel nous branchons notre câble habituel.

Le RPi reconnaît le PIC quand le bootloader est activé. Plus qu’à faire marcher mphidflash sur le RPi. Nous choisissons de faire de la compilation croisée et de générer notre exécutable sur le PC. Pour plus de détail sur la manipulation, lisez le README de notre dépot Github : mphidflash !

 Et voila !

Pour l’instant, c’est encore très manuel : l’intégration de tout ça dans notre Makefile sera pour bientôt, c’est sûr ! Ce sont 4 commandes à exécuter :

1. Copier le fichier .hex sur le robot
2. Activer le mode bootloader
3. Programmer le PIC avec mphidflash
4. Désactiver le bootloader.

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