PIC & dsPIC ファームウェア

MPLAB X IDE、XC8/XC16/XC-DSC/XC32 コンパイラ、MPLAB Code Configurator (MCC Melody/Classic) を使用した Microchip PIC および dsPIC ファームウェア開発を支援します。

PIC & dsPIC ファームウェア とは?

このスキルは、PIC16、PIC18、PIC24、dsPIC33 (F/EP/EV/CK/CH デュアルコア/A)、PIC32 シリーズ向けのファームウェア開発に特化しています。コンフィギュレーションビット、オシレータ/PLL 設定、TRIS/LAT/PORT/ANSEL 制御、PPS (ペリフェラルピンセレクト)、ファミリ別の割り込みモデル、8/16 ビットアトミック性、ハードウェアスタック制限など、PIC 特有の落とし穴を回避するためのベストプラクティスを網羅しています。特に dsPIC33 向けには、DSP エンジンと Q15 固定小数点演算、高速 PWM/ADC 制御ループ、モーター制御、デジタル電源開発に関する高度なルールを提供します。また、MPLAB X IDE でのビルド、ヘッドレスビルド、PICkit 4/5、MPLAB Snap、ICD 4/5 (ipecmd) を使用したプログラミングとデバッグ、リセット原因やトラップの診断方法もカバーしています。このスキルは、ユーザーが PIC または dsPIC 部品番号、MPLAB X、MCC、コンパイラ名、プログラマなどを言及した際に自動的に読み込まれ、`embedded-c-cpp` スキルと組み合わせて使用することで、C 言語の一般的な品質管理やテストもカバーします。

対応~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電源供給能力と高電圧プログラミング機能に影響します

レジスタやビット名が不明な場合は、推測せずに、どのデータシートのセクションを確認すべきか(またはコンパイラのインクルードディレクトリにあるデバイスヘッダ pic16f18877.h などを読むべきか)を伝えてください。PIC のレジスタ名はサブファミリ間で異なります。

古典的な PIC の失敗を防ぐルール

  1. デジタル入力が 0 を読み取る → ANSEL。 最近のほとんどの PIC では、ピンは電源投入時に アナログ として設定されます。デジタル入力ごとに ANSELx ビットをクリアしてください (MCC: 「Analog」のチェックを外す)。
  2. LATx に書き込み、PORTx を読み取る。 PORTx ビットに書き込むと、ピンレベルのリードモディファイライトが行われ、他の出力が反転する可能性があります(大電流負荷、高速トグル)。LAT レジスタがない品番では、シャドウ変数が必要です。
  3. TRIS: 1 = 入力、0 = 出力。 反対にしやすいので注意。
  4. Peripheral Pin Select (PPS) では、PPS 対応デバイスのピンに UART/SPI/PWM 信号をマッピングする必要があります。PPS1WAY = ON の場合、リセット後 1 回しかロック解除できません。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 の代替レジスタセットは、__attribute__((interrupt, context)) と、それに対応する ISR 優先度を使用します(shadow は使用しません)。
  • dsPIC33CH はデュアルコアです: 2 つのプロジェクト、ピン所有権、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 (PICkit/Snap/ICD 使用、デバッグビルド)、または純粋なロジック/タイマのハードウェアなしデバッグには MPLAB X Simulator

プログラミングはデバイスを変更します。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.mddsPIC33 関連の作業全般: ファミリ、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.

関連スキル