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 の失敗を防ぐルール
- デジタル入力が 0 を読み取る → ANSEL。 最近のほとんどの PIC では、ピンは電源投入時に アナログ として設定されます。デジタル入力ごとに
ANSELxビットをクリアしてください (MCC: 「Analog」のチェックを外す)。 LATxに書き込み、PORTxを読み取る。PORTxビットに書き込むと、ピンレベルのリードモディファイライトが行われ、他の出力が反転する可能性があります(大電流負荷、高速トグル)。LAT レジスタがない品番では、シャドウ変数が必要です。- TRIS: 1 = 入力、0 = 出力。 反対にしやすいので注意。
- Peripheral Pin Select (PPS) では、PPS 対応デバイスのピンに UART/SPI/PWM 信号をマッピングする必要があります。
PPS1WAY = ONの場合、リセット後 1 回しかロック解除できません。MCC に生成させてください。 - コンフィギュレーションビット は、オシレータ、ウォッチドッグ、MCLR、LVP、ブラウンアウト、コードプロテクトを決定します。これらは MCC (または Configuration Bits ウィンドウ → Generate Source Code) で設定し、確認していないデフォルト値のままにしないでください。オシレータが間違っていると、何も動作しないか、すべてのタイミングが狂います。
_XTAL_FREQ(XC8) /FCY(XC16) は実際のクロックと一致させる必要があります —__delay_ms()や多くの計算がこれに依存します。- 8 ビットアトミック性: PIC16/18 では、ISR と共有される
uint16_t/uint32_tは複数の命令で読み取られます。その割り込み(または GIE)を読み取りの間無効にしてください。PIC24/dsPIC では 32 ビット値に同じことが適用されます。 - ハードウェアコールスタックは非常に小さい (旧 PIC16 で 8 レベル、拡張 PIC16F1 で 16、PIC18 で 31)。ISR もスタックレベルを使用します。再帰は禁止です。XC8 の警告 (1393) possible hardware stack overflow と、ビルド出力に表示される推定深さに注意してください。
- 割り込みフラグ: ISR 内で、イネーブルビットとフラグビットの両方を確認し (
if (PIEx.xIE && PIRx.xIF))、フラグをクリアし、処理は短く保ちます。ペリフェラル割り込み + グローバル割り込みを有効にします (MCC:INTERRUPT_GlobalInterruptEnable()) 。 - MCC の再生成は
mcc_generated_files/を上書きします。 アプリケーションコードは自身の.c/.hファイルに記述し、main.cは薄く保ちます。MCC のマージダイアログは盲目的に承諾せずに確認してください。 - 元に戻せない/リスクのある設定: コードプロテクト (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.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 コードの単体テスト |