Community생산성 & 협업github.com

pic-펌웨어

Microchip PIC 및 dsPIC 펌웨어 개발 지원. MPLAB X IDE, XC8 / XC16 / XC-DSC / XC32 컴파일러, MPLAB Code Configurator (MCC Melody/Classic)를 활용하여 PIC16, PIC18, PIC24, dsPIC33 (F/EP/EV/CK/CH 듀얼코어/A) 및 PIC32를 다룹니다.

pic-펌웨어란 무엇인가요?

이 스킬은 Microchip PIC 및 dsPIC 마이크로컨트롤러 펌웨어 개발을 위한 종합 가이드입니다. MPLAB X IDE, XC8/XC16/XC-DSC/XC32 컴파일러, MPLAB Code Configurator(MCC Melody/Classic)를 지원하며, PIC16, PIC18, PIC24, dsPIC33(싱글 및 듀얼 코어), PIC32 시리즈를 포함합니다. 주요 기능으로는 설정 비트, 오실레이터/PLL 설정, TRIS/LAT/PORT/ANSEL 핀 제어, 주변장치 핀 선택(PPS), 인터럽트, 8/16비트 원자성 보장, 하드웨어 스택 제한, dsPIC DSP 엔진 및 Q15 고정소수점 연산, 고속 PWM/ADC 제어 루프, 모터 제어 및 디지털 전력 변환, XC8 메모리 및 최적화, 헤드리스 빌드, PICkit 4/5, MPLAB Snap, ICD를 통한 프로그래밍 및 디버깅, 리셋 원인 분석, 트랩 처리 등이 포함됩니다. 또한 일반적인 C 품질, 테스팅, 아키텍처 관련 질문을 위해 `embedded-c-cpp` 스킬과 함께 사용하도록 설계되었습니다. 특히 ANSEL 설정 누락, LAT/PORT 혼동, PPS 설정 오류, 설정 비트 누락, 스택 오버플로우 등 PIC 개발에서 자주 발생하는 실수를 방지하는 규칙을 제공합니다.

지원 대상~Claude Code~Codex CLI~Cursor
npx skills add https://github.com/budenga/firmware-skills/tree/HEAD/skills/pic-firmware

Installed? Explore more 생산성 & 협업 skills: steipete/gemini, steipete/gh-issues, steipete/skill-creator · View all 6 →

즐겨 사용하는 AI에게 물어보기

이 에이전트 스킬이 미리 로드된 새 채팅을 엽니다.

문서

PIC & dsPIC 펌웨어 (MPLAB X + XC + MCC; PICkit / Snap / ICD)

코딩 표준, 아키텍처, 단위 테스트 및 일반 디버깅을 위해 embedded-c-cpp도 함께 로드하세요. 이 스킬은 Microchip 특화 부분을 다룹니다. PIC 펌웨어는 C로 작성됩니다 (XC8은 C++를 지원하지 않음).

먼저, 프로젝트를 식별하세요

찾을 항목위치중요한 이유
정확한 부품 (PIC16F18877, PIC18F47Q10, PIC24FJ128GA010, dsPIC33CK256MP508, PIC32MX795F512L...)nbproject/configurations.xml (<targetDevice>), MCC .mc3, 사용자레지스터, 주변장치, PPS, 인터럽트 모델, 메모리는 부품마다 다름 — dsPIC33의 경우 F, E, C, A 계열은 PWM/ADC/PLL 모듈이 다름
컴파일러 + 버전configurations.xml (<languageToolchain>, <languageToolchainVersion>)XC8 vs XC16 vs XC-DSC (dsPIC) vs XC32; 최적화 수준과 구문이 다름
MCC 종류mcc_generated_files/ 레이아웃, .mc3 파일; Melody (최신: system/, timer/ 하위 폴더, *_Initialize) vs Classic설정 비트와 드라이버의 위치, API 이름이 다름
클록MCC 클록 설정 / #pragma config (FEXTOSC, RSTOSC / FNOSC / POSCMOD), _XTAL_FREQ 또는 FCY 정의지연, 보레이트, 타이머 주기에 영향
프로그래머/디버거PICkit 4/5, MPLAB Snap, ICD 4/5전원 및 고전압 프로그래밍 기능

레지스터 또는 비트 이름이 확실하지 않으면, 추측하지 말고 확인할 데이터시트 섹션을 알려주세요 (또는 컴파일러의 include 디렉토리에서 장치 헤더 pic16f18877.h 등을 읽으세요) — PIC 레지스터 이름은 서브-패밀리마다 다릅니다.

고전적인 PIC 실패를 방지하는 규칙

  1. 디지털 입력이 0으로 읽힘 → ANSEL. 대부분의 최신 PIC에서 핀은 전원 켜질 때 아날로그로 설정됩니다. 모든 디지털 입력에 대해 ANSELx 비트를 클리어하세요 (MCC: "Analog" 체크 해제).
  2. LATx에 쓰고, PORTx를 읽으세요. PORTx 비트에 쓰면 핀 레벨의 읽기-수정-쓰기가 발생하여 다른 출력을 변경할 수 있습니다 (무거운 부하, 빠른 토글). LAT 레지스터가 없는 부품은 섀도우 변수가 필요합니다.
  3. TRIS: 1 = 입력, 0 = 출력. 반대로 하기 쉽습니다.
  4. 주변장치 핀 선택 (PPS) 은 PPS 장치에서 UART/SPI/PWM 신호를 핀에 매핑해야 합니다. PPS1WAY = ON인 경우 리셋 후 한 번만 잠금 해제할 수 있으므로 MCC가 생성하도록 하세요.
  5. 설정 비트 는 오실레이터, 워치독, MCLR, LVP, 저전압 감지, 코드 보호를 결정합니다. MCC (또는 Configuration Bits 창 → Generate Source Code)에서 설정하고, 확인하지 않은 기본값으로 절대 남겨두지 마세요. 잘못된 오실레이터 = 아무것도 실행되지 않거나 모든 타이밍이 어긋납니다.
  6. _XTAL_FREQ (XC8) / FCY (XC16)는 실제 클록과 일치해야 합니다 — __delay_ms() 및 많은 계산이 이에 의존합니다.
  7. 8비트 원자성: PIC16/18에서 ISR과 공유되는 uint16_t/uint32_t는 여러 명령어에 걸쳐 읽히므로 읽기 주변에서 해당 인터럽트(또는 GIE)를 비활성화하세요. PIC24/dsPIC에서는 32비트 값에도 동일하게 적용됩니다.
  8. 하드웨어 호출 스택이 매우 작습니다 (오래된 PIC16에서 8단계, 향상된 PIC16F1에서 16단계, PIC18에서 31단계) 그리고 ISR도 단계를 사용합니다. 재귀 금지; XC8 경고 (1393) possible hardware stack overflow 와 빌드 출력의 예상 깊이를 주시하세요.
  9. 인터럽트 플래그: ISR에서 인에이블 비트와 플래그 비트를 모두 확인하고 (if (PIEx.xIE && PIRx.xIF)), 플래그를 클리어하고, 짧게 유지하세요. 주변장치 + 전역 인터럽트를 활성화하세요 (MCC: INTERRUPT_GlobalInterruptEnable()).
  10. MCC 재생성은 mcc_generated_files/를 덮어씁니다. 애플리케이션 코드는 자신의 .c/.h 파일에 배치하고, main.c는 얇게 유지하세요. MCC 병합 대화상자를 맹목적으로 수락하지 말고 검토하세요.
  11. 되돌릴 수 없거나 위험한 설정: 코드 보호(CP), 쓰기 보호, LVP 비활성화와 함께 MCLR 비활성화, 칩을 멈추게 하는 오실레이터 설정. 사용자의 장치에서 명시적 확인 없이 코드 보호를 활성화하거나 이러한 설정을 변경하지 마세요. Snap은 고전압 프로그래밍이 필요한 부품을 복구할 수 없습니다.

패밀리별 구문 (인터럽트, 지연, 설정, 메모리): references/families.md.

dsPIC33 (제어, DSP, 모터 제어, 디지털 전원)

dsPIC33은 PIC24 코어 구문에 DSP 엔진을 더한 것입니다. 추가 규칙:

  • FCY = FOSC/2; PLL 설정 및 클록 전환은 패밀리(EP vs CK/CH)마다 다릅니다 — MCC로 생성하고 보고된 주파수(PWM/ADC를 구동하는 보조 클록 포함)를 확인하세요.
  • 빠른 루프에서는 float 대신 Q15 고정소수점 (DSP 라이브러리 dsp.h, libq.h, 빌트인)을 사용하고, 모든 변수의 스케일링을 문서화하세요.
  • C에서 적분기와 출력을 명시적으로 클램프 하세요 — 일반 C 산술은 래핑됩니다. CORCON 포화는 DSP 엔진 연산만 보호합니다.
  • 제어 루프 = PWM으로 트리거된 고우선순위 ADC 인터럽트; 오실로스코프로 실행 시간을 측정하세요.
  • 출력을 활성화하기 전에 PWM 오류/전류 제한 입력을 구성 하고, 먼저 저전압에서 데드 타임을 테스트하세요 — 잘못된 PWM 코드는 하드웨어를 파괴합니다.
  • 치명적인 누산기 오버플로우 트랩(COVTE)을 활성화하세요. 일반 MAC 코드에서는 OVATE/OVBTE를 끄세요 (가드 비트는 사용하도록 설계됨).
  • dsPIC33CK/CH 대체 레지스터 세트는 일치하는 ISR 우선순위와 함께 __attribute__((interrupt, context))를 사용합니다 — shadow가 아닙니다.
  • dsPIC33CH는 듀얼 코어입니다: 두 개의 프로젝트, 핀 소유권, MSI 메일박스.

자세한 내용: references/dspic33.md.

빌드, 프로그래밍, 디버그

동작방법
IDE에서 빌드MPLAB X → Clean and Build (망치+빗자루). 출력에서 메모리 요약과 경고를 확인하세요
헤드리스 빌드prjMakefilesGenerator.sh <proj>.X@default 그런 다음 make -C <proj>.X CONF=default → dist/default/production/<proj>.X.production.hex
프로그래밍MPLAB X "Make and Program Device", MPLAB IPE, 또는 명령줄에서 ipecmd
디버그MPLAB X Debug Main Project with PICkit/Snap/ICD (디버그 빌드), 또는 순수 로직/타이머를 위한 MPLAB X 시뮬레이터 (하드웨어 없이)

프로그래밍은 장치를 변경합니다: ipecmd를 실행하기 전에 사용자와 부품 및 프로그래머를 확인하고, 확인 없이 절대 지우거나 보호하지 마세요. 전체 명령어, 프로그래머 차이점 및 연결 문제 해결: references/build-program-debug.md.

작동하지 않을 때

  • 아무것도 실행되지 않음: 설정 비트 (오실레이터 소스, WDT, MCLR), 전원, MCLR 풀업 (10 kΩ), 프로그래머가 장치를 리셋에서 해제했는지 (IPE "Release from Reset" / -OL).
  • 잘못된 속도/잘못된 보레이트로 실행됨: RSTOSC/FNOSC, PLL, 클록 분주기 (CDIV), _XTAL_FREQ 불일치.
  • 무작위 리셋: 부팅 시 리셋 원인 비트 읽기 (PCON/PCON0/RCON — references/families.md), 워치독이 클리어되지 않음, 스택 오버플로우 (STKOVF), 저전압 감지.
  • PIC24/dsPIC 갑작스러운 리셋 또는 정지: 트랩 핸들러 설치 (_AddressError, _StackError, _MathError, _OscillatorFail) — 주소 오류는 일반적으로 잘못 정렬된 16비트 액세스를 의미합니다.

참조 파일

파일다음 경우에 읽으세요
references/families.md특정 패밀리용 코드 작성/검토 시: 인터럽트 구문, 지연, 설정 비트, 메모리 모델, 원자성, 리셋 원인, 트랩, PIC32 캐시/DMA, XC8 최적화 및 메모리 팁
references/dspic33.md모든 dsPIC33 작업 시: 패밀리, XC-DSC, PLL/클록 전환, DSP 엔진 및 Q15 수학, ISR 컨텍스트/섀도우 레지스터, 수학 트랩, DMA, 고속 PWM/ADC 제어 루프, 듀얼 코어 CH, motorBench/전원 도구, 검토 체크리스트
references/mcc-and-project.md프로젝트 구조, MCC Melody vs Classic, 재생성 규칙, 코드 배치 위치, 주변장치 드라이버 (UART, I2C, ADC, 타이머, PWM, NVM/EEPROM), 저전력
references/build-program-debug.md도구 설치, 헤드리스 빌드, ipecmd 프로그래밍, PICkit/Snap/ICD 차이점, 디버깅 제한, "연결할 수 없음 / 장치 ID 불일치" 문제 해결, PC에서 PIC 코드 단위 테스트

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.

관련 스킬