PIC & dsPIC firmware (MPLAB X + XC + MCC ; PICkit / Snap / ICD)

Firmware pour Microchip PIC et dsPIC avec MPLAB X IDE, compilateurs XC8 / XC16 / XC-DSC / XC32 et MPLAB Code Configurator (MCC Melody/Classic) pour les familles PIC16, PIC18, PIC24, dsPIC33 (F/EP/EV/CK/CH dual-core/A) et PIC32.

Qu'est-ce que Snap / ICD) ?

Cette compétence est dédiée au développement de firmware pour les microcontrôleurs Microchip PIC et dsPIC, couvrant les familles PIC16, PIC18, PIC24, dsPIC33 (F/EP/EV/CK/CH dual-core/A) et PIC32. Elle intègre les outils MPLAB X IDE, les compilateurs XC8, XC16, XC-DSC et XC32, ainsi que MPLAB Code Configurator (MCC) en version Melody ou Classique. Le prompt détaille les règles essentielles pour éviter les échecs classiques : configuration des bits de configuration (oscillateur, watchdog, MCLR, LVP, protection), gestion des entrées analogiques (ANSEL), utilisation correcte de LAT/PORT/TRIS, mappage des signaux via PPS, atomicité des accès 8/16/32 bits, et pile d'appel limitée sur les 8 bits. Pour les dsPIC33, il ajoute des spécificités comme le moteur DSP en Q15, les boucles de contrôle PWM/ADC, le dual-core CH et les pièges mathématiques. La compétence fournit également des instructions pour les builds headless, la programmation avec PICkit 4/5, MPLAB Snap et ICD (ipecmd), ainsi que le débogage. Elle référence trois fichiers d'appoint (familles, dsPIC33, MCC/projet, build/programmation/débogage) pour approfondir chaque domaine. Utilisez-la dès que l'utilisateur mentionne un PIC ou dsPIC, MPLAB X, MCC, XC8/XC16/XC-DSC/XC32, PICkit, Snap, ICD, `#pragma config`, motorBench, ou un dossier .X.

Compatible avec~Claude Code~Codex CLI~Cursor
npx skills add https://github.com/budenga/firmware-skills/tree/HEAD/skills/pic-firmware

Installed? Explore more Productivité et collaboration skills: steipete/gemini, steipete/gh-issues, steipete/skill-creator · View all 6 →

Demander à votre IA préférée

Ouvre une nouvelle conversation avec cette compétence d'agent déjà préchargée.

Documentation

Firmware PIC & dsPIC (MPLAB X + XC + MCC ; PICkit / Snap / ICD)

Chargez aussi embedded-c-cpp pour les standards de codage, l'architecture, les tests unitaires et le débogage général. Cette compétence contient les parties spécifiques à Microchip. Le firmware PIC s'écrit en C (XC8 n'a pas de C++).

D'abord, identifier le projet

ÉlémentOù le trouverPourquoi c'est important
Composant exact (PIC16F18877, PIC18F47Q10, PIC24FJ128GA010, dsPIC33CK256MP508, PIC32MX795F512L...)nbproject/configurations.xml (<targetDevice>), MCC .mc3, utilisateurRegistres, périphériques, PPS, modèle d'interruption, mémoire diffèrent selon le composant — sur dsPIC33 les familles F, E, C et A ont des modules PWM/ADC/PLL différents
Compilateur + versionconfigurations.xml (<languageToolchain>, <languageToolchainVersion>)XC8 vs XC16 vs XC-DSC (dsPIC) vs XC32 ; les niveaux d'optimisation et la syntaxe diffèrent
Version MCCStructure de mcc_generated_files/, fichier .mc3 ; Melody (plus récent : sous-dossiers system/, timer/, *_Initialize) vs ClassicEmplacement des bits de configuration et des pilotes, noms des API
HorlogeParamètres d'horloge MCC / #pragma config (FEXTOSC, RSTOSC / FNOSC / POSCMOD), defines _XTAL_FREQ ou FCYTemporisations, débits en bauds, périodes des timers
Programmeur/débogueurPICkit 4/5, MPLAB Snap, ICD 4/5Capacité d'alimentation et de programmation haute tension

Lorsqu'un nom de registre ou de bit est incertain, indiquez quelle section de la datasheet vérifier (ou lisez l'en-tête du composant pic16f18877.h etc. dans le répertoire d'inclusion du compilateur) plutôt que de deviner — les noms de registres PIC varient entre les sous-familles.

Règles qui empêchent les échecs PIC classiques

  1. Lecture entrée numérique = 0 → ANSEL. Sur la plupart des PIC modernes, les broches sont analogiques à la mise sous tension. Effacez le bit ANSELx (MCC : décochez « Analog ») pour chaque entrée numérique.
  2. Écrire LATx, lire PORTx. Écrire les bits de PORTx fait une lecture-modification-écriture des niveaux des broches et peut inverser d'autres sorties (fortes charges, basculement rapide). Les composants sans registres LAT nécessitent une variable fantôme.
  3. TRIS : 1 = entrée, 0 = sortie. Facile à inverser.
  4. Peripheral Pin Select (PPS) doit mapper les signaux UART/SPI/PWM sur les broches des dispositifs PPS ; avec PPS1WAY = ON, il ne peut être déverrouillé qu'une fois après un reset — laissez MCC le générer.
  5. Les bits de configuration décident de l'oscillateur, du watchdog, de MCLR, de LVP, du brown-out, de la protection du code. Définissez-les dans MCC (ou la fenêtre Configuration Bits → Generate Source Code), ne les laissez jamais aux valeurs par défaut que vous n'avez pas vérifiées. Un mauvais oscillateur = rien ne tourne ou toutes les temporisations sont fausses.
  6. _XTAL_FREQ (XC8) / FCY (XC16) doit correspondre à l'horloge réelle — __delay_ms() et de nombreux calculs en dépendent.
  7. Atomicité 8 bits : sur PIC16/18, tout uint16_t/uint32_t partagé avec une ISR est lu en plusieurs instructions — désactivez cette interruption (ou GIE) autour de la lecture. Sur PIC24/dsPIC, cela s'applique aux valeurs 32 bits.
  8. La pile d'appel matérielle est très petite sur les PIC 8 bits (8 niveaux sur les anciens PIC16, 16 sur les PIC16F1 améliorés, 31 sur PIC18) et l'ISR utilise aussi des niveaux. Pas de récursivité ; surveillez l'avertissement XC8 (1393) possible hardware stack overflow et la profondeur estimée dans la sortie de construction.
  9. Drapeaux d'interruption : dans l'ISR, vérifiez les bits d'activation et de drapeau (if (PIEx.xIE && PIRx.xIF)), effacez le drapeau, restez court. Activez les interruptions périphériques + globales (MCC : INTERRUPT_GlobalInterruptEnable()).
  10. La régénération MCC écrase mcc_generated_files/. Placez le code applicatif dans vos propres fichiers .c/.h ; gardez main.c léger ; révisez la boîte de dialogue de fusion MCC au lieu d'accepter aveuglément.
  11. Paramètres irréversibles / risqués : protection du code (CP), protection en écriture, désactivation de MCLR combinée à LVP désactivé, réglages d'oscillateur qui arrêtent la puce. N'activez pas la protection du code ou ne modifiez pas ces éléments sur un appareil utilisateur sans confirmation explicite ; un Snap ne peut pas récupérer un composant nécessitant une programmation haute tension.

Syntaxe spécifique à la famille (interruptions, temporisations, configuration, mémoire) : references/families.md.

dsPIC33 (contrôle, DSP, contrôle moteur, alimentation numérique)

Les dsPIC33 utilisent la syntaxe du cœur PIC24 plus un moteur DSP. Règles supplémentaires :

  • FCY = FOSC/2 ; la configuration PLL et la commutation d'horloge diffèrent selon la famille (EP vs CK/CH) — générez avec MCC et vérifiez les fréquences rapportées, y compris l'horloge auxiliaire qui pilote PWM/ADC.
  • Utilisez le Q15 virgule fixe (bibliothèque DSP dsp.h, libq.h, builtins) plutôt que float dans les boucles rapides ; documentez l'échelle de chaque variable.
  • Clampez explicitement les intégrateurs et les sorties en C — l'arithmétique C normale sature ; la saturation de CORCON ne protège que les opérations du moteur DSP.
  • Boucle de contrôle = interruption ADC déclenchée par PWM à haute priorité ; mesurez son temps d'exécution sur un oscilloscope.
  • Configurez les entrées de défaut/limitation de courant PWM avant d'activer les sorties sur tout étage de puissance, et testez le temps mort à basse tension d'abord — un mauvais code PWM détruit le matériel.
  • Activez le piège de débordement catastrophique de l'accumulateur (COVTE) ; laissez OVATE/OVBTE désactivés pour le code MAC normal (les bits de garde sont faits pour être utilisés).
  • Les jeux de registres alternatifs dsPIC33CK/CH utilisent __attribute__((interrupt, context)) avec une priorité ISR correspondante — pas shadow.
  • dsPIC33CH est dual-core : deux projets, propriété des broches, boîtes aux lettres MSI.

Détails : references/dspic33.md.

Construire, programmer, déboguer

ActionComment
Construire dans l'IDEMPLAB X → Clean and Build (marteau + balai). Vérifiez le Résumé mémoire et les avertissements dans la sortie
Construire en mode headlessprjMakefilesGenerator.sh <proj>.X@default puis make -C <proj>.X CONF=default → dist/default/production/<proj>.X.production.hex
ProgrammerMPLAB X « Make and Program Device », MPLAB IPE, ou ipecmd en ligne de commande
DéboguerMPLAB X Debug Main Project avec PICkit/Snap/ICD (build debug), ou le Simulateur MPLAB X pour la logique pure et les temporisateurs sans matériel

La programmation modifie le composant : confirmez le composant et le programmeur avec l'utilisateur avant d'exécuter ipecmd, et n'effacez/protégez jamais sans confirmation. Commandes complètes, différences entre programmeurs et dépannage de connexion : references/build-program-debug.md.

Quand ça ne marche pas

  • Rien ne s'exécute : bits de configuration (source d'oscillateur, WDT, MCLR), alimentation, pull-up MCLR (10 kΩ), le programmeur a-t-il libéré le composant du reset (IPE « Release from Reset » / -OL).
  • Fonctionne à la mauvaise vitesse / mauvais baud : RSTOSC/FNOSC, PLL, diviseur d'horloge (CDIV), _XTAL_FREQ incohérent.
  • Resets aléatoires : lisez les bits de cause de reset au démarrage (PCON/PCON0/RCON — references/families.md), watchdog non effacé, débordement de pile (STKOVF), brown-out.
  • PIC24/dsPIC reset ou blocage soudain : installez des gestionnaires de pièges (_AddressError, _StackError, _MathError, _OscillatorFail) — les erreurs d'adresse signifient généralement un accès 16 bits non aligné.

Fichiers de référence

FichierÀ lire quand
references/families.mdÉcrire/réviser du code pour une famille spécifique : syntaxe d'interruption, temporisations, bits de configuration, modèle mémoire, atomicité, causes de reset, pièges, cache PIC32/DMA, conseils d'optimisation XC8 et mémoire
references/dspic33.mdTout travail sur dsPIC33 : familles, XC-DSC, PLL/commutation d'horloge, moteur DSP et math Q15, registres de contexte ISR/shadow, pièges mathématiques, DMA, boucles de contrôle PWM/ADC haute vitesse, dual-core CH, motorBench/outils d'alimentation, liste de vérification
references/mcc-and-project.mdStructure de projet, MCC Melody vs Classic, règles de régénération, où placer le code, pilotes périphériques (UART, I2C, ADC, timers, PWM, NVM/EEPROM), basse consommation
references/build-program-debug.mdInstallation des outils, builds headless, programmation ipecmd, différences PICkit/Snap/ICD, limites de débogage, dépannage « impossible de se connecter / ID du composant ne correspond pas », tests unitaires du code PIC sur le PC

Individual skills in this repo

This repo contains 2 individual skills — each has its own dedicated page.

esp32-firmware

ESP32 firmware with PlatformIO — Arduino framework (primary) and ESP-IDF (also inside PlatformIO, or Arduino as an IDF component) — for ESP32, S2, S3, C3, C6. Covers platformio.ini setup, Arduino core 2.x vs 3.x API differences, safe pin selection (strapping/flash/PSRAM/ADC2 pins), FreeRTOS tasks and ISRs, memory/PSRAM, Wi-Fi/BLE, NVS/Preferences, OTA, deep sleep, partitions, flashing over USB/serial, decoding Guru Meditation panics and boot loops. Use this skill whenever the user works on any ESP32 / ESP32-S3 / C3 / C6 board, platformio.ini with espressif32, Arduino sketches for ESP32, idf.py/sdkconfig, or pastes ESP32 serial output (rst:, Guru Meditation, Brownout, watchdog) — even if they only say "a placa reinicia" or "o upload falha". Use together with embedded-c-cpp for general C/C++ quality, testing and architecture.

stm32-firmware

STM32 firmware development with STM32CubeMX / STM32CubeIDE + HAL/LL and with PlatformIO — project structure and USER CODE rules, peripherals (UART/I2C/SPI/ADC/timers/DMA), clocks, low power, flash/option bytes, building from the command line, flashing and debugging with ST-Link (STM32CubeProgrammer CLI, OpenOCD, GDB, SWV), and HardFault analysis. Use this skill whenever the user works on any STM32 / Nucleo / Discovery / Blue Pill board, a `.ioc` file, CubeMX/CubeIDE, HAL_ functions, ST-Link, or sees a HardFault — even if they just say "o meu STM32 não arranca" or paste a HAL call. Use together with embedded-c-cpp for general C/C++ quality, testing and architecture.

Skills associés