MPLAB VScode Extention入門
はじめに
今年に入ってMPLABの公式なVScode拡張機能がリリースされ、触ってみたところかなり良いと感じたのでチュートリアル的な何かを残すことにしました。人によって評価が分かれる可能性があり、とりあえず以下の項目いずれかに当てはまる方に向けて書くことにします。
- これからPICマイコンを始める
- VScodeを好んでいる・使い慣れている
- エディタとしてのMPLAB X IDEに不満を持っている
- MPLAB X IDEのGUI機能(MCCなど)をあまり使っていない
環境
- Windows 11
各種インストール
MPLAB X
既にPICKIT4 or 5をお持ちのブルジョワの皆様は、普通に最新版をインストールしてください。そうでない方は、PICKIT3(安い!あとで登場します)に対応している最後のバージョンであるv6.20のインストールをおすすめします。ここから過去のバージョンのインストーラをダウンロードできます。
なお今回の主役は拡張機能とコンパイラなのでIDE(Integrated Development Environment)は不要で、コンパイルされたhexファイルをマイコンに書き込むために最低限IPE(Integrated Programming Environment)が必要です。これら二つのインストーラは共通ですが、実行後のセットアップ画面で「IDEをインストールしない」という選択をすることができます。もっともPCのストレージに余裕があれば、何も考えずに「Next」を連打しても構いません。

今回の記事で最低限必要なものだけにチェックを入れた状態
コンパイラ
今回の記事では8ビットマイコンを扱うので、XC8をインストールします。ここから最新版のインストーラをダウンロードします。
VScode
本体のインストール方法は流石に割愛します。拡張機能を探す検索バーで「MPLAB」と入力してみるとそれっぽいものがいくつもヒットしますが、とりあえず以下が入っていれば動きます。
- MPLAB
- Clangd for MPLAB
- CMake Runner for MPLAB
- Platform for MPLAB
- Services for MPLAB
- Toolchain Support for MPLAB
- User Interfaces for MPLAB
試していないので、これが究極な最小構成かどうかは分かりません。Microchip社はひとまとまりの機能ごとに拡張機能を分けてリリースする方針らしいですが、なかなか一長一短であると感じます。
元々MPLABX IDEを使っていてVScode環境に移行したい人には、
- Project Importer for MPLAB
なんてのもあります。
プロジェクトの作成
サイドバーのMPLABアイコンをクリックして、「新しいプロジェクト」を始めます。今回のプロジェクト名は「Lchika_12F675」としました。12F675とはすなわちマイコンにPIC12F675を使うよということで、今回はその前提で話を進めます。しかしこれは筆者がPIC12F675を大量に在庫しているからであり、新しく手を出す人はもっと新しくて安いものを選んでも良いと思います。
あとは「デフォルトの場所」「マイコンの型番(ここではPIC12F675)」「コンパイラ(XC8が出てくるはず)」を順に選択すれば、Users/MPLABProjectsの中にLchika_12F675なるプロジェクト用ディレクトリが作成されます。


← 黄色く囲ったバナーが「新しいプロジェクト」 | プロジェクト用ディレクトリの内部 →
TIP
C/C++を触ったことがある方の多くが、Microsoft製の「C/C++」なる拡張機能をインストールしていると思います。この拡張機能のIntelliSense(VScode上でのコード補完機能)がClangd for MPLABと競合する場合、ポップアップに従って「(C/C++の)インテリセンスを無効にする」として再読み込みします。するとこのプロジェクト内ではClangd for MPLABが優先され、.vscode/setting.jsonに"C_Cpp.intelliSenseEngine": "disabled"の一行が追加されます。

サンプルコード
プロジェクト名の通り、LEDをチカチカさせます。
#include "header.h"
int main(void) {
ANSEL = 0x00; // 全てのピンをデジタルI/Oに設定
ADCON0 = 0x00; // A/D変換器不使用
CMCON = 0b00000111; // コンパレータ不使用
TRISIO = 0b00001000; // GP3は元から入力専用ピン、他は出力
GPIO = 0; // 全てのピンをLOWに設定
while (true) {
LED = true;
__delay_ms(1000);
LED = false;
__delay_ms(1000);
}
return 0;
}#include <xc.h>
#define _XTAL_FREQ 4000000 // クロック周波数 4MHz
#pragma config FOSC = INTRCIO // 内部クロック 使用
#pragma config WDTE = OFF // Watch-Dogタイマー 不使用
#pragma config PWRTE = ON // パワーアップタイマー 使用
#pragma config MCLRE = OFF // リセットピン 不使用
#pragma config BOREN = ON // Brown-Out検出 使用
#pragma config CP = ON // プログラム保護 使用
#pragma config CPD = ON // データ保護 使用
#define LED GP5コンパイル
VScode上のコマンドパレット(F1キー)から「MPLAB」と入力すると「CMAKE: ビルドします」という候補が出てくるので、これを実行します。すると.out/Lchica_12F675/にdefault.hexが生成されるはずです。

書き込み
今しがた生成されたdefault.hexをマイコンに書き込みます。
PICKIT3
庶民の筆者は書き込みにはPICKIT3のパチモン互換品を使っています。今のところAliExpressやAmazonにて3000円前後で入手できて、最もリーズナブルであると思われます。
TIP
(少なくともPIC12F675の場合)書き込みの際にはマイコンに+5Vを与えてやる必要があり、これは本来であればPICKIT3とは別で電源(乾電池とか)を用意してやる必要があるのですが、裏ワザとしてPICKIT3本体に供給されている+5Vをそのまま拝借する民間療法があります。なんちゃってバスパワー化です。ここでは敢えて詳しく書きませんが、PICKIT3の基板上で適宜ジャンパを1本追加すれば良いです。


筆者は剥き身で使っています。アダプターを自作してかなり便利になりました。
CLIツール
MPLAB X IPEを立ち上げてGUIで書き込んでも良いのですが、このIPEにはコマンドラインで使える書き込み用のexeファイルが付属しています。C:\Program Files\Microchip\MPLABX\v6.20\mplab_platform\mplab_ipeにipecmd.exeなるexeファイルがあることを確認してください。これを下記のコマンドでVScode上のターミナルから呼び出せば、VScodeに張り付いたまま書き込み作業まで完結できます。
& "C:\Program Files\Microchip\MPLABX\v6.20\mplab_platform\mplab_ipe\ipecmd.exe" --% -P12F675 -TPPK3 -M -F"C:\Users\asumo\MPLABProjects\Lchica\out\Lchica\default.hex"長いので筆者はps1ファイルとして実行しています。見ての通り、マイコンやライターに応じて-P12F675や-TPPK3のオプションを変更すれば良いです。ファイル内で改行すると正しいはずなのに何故か怒られてしまうのが目下の不思議です。
さて、上手くいけば次のようにして書き込みが完了します。failedになった場合は、一度PICKIT3を繋ぎなおすと治ることがあります。
PS C:\Users\asumo\MPLABProjects\Lchica_PIC12F675> .\writehex.ps1
DFP Version Used : PIC10-12Fxxx_DFP,1.8.184,Microchip
*****************************************************
Connecting to MPLAB PICkit 3...
Currently loaded firmware on PICkit 3
Firmware Suite Version.....01.56.09
Firmware type..............Midrange
Target voltage detected
Target device PIC12F675 found.
Device Revision ID = 10
Device Erased...
Programming...
The following memory area(s) will be programmed:
program memory: start address = 0x0, end address = 0x3ff
Programming/Verify complete
PICKIT3 Program Report
2025-09-23, 06:04:51
Device Type:PIC12F675
Program Succeeded.
Operation Succeededプロジェクト管理のヒント
以上で基本的なことは一通り終わりです。ここからは少しだけ延長して、ソースファイルを上手く取りまとめる方法を紹介します。
ファイル群の多層化
任意のソースファイルをコンパイルの対象に含めたり含めなかったりしたいときは、.vscode/Lchika_12F675.mplab.jsonを編集してやればCMakeに反映されます。自前でuser.cmakeを追加する面倒を回避できます。
...
"fileSets": [
{
"name": "default",
"files": [
{
"include": "**/*", // ←デフォルトでは多分こうなっている
"include": "src/**/*", // ←例:srcディレクトリ内部に限定
"exclude": "**/(_build|out|cmake|.vscode)/**/*"
}
]
}
]
...なんちゃってHAL
別の型番のマイコンを使って同じ処理を実現したくなったときは、「新しいプロジェクト」から「既存のフォルダ」に別のプロジェクトを作成します。今回はPIC12F1822用に「Lchika_12F1822」を作成しました。


← 「新しいプロジェクト」 | 「既存のフォルダ」 →
すると.vscode/に新たにLchika_12F1822.mplab.jsonが生成されます。ややこしいので、今いるルートディレクトリLchika_12F675/は単に「Lchika」と改名してしまいましょう。こうして、2つのプロジェクトが混じって以下のような構成になりました。
Lchika. # (元「Lchika_12F675」)
│
│ header.h
│ main.c
...
├─.vscode
│ c_cpp_properties.json
│ Lchika_12F1822.mplab.json # ←New!
│ Lchika_12F675.mplab.json
│ settings.json
...お察しの通り、マイコン間で共通の関数は括りだして一元的な管理をしようという魂胆です。例として、筆者のとあるリポジトリでは以下のような構成になっています。
NormalTrueBypass.
│
├─.vscode
│ c_cpp_properties.json
│ PIC12F1822.mplab.json
│ PIC12F629.mplab.json
│ PIC12F675.mplab.json
│ settings.json
...
└─src
│ common.c
│ header.h
│ main.c
│
├─PIC12F1822
│ PIC12F1822.c
│ PIC12F1822.h
│
└─PIC12F6XX
PIC12F6XX.c
PIC12F6XX.hマイコン間で共通の処理はcommon.cに括りだして、マイコンごとに書き方が異なる部分をPIC12F1822/やPIC12F6XX/で吸収しています。ここで先述の通り.vscode/*.mplab.jsonをそれぞれ編集しておけば、コンパイル時にそのマイコンに必要なソースファイルだけを取捨選択できます。例として、上記リポジトリの.vscode/PIC12F1822.mplab.jsonは以下のようになっています。
...
"fileSets": [
{
"name": "default",
"files": [
{
"include": "src/*|src/PIC12F1822/**"
}
]
}
]
...ビルド時にはどのプロジェクトをビルドするのか訊いてくれますし(下図)、default.hexはちゃんと.out/Lchica_12F1822/や.out/Lchica_12F1822/にマイコンごとに出力されます。

おかえりなさい!629にする?675にする?それとも…
おわりに
思ったより長くなってしまいましたが、全工程をVScode上で完結できて嬉しいということが伝わったなら幸いです。VScode大好き!
