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

Spezialisiertes Skill für die Entwicklung von Mikrocontroller-Firmware für Microchip PIC und dsPIC mit MPLAB X IDE, XC8/XC16/XC-DSC/XC32 Compilern und MPLAB Code Configurator (MCC Melody/Classic) – inklusive Konfigurationsbits, Oszillator/PLL, GPIO, PPS, Interrupts, DSP-Engine, PWM/ADC-Regelkreise, Motorregelung und Digital Power.

Was ist Snap / ICD)?

Dieser Skill ist für Entwickler gedacht, die Firmware für Microchip PIC- und dsPIC-Mikrocontroller mit der MPLAB X IDE und den entsprechenden XC-Compilern (XC8, XC16, XC-DSC, XC32) sowie dem MPLAB Code Configurator (MCC) in den Varianten Melody und Classic erstellen. Er deckt die gesamte Palette von 8-Bit-PICs (PIC16, PIC18) über 16-Bit-PICs (PIC24) und DSP-Controller (dsPIC33) bis zu 32-Bit-PICs (PIC32MX/MZ) ab. Der Skill enthält spezifische Regeln, die typische Fehler verhindern, wie z.B. das versehentliche Lesen von analogen Pins als digitale Eingänge (ANSEL-Konfiguration), die korrekte Verwendung von LAT/PORT-Registern und Peripheral Pin Select (PPS) sowie die richtige Konfiguration von Oszillator und Takt (PLL). Für dsPIC33 werden zusätzlich Themen wie die DSP-Engine mit Q15-Festkomma-Arithmetik, die Konfiguration von Hochgeschwindigkeits-PWM/ADC-Regelkreisen für Motorregelung und Digital Power sowie die Besonderheiten des Dual-Core dsPIC33CH behandelt. Er beschreibt den Build-Prozess (inklusive Headless-Builds), das Programmieren und Debuggen mit Programmern wie PICkit 4/5, MPLAB Snap und ICD (über ipecmd) sowie die Fehlersuche bei typischen Problemen (nichts läuft, falsche Geschwindigkeit, Resets, Traps). Referenzdateien bieten detaillierte Informationen zu spezifischen Familien, dsPIC33, MCC-Projektstruktur und Build/Debug. Dieser Skill sollte immer dann aktiviert werden, wenn der Benutzer ein PIC- oder dsPIC-Bauteil, MPLAB X, MCC, einen XC-Compiler, PICkit/Snap/ICD oder ein .X-Projektverzeichnis erwähnt. In Kombination mit dem Skill `embedded-c-cpp` werden allgemeine C-Qualität, Tests und Architektur abgedeckt.

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

Installed? Explore more Produktivität & Zusammenarbeit skills: steipete/gemini, steipete/gh-issues, steipete/skill-creator · View all 6 →

In Ihrer bevorzugten KI fragen

Öffnet einen neuen Chat, in dem dieser Agent-Skill bereits geladen ist.

Dokumentation

Was macht Snap / ICD)?

Lade ebenfalls embedded-c-cpp für Codierungsstandards, Architektur, Unit-Tests und allgemeines Debugging. Dieser Skill enthält die Microchip-spezifischen Teile. PIC-Firmware wird in C geschrieben (XC8 hat kein C++).

Zuerst: Projekt identifizieren

FindenWoWarum es wichtig ist
Exaktes Bauteil (PIC16F18877, PIC18F47Q10, PIC24FJ128GA010, dsPIC33CK256MP508, PIC32MX795F512L...)nbproject/configurations.xml (<targetDevice>), MCC .mc3, BenutzerRegister, Peripherie, PPS, Interrupt-Modell, Speicher unterscheiden sich pro Bauteil – bei dsPIC33 haben die Familien F, E, C und A unterschiedliche PWM/ADC/PLL-Module
Compiler + Versionconfigurations.xml (<languageToolchain>, <languageToolchainVersion>)XC8 vs. XC16 vs. XC-DSC (dsPIC) vs. XC32; Optimierungsstufen und Syntax unterscheiden sich
MCC-Variantemcc_generated_files/ Layout, .mc3 Datei; Melody (neuer: system/, timer/ Unterordner, *_Initialize) vs. ClassicWo Konfigurationsbits und Treiber leben, API-Namen
TaktMCC-Takteinstellungen / #pragma config (FEXTOSC, RSTOSC / FNOSC / POSCMOD), _XTAL_FREQ oder FCY defineVerzögerungen, Baudraten, Timer-Perioden
Programmierer/DebuggerPICkit 4/5, MPLAB Snap, ICD 4/5Spannungsversorgung und Hochspannungs-Programmierfähigkeit

Wenn ein Register- oder Bit-Name unsicher ist, nenne den Datenblattabschnitt zum Nachschlagen (oder lies den Device-Header pic16f18877.h usw. im Compiler-Include-Verzeichnis), anstatt zu raten – PIC-Registernamen variieren zwischen Unterfamilien.

Regeln, die die klassischen PIC-Fehler verhindern

  1. Digitaler Eingang liest 0 → ANSEL. Bei den meisten modernen PICs sind Pins nach dem Einschalten analog. Lösche das ANSELx-Bit (MCC: "Analog" abwählen) für jeden digitalen Eingang.
  2. Schreibe LATx, lese PORTx. Das Schreiben von PORTx-Bits führt einen Read-Modify-Write der Pin-Pegel durch und kann andere Ausgänge umkippen lassen (starke Lasten, schnelles Toggeln). Teile ohne LAT-Register benötigen eine Schattenvariable.
  3. TRIS: 1 = Eingang, 0 = Ausgang. Leicht zu invertieren.
  4. Peripheral Pin Select (PPS) muss UART/SPI/PWM-Signale auf Pins bei PPS-Geräten mappen; mit PPS1WAY = ON kann es nur einmal nach dem Reset entsperrt werden – lasse es von MCC generieren.
  5. Config-Bits bestimmen Oszillator, Watchdog, MCLR, LVP, Brown-out, Code-Schutz. Setze sie in MCC (oder im Config-Bits-Fenster → Quellcode generieren), verlasse dich nie auf nicht überprüfte Standardeinstellungen. Falscher Oszillator = nichts läuft oder jede Zeitsteuerung ist falsch.
  6. _XTAL_FREQ (XC8) / FCY (XC16) muss dem echten Takt entsprechen – __delay_ms() und viele Berechnungen hängen davon ab.
  7. 8-Bit-Atomizität: Bei PIC16/18 wird jeder uint16_t/uint32_t, der mit einer ISR geteilt wird, in mehreren Instruktionen gelesen – deaktiviere diesen Interrupt (oder GIE) um das Lesen herum. Bei PIC24/dsPIC gilt das Gleiche für 32-Bit-Werte.
  8. Hardware-Callstack ist winzig bei 8-Bit-PICs (8 Ebenen bei alten PIC16, 16 bei enhanced PIC16F1, 31 bei PIC18) und die ISR verbraucht auch Ebenen. Keine Rekursion; achte auf die XC8-Warnung (1393) possible hardware stack overflow und die geschätzte Tiefe in der Build-Ausgabe.
  9. Interrupt-Flags: Überprüfe in der ISR sowohl Enable- als auch Flag-Bits (if (PIEx.xIE && PIRx.xIF)), lösche das Flag, halte sie kurz. Aktiviere periphere + globale Interrupts (MCC: INTERRUPT_GlobalInterruptEnable()).
  10. MCC-Regeneration überschreibt mcc_generated_files/. Lege Anwendungscode in eigenen .c/.h-Dateien ab; halte main.c schlank; überprüfe den MCC-Merge-Dialog, anstatt blind zu akzeptieren.
  11. Irreversible / riskante Einstellungen: Code-Schutz (CP), Write-Schutz, Deaktivieren von MCLR zusammen mit LVP aus, Oszillatoreinstellungen, die den Chip stoppen. Aktiviere keinen Code-Schutz oder ändere diese Einstellungen ohne explizite Bestätigung am Gerät des Benutzers; ein Snap kann ein Teil, das Hochspannungsprogrammierung benötigt, nicht wiederherstellen.

Familien-spezifische Syntax (Interrupts, Verzögerungen, Config, Speicher): references/families.md.

dsPIC33 (Regelung, DSP, Motorregelung, Digital Power)

dsPIC33 verwendet die PIC24-Core-Syntax plus eine DSP-Engine. Zusätzliche Regeln:

  • FCY = FOSC/2; PLL-Setup und Taktumschaltung unterscheiden sich pro Familie (EP vs. CK/CH) – generiere mit MCC und überprüfe die gemeldeten Frequenzen, einschließlich des Hilfstakts, der PWM/ADC antreibt.
  • Verwende Q15-Festkomma (DSP-Bibliothek dsp.h, libq.h, Builtins) anstelle von float in schnellen Schleifen; dokumentiere die Skalierung jeder Variable.
  • Begrenze Integratoren und Ausgänge explizit in C – normale C-Arithmetik läuft über; die CORCON-Sättigung schützt nur DSP-Engine-Operationen.
  • Regelkreis = PWM-getriggerter ADC-Interrupt mit hoher Priorität; messe seine Ausführungszeit auf einem Oszilloskop.
  • Konfiguriere PWM-Fehler-/Strombegrenzungseingänge vor dem Aktivieren der Ausgänge an jeder Leistungsstufe, und teste die Totzeit zuerst bei niedriger Spannung – falscher PWM-Code zerstört Hardware.
  • Aktiviere die katastrophale Akkumulator-Überlauf-Falle (COVTE); lasse OVATE/OVBTE für normalen MAC-Code aus (Guard-Bits sind zur Nutzung vorgesehen).
  • dsPIC33CK/CH alternative Registersätze verwenden __attribute__((interrupt, context)) mit passender ISR-Priorität – nicht shadow.
  • dsPIC33CH ist Dual-Core: zwei Projekte, Pin-Besitz, MSI-Mailboxen.

Details: references/dspic33.md.

Bauen, Programmieren, Debuggen

AktionWie
Bauen in der IDEMPLAB X → Clean and Build (Hammer+Besen). Überprüfe die Memory Summary und Warnungen in der Ausgabe
Headless-BuildprjMakefilesGenerator.sh <proj>.X@default dann make -C <proj>.X CONF=default → dist/default/production/<proj>.X.production.hex
ProgrammierenMPLAB X "Make and Program Device", MPLAB IPE, oder ipecmd von der Kommandozeile
DebuggenMPLAB X Debug Main Project mit PICkit/Snap/ICD (Debug-Build), oder der MPLAB X Simulator für reine Logik/Timer ohne Hardware

Programmieren verändert das Gerät: bestätige das Bauteil und den Programmierer mit dem Benutzer, bevor du ipecmd ausführst, und lösche/schütze niemals ohne Bestätigung. Vollständige Befehle, Programmierer-Unterschiede und Verbindungs-Fehlerbehebung: references/build-program-debug.md.

Wenn es nicht funktioniert

  • Nichts läuft: Config-Bits (Oszillatorquelle, WDT, MCLR), Spannung, MCLR-Pull-up (10 kΩ), Programmierer hat das Gerät aus dem Reset entlassen (IPE "Release from Reset" / -OL).
  • Läuft mit falscher Geschwindigkeit / falschem Baud: RSTOSC/FNOSC, PLL, Taktteiler (CDIV), _XTAL_FREQ-Missmatch.
  • Zufällige Resets: lies die Reset-Ursachen-Bits beim Booten (PCON/PCON0/RCON – references/families.md), Watchdog nicht gelöscht, Stack-Überlauf (STKOVF), Brown-out.
  • PIC24/dsPIC plötzlicher Reset oder Hänger: installiere Trap-Handler (_AddressError, _StackError, _MathError, _OscillatorFail) – Adressfehler bedeuten meist einen nicht ausgerichteten 16-Bit-Zugriff.

Referenzdateien

DateiLesen, wenn
references/families.mdCode für eine bestimmte Familie schreiben/überprüfen: Interrupt-Syntax, Verzögerungen, Config-Bits, Speichermodell, Atomizität, Reset-Ursachen, Traps, PIC32-Cache/DMA, XC8-Optimierung und Speicher-Tipps
references/dspic33.mdJede dsPIC33-Arbeit: Familien, XC-DSC, PLL/Taktumschaltung, DSP-Engine und Q15-Mathe, ISR-Context/Shadow-Register, Math-Traps, DMA, High-Speed-PWM/ADC-Regelkreise, Dual-Core CH, motorBench/Power-Tools, Review-Checkliste
references/mcc-and-project.mdProjektstruktur, MCC Melody vs. Classic, Regenerierungsregeln, wo Code abgelegt wird, Peripherietreiber (UART, I2C, ADC, Timer, PWM, NVM/EEPROM), Low Power
references/build-program-debug.mdTools installieren, Headless-Builds, ipecmd-Programmierung, PICkit/Snap/ICD-Unterschiede, Debugging-Grenzen, "cannot connect / device ID mismatch"-Fehlerbehebung, Unit-Tests von PIC-Code auf dem 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.

Verwandte Skills