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ément | Où le trouver | Pourquoi c'est important |
|---|---|---|
| Composant exact (PIC16F18877, PIC18F47Q10, PIC24FJ128GA010, dsPIC33CK256MP508, PIC32MX795F512L...) | nbproject/configurations.xml (<targetDevice>), MCC .mc3, utilisateur | Registres, 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 + version | configurations.xml (<languageToolchain>, <languageToolchainVersion>) | XC8 vs XC16 vs XC-DSC (dsPIC) vs XC32 ; les niveaux d'optimisation et la syntaxe diffèrent |
| Version MCC | Structure de mcc_generated_files/, fichier .mc3 ; Melody (plus récent : sous-dossiers system/, timer/, *_Initialize) vs Classic | Emplacement des bits de configuration et des pilotes, noms des API |
| Horloge | Paramètres d'horloge MCC / #pragma config (FEXTOSC, RSTOSC / FNOSC / POSCMOD), defines _XTAL_FREQ ou FCY | Temporisations, débits en bauds, périodes des timers |
| Programmeur/débogueur | PICkit 4/5, MPLAB Snap, ICD 4/5 | Capacité 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
- 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. - Écrire
LATx, lirePORTx. Écrire les bits dePORTxfait 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. - TRIS : 1 = entrée, 0 = sortie. Facile à inverser.
- 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. - 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.
_XTAL_FREQ(XC8) /FCY(XC16) doit correspondre à l'horloge réelle —__delay_ms()et de nombreux calculs en dépendent.- Atomicité 8 bits : sur PIC16/18, tout
uint16_t/uint32_tpartagé 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. - 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.
- 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()). - La régénération MCC écrase
mcc_generated_files/. Placez le code applicatif dans vos propres fichiers.c/.h; gardezmain.cléger ; révisez la boîte de dialogue de fusion MCC au lieu d'accepter aveuglément. - 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 quefloatdans 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
CORCONne 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) ; laissezOVATE/OVBTEdé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 — passhadow. - dsPIC33CH est dual-core : deux projets, propriété des broches, boîtes aux lettres MSI.
Détails : references/dspic33.md.
Construire, programmer, déboguer
| Action | Comment |
|---|---|
| Construire dans l'IDE | MPLAB X → Clean and Build (marteau + balai). Vérifiez le Résumé mémoire et les avertissements dans la sortie |
| Construire en mode headless | prjMakefilesGenerator.sh <proj>.X@default puis make -C <proj>.X CONF=default → dist/default/production/<proj>.X.production.hex |
| Programmer | MPLAB X « Make and Program Device », MPLAB IPE, ou ipecmd en ligne de commande |
| Déboguer | MPLAB 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_FREQincohé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.md | Tout 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.md | Structure 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.md | Installation 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 |