pic-firmware

Firmware para microcontroladores PIC y dsPIC de Microchip usando MPLAB X IDE, compiladores XC8/XC16/XC-DSC/XC32 y MPLAB Code Configurator (MCC Melody/Clásico) para las familias PIC16, PIC18, PIC24, dsPIC33 y PIC32.

¿Qué es pic-firmware?

Este skill proporciona conocimiento especializado para desarrollar firmware en microcontroladores PIC y dsPIC de Microchip, abarcando desde la configuración inicial hasta la depuración avanzada. Es útil porque cubre reglas críticas que suelen causar fallos clásicos, como el manejo de pines analógicos/digitales (ANSEL), la diferencia entre LAT y PORT, la asignación periférica (PPS), los bits de configuración del oscilador, las limitaciones de la pila de llamadas en 8 bits y la atomicidad en operaciones de 16/32 bits. Incluye soporte para dsPIC33 con su motor DSP, punto fijo Q15, lazos de control PWM/ADC de alta velocidad, control de motores y conversión de potencia digital. También detalla cómo construir el proyecto de forma gráfica o headless (sin interfaz), programar y depurar con PICkit 4/5, MPLAB Snap e ICD, e interpretar causas de reinicio. Se recomienda cargar junto con el skill 'embedded-c-cpp' para estándares de código, pruebas unitarias y depuración general.

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

Installed? Explore more Productividad y colaboración skills: steipete/gemini, steipete/gh-issues, steipete/skill-creator · View all 6 →

Preguntar en tu IA favorita

Abre un nuevo chat con esta habilidad de agente ya precargada.

Documentación

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

Cargue también embedded-c-cpp para estándares de codificación, arquitectura, pruebas unitarias y depuración general. Este skill contiene las partes específicas de Microchip. El firmware PIC se escribe en C (XC8 no tiene C++).

Primero, identifique el proyecto

EncontrarDóndePor qué es importante
Parte exacta (PIC16F18877, PIC18F47Q10, PIC24FJ128GA010, dsPIC33CK256MP508, PIC32MX795F512L...)nbproject/configurations.xml (<targetDevice>), MCC .mc3, usuarioRegistros, periféricos, PPS, modelo de interrupción, memoria: todo difiere según la parte — en dsPIC33 las familias F, E, C y A tienen módulos PWM/ADC/PLL diferentes
Compilador + versiónconfigurations.xml (<languageToolchain>, <languageToolchainVersion>)XC8 vs XC16 vs XC-DSC (dsPIC) vs XC32; los niveles de optimización y la sintaxis difieren
Tipo de MCCdiseño mcc_generated_files/, archivo .mc3; Melody (más nuevo: subcarpetas system/, timer/, *_Initialize) vs ClásicoDónde viven los bits de configuración y los controladores, nombres de las API
RelojConfiguración de reloj en MCC / #pragma config (FEXTOSC, RSTOSC / FNOSC / POSCMOD), define _XTAL_FREQ o FCYRetardos, velocidades de baudios, periodos de temporizadores
Programador/depuradorPICkit 4/5, MPLAB Snap, ICD 4/5Capacidad de programación de alto voltaje y alimentación

Cuando no esté seguro de un nombre de registro o bit, indique qué sección de la hoja de datos consultar (o lea el encabezado del dispositivo pic16f18877.h etc. en el directorio de inclusión del compilador) en lugar de adivinar: los nombres de los registros PIC varían entre subfamilias.

Reglas que previenen los fallos PIC clásicos

  1. La entrada digital lee 0 → ANSEL. En la mayoría de los PIC modernos, los pines se inician como analógicos. Limpie el bit ANSELx (MCC: desmarque "Analógico") para cada entrada digital.
  2. Escriba LATx, lea PORTx. Escribir en los bits de PORTx hace una lectura-modificación-escritura de los niveles de los pines y puede cambiar otras salidas (cargas pesadas, conmutación rápida). Las partes sin registros LAT necesitan una variable sombra.
  3. TRIS: 1 = entrada, 0 = salida. Fácil de invertir.
  4. Peripheral Pin Select (PPS) debe asignar las señales UART/SPI/PWM a los pines en dispositivos PPS; con PPS1WAY = ON solo se puede desbloquear una vez después del reinicio — deje que MCC lo genere.
  5. Los bits de configuración deciden oscilador, watchdog, MCLR, LVP, brown-out, protección de código. Ajústelos en MCC (o en la ventana Configuration Bits → Generate Source Code), nunca los deje con valores por defecto que no haya verificado. Oscilador incorrecto = no funciona nada o todos los tiempos están desviados.
  6. _XTAL_FREQ (XC8) / FCY (XC16) debe coincidir con el reloj real — __delay_ms() y muchos cálculos dependen de ello.
  7. Atomicidad de 8 bits: en PIC16/18 cualquier uint16_t/uint32_t compartido con una ISR se lee en varias instrucciones — deshabilite esa interrupción (o GIE) alrededor de la lectura. En PIC24/dsPIC se aplica lo mismo a valores de 32 bits.
  8. La pila de llamadas por hardware es muy pequeña en PIC de 8 bits (8 niveles en PIC16 antiguos, 16 en PIC16F1 mejorados, 31 en PIC18) y la ISR también usa niveles. Sin recursión; vigile la advertencia de XC8 (1393) posible desbordamiento de pila de hardware y la profundidad estimada en la salida de compilación.
  9. Banderas de interrupción: en la ISR, verifique tanto el bit de habilitación como el de bandera (if (PIEx.xIE && PIRx.xIF)), limpie la bandera, manténgala corta. Habilite interrupciones periféricas + globales (MCC: INTERRUPT_GlobalInterruptEnable()).
  10. La regeneración de MCC sobrescribe mcc_generated_files/. Ponga el código de aplicación en sus propios archivos .c/.h; mantenga main.c ligero; revise el diálogo de fusión de MCC en lugar de aceptarlo ciegamente.
  11. Ajustes irreversibles/arriesgados: protección de código (CP), protección de escritura, deshabilitar MCLR junto con LVP apagado, ajustes del oscilador que detienen el chip. No habilite la protección de código ni cambie estos ajustes en el dispositivo de un usuario sin confirmación explícita; un Snap no puede recuperar una parte que necesita programación de alto voltaje.

Sintaxis específica de familia (interrupciones, retardos, configuración, memoria): references/families.md.

dsPIC33 (control, DSP, control de motores, potencia digital)

dsPIC33 usa la sintaxis del núcleo PIC24 más un motor DSP. Reglas adicionales:

  • FCY = FOSC/2; la configuración del PLL y el cambio de reloj difieren por familia (EP vs CK/CH) — genere con MCC y verifique las frecuencias reportadas, incluido el reloj auxiliar que impulsa PWM/ADC.
  • Use punto fijo Q15 (librería DSP dsp.h, libq.h, builtins) en lugar de float en bucles rápidos; documente la escala de cada variable.
  • Apriete integradores y salidas explícitamente en C — la aritmética normal de C envuelve; la saturación de CORCON solo protege las operaciones del motor DSP.
  • Bucle de control = interrupción ADC disparada por PWM a alta prioridad; mida su tiempo de ejecución en un osciloscopio.
  • Configure las entradas de falla/límite de corriente del PWM antes de habilitar las salidas en cualquier etapa de potencia, y pruebe el tiempo muerto a baja tensión primero — un código PWM incorrecto destruye el hardware.
  • Habilite la trampa de desbordamiento catastrófico del acumulador (COVTE); deje OVATE/OVBTE apagados para código MAC normal (los bits de guarda están diseñados para usarse).
  • Los conjuntos de registros alternativos de dsPIC33CK/CH usan __attribute__((interrupt, context)) con prioridad de ISR coincidente — no shadow.
  • dsPIC33CH es de doble núcleo: dos proyectos, propiedad de pines, buzones MSI.

Detalles: references/dspic33.md.

Compilar, programar, depurar

AcciónCómo
Compilar en IDEMPLAB X → Clean and Build (martillo+escoba). Revise el Resumen de memoria y las advertencias en la salida
Compilar headlessprjMakefilesGenerator.sh <proj>.X@default luego make -C <proj>.X CONF=default → dist/default/production/<proj>.X.production.hex
ProgramarMPLAB X "Make and Program Device", MPLAB IPE, o ipecmd desde la línea de comandos
DepurarMPLAB X Debug Main Project con PICkit/Snap/ICD (build de depuración), o el Simulador MPLAB X para lógica/temporizadores puros sin hardware

Programar cambia el dispositivo: confirme la parte y el programador con el usuario antes de ejecutar ipecmd, y nunca borre/proteja sin confirmación. Comandos completos, diferencias de programadores y solución de problemas de conexión: references/build-program-debug.md.

Cuando no funciona

  • No funciona nada: bits de configuración (fuente del oscilador, WDT, MCLR), alimentación, pull-up de MCLR (10 kΩ), el programador liberó el dispositivo del reinicio (IPE "Release from Reset" / -OL).
  • Funciona a velocidad incorrecta / baudio incorrecto: RSTOSC/FNOSC, PLL, divisor de reloj (CDIV), _XTAL_FREQ no coincide.
  • Reinicios aleatorios: lea los bits de causa de reinicio al arrancar (PCON/PCON0/RCON — references/families.md), watchdog no limpiado, desbordamiento de pila (STKOVF), brown-out.
  • PIC24/dsPIC se reinicia o se cuelga repentinamente: instale manejadores de trampa (_AddressError, _StackError, _MathError, _OscillatorFail) — los errores de dirección suelen indicar un acceso de 16 bits desalineado.

Archivos de referencia

ArchivoLeer cuando
references/families.mdEscribiendo/revisando código para una familia específica: sintaxis de interrupciones, retardos, bits de configuración, modelo de memoria, atomicidad, causas de reinicio, trampas, caché/DMA de PIC32, consejos de optimización y memoria de XC8
references/dspic33.mdCualquier trabajo con dsPIC33: familias, XC-DSC, PLL/cambio de reloj, motor DSP y matemáticas Q15, registros de contexto/sombra de ISR, trampas matemáticas, DMA, PWM/ADC de alta velocidad en lazos de control, CH de doble núcleo, herramientas motorBench/potencia, lista de verificación de revisión
references/mcc-and-project.mdEstructura del proyecto, MCC Melody vs Clásico, reglas de regeneración, dónde poner el código, controladores periféricos (UART, I2C, ADC, temporizadores, PWM, NVM/EEPROM), bajo consumo
references/build-program-debug.mdInstalación de herramientas, compilaciones headless, programación con ipecmd, diferencias entre PICkit/Snap/ICD, límites de depuración, solución de problemas "no se puede conectar / ID del dispositivo no coincide", pruebas unitarias de código PIC en 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 relacionados