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
| Encontrar | Dónde | Por qué es importante |
|---|---|---|
| Parte exacta (PIC16F18877, PIC18F47Q10, PIC24FJ128GA010, dsPIC33CK256MP508, PIC32MX795F512L...) | nbproject/configurations.xml (<targetDevice>), MCC .mc3, usuario | Registros, 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ón | configurations.xml (<languageToolchain>, <languageToolchainVersion>) | XC8 vs XC16 vs XC-DSC (dsPIC) vs XC32; los niveles de optimización y la sintaxis difieren |
| Tipo de MCC | diseño mcc_generated_files/, archivo .mc3; Melody (más nuevo: subcarpetas system/, timer/, *_Initialize) vs Clásico | Dónde viven los bits de configuración y los controladores, nombres de las API |
| Reloj | Configuración de reloj en MCC / #pragma config (FEXTOSC, RSTOSC / FNOSC / POSCMOD), define _XTAL_FREQ o FCY | Retardos, velocidades de baudios, periodos de temporizadores |
| Programador/depurador | PICkit 4/5, MPLAB Snap, ICD 4/5 | Capacidad 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
- 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. - Escriba
LATx, leaPORTx. Escribir en los bits dePORTxhace 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. - TRIS: 1 = entrada, 0 = salida. Fácil de invertir.
- Peripheral Pin Select (PPS) debe asignar las señales UART/SPI/PWM a los pines en dispositivos PPS; con
PPS1WAY = ONsolo se puede desbloquear una vez después del reinicio — deje que MCC lo genere. - 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.
_XTAL_FREQ(XC8) /FCY(XC16) debe coincidir con el reloj real —__delay_ms()y muchos cálculos dependen de ello.- Atomicidad de 8 bits: en PIC16/18 cualquier
uint16_t/uint32_tcompartido 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. - 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.
- 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()). - La regeneración de MCC sobrescribe
mcc_generated_files/. Ponga el código de aplicación en sus propios archivos.c/.h; mantengamain.cligero; revise el diálogo de fusión de MCC en lugar de aceptarlo ciegamente. - 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 defloaten 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
CORCONsolo 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); dejeOVATE/OVBTEapagados 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 — noshadow. - dsPIC33CH es de doble núcleo: dos proyectos, propiedad de pines, buzones MSI.
Detalles: references/dspic33.md.
Compilar, programar, depurar
| Acción | Cómo |
|---|---|
| Compilar en IDE | MPLAB X → Clean and Build (martillo+escoba). Revise el Resumen de memoria y las advertencias en la salida |
| Compilar headless | prjMakefilesGenerator.sh <proj>.X@default luego make -C <proj>.X CONF=default → dist/default/production/<proj>.X.production.hex |
| Programar | MPLAB X "Make and Program Device", MPLAB IPE, o ipecmd desde la línea de comandos |
| Depurar | MPLAB 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_FREQno 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
| Archivo | Leer cuando |
|---|---|
references/families.md | Escribiendo/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.md | Cualquier 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.md | Estructura 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.md | Instalació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 |