今回はプログラムの書き込みと動作確認をします。といっても以前すでに確認済みですので復習となります。
今回の説明
PICマイコン電子工作入門の基礎編は、次のステップで説明しています。
この記事の説明は「❹ PICマイコンに書き込んで動作させる」のうち、「プログラム書き込み手順」を説明します。
- LEDを電池と抵抗のみで光らせる回路を組み立てる
PICマイコンの回路を組み立てる前に、ブレッドボードの取り扱いに慣れておくことにします。電池、抵抗、LEDのみを使って、ブレッドボード上に回路を組み立ててLEDを光らせてみます。ここでは電池、抵抗、発光ダイオードの回路記号と回路図の説明をして、回路図からブレッドボードに組む方法を説明します。まずはブレッドボードに慣れましょう! - PICマイコンのベース回路を組む
PICマイコンのはじめの一歩の回路は、LEDを1秒に1回光らせるだけの回路です。
この回路をブレッドボードに組み立てます。 - プログラムを作る
LEDを1秒に1回光らせるプログラムを作成します。 - PICマイコンに書き込んで動作させる ⬅︎ 今回
作成したプログラムをPICマイコンに書き込んで動作させてみます。 - ベース回路にスイッチを追加
LEDの点滅をスイッチで開始させるために、ベース回路にスイッチを追加します。
これまではLEDを光らせる、という出力制御をしましたが、今度はPICマイコンで外部からスイッチの信号を入力する方法を習得します。 - ベース回路にブザーを追加
スタートスイッチ付きの、1秒に1回光らせる回路を作りましたので、ブザーを追加してタイマーとして完成させます。
プログラム開発の流れ復習
基礎編の「第17回 ブレッドボードの回路を動作させてみる」で、すでにプログラムの書き込みと動作確認をしていますので、今回は復習になります。
作成したプログラムをMPLABX IDEでビルドすると、PICマイコンに書き込むプログラムファイル(バイナリ、とも呼ぶこともあります)が生成されます。
生成されたプログラムファイルはPICkitを使用して書き込みます。

今回の記事では、プログラムを書き込む手順について一通り確認します。
プログラム書き込み時のマイコンを動作させるための電源供給
PICマイコンにプログラムファイルを書き込むには、PICマイコンに電源を供給して動作させる必要があります。
電源を供給する方法は2通りあります。
ひとつは「PC ➡︎ USBケーブル ➡︎ PICkit経由」で電源を供給する方法、もうひとつは「電池ボックスなどを電子回路に接続して電源を供給する方法」です。
PICkitから電源を供給した方が楽なような気もしますよね。
特にブレッドボードで組み立てた場合、いちいち電池ボックスをつないで、電池ボックスのスイッチをONにする、というのはちょっと面倒です。
どうせPICkitをPICマイコンに接続してプログラムを書き込むのであれば、PICkitから電源を供給してしまった方が楽なはずです。
でも、常にPICkitから電源を供給する、ということはできません。
大きく2つの理由があります。
一つは「PICkitの製品仕様」、もう一つは「電子回路側の消費電力」です。
そこで、それぞれの理由について簡単に理解しておきましょう!
PICkitの製品仕様
PCkitはいくつかの種類が販売されていますが、全ての製品でPICkitから電源供給できるわけではありません。
電源供給ができる製品は、高機能版の製品で、廉価版の製品では電源供給の機能が省かれています。
製品 | モデル | 製品からの電源供給 |
高機能版 | PICkit5・PICkit4 | できる |
廉価版 | MPLAB PICkit Basic・MPLAB Snap | できない |
「PICkit5」と「PICkit4」は、PICkitから電源を供給するか、外部から電源を供給するか選択することができます。
一方、「MPLAB PICkit Basic」と「MPLAB Snap」では、常に外部から電源を供給する必要があります。
電子回路側の消費電力
「PICkit5」と「PICkit4」はPICkitから電源を供給できるといっても、常にできるわけではないんです。
PICkitから電源を供給する場合、「電子回路側の消費電流が少ない場合」のみ使えます。
PICkitから電源を供給すると、書き込み先の電子回路はPICkitから供給された電源で動作します。
もし、動作する電子回路がかなり電力を消費する場合、PICkitからの電源供給が足りなくなり、うまくプログラムが書き込めない場合があります。
PICkitから供給できる電力(電流)は、「PICkit5」「PICkit4」ともに50mAです。
例えば、電子回路にLEDが何個も接続されていたり、モーターが接続されている場合、50mAでは足りないことがあります。
この入門シリーズで製作する電子回路は、必要な電流は多くても10mA程度です。
「PICkit5」「PICkit4」をお使いの場合は、PICkitから電源を供給する方法で問題ありません。
それでは、PICkitから電源を供給してプログラムを書き込む方法と、外部から電源を供給する方法について、その手順を確認しましょう!
PICkitから電源を供給して書き込む方法
この方法は「PICkit5」「PICkit4」のみ可能です。
PICkitから電源を供給する場合、書き込みを行う前にプロジェクトの設定を行う必要があります。
これから、❶プロジェクトの設定手順と、❷書き込み手順を説明します。
❶ プロジェクトの設定手順
PICkitの電源供給方法は、プロジェクトのプロパティから設定します。
プロジェクト名を右クリックするとメニューが表示されますので、一番下の「Properties」を選択します。

次のような設定画面が表示されますので、❶ 左側の「Categories」でPICkitをクリックします。クリックすると右側の領域にPICkitの設定が表示されますので、❷ 「Option Categories」メニューから「Power」を選択します。

次のような設定画面になります。ここで、PICkitの電源供給を設定します。

最初に❶「Power target circuit from PICkit」のチェックボックスにチェックをつけます。(供給しない場合は、チェックを外すことになります)
次に、供給電圧を指定します。今回の回路は5Vで動作させますので、❷「Voltage Level」に「5.0」と入力します。(5.0Vに設定されます)
ここまで設定できたらOKボタンをクリックして、あとはプログラムをビルド、書き込みすることになります。
❷ 書き込み手順
最初にプログラムをビルドして、そのあと書き込みを行います。
「ビルド」とは、プログラムをPIC12F1822が理解できるコードに変換する作業です。
ビルドするときは、ウインドウ上のハンマーの形をしたボタン(ビルドボタン)をクリックします。ハンマーで何か作る(Build)という意味合いで、ビルドボタンはハンマーのアイコンになっています。

ビルドが終わると下のウィンドウに結果のメッセージが表示されます。

このメッセージの中に「BUILD SUCCESSFUL」という表示が確認できればビルド成功です。
失敗した場合は赤文字でエラーの内容が表示されますので、もう一度プログラムの内容を確認後、再度ビルドしてみます。
次はビルドしたコードをPICマイコンに書き込みます。
PICkitをターゲットの電子回路に接続します。

おそらくPICkitが不安定になっていると思いますので、これからの作業は左手でPICkitを押さえながら、右手でマウス作業しましょう!
PICマイコンに書き込むときは、ウインドウ上の緑色矢印が下向きのボタン(書き込みボタン)をクリックします。

書き込み処理が始まると、次のようなダイアログが出てきます。(「Do not show this message again」というチェックボックスにチェックを入れると、以降は表示されません)

このダイアログの意味は次のような感じです。
警告!!!
これから書き込もうとしているPICマイコン(PIC12F1822)は、3.3Vタイプと5Vタイプがあって、3.3Vタイプのものに供給電圧5V設定するとまずいこと起こるよ。これからPICマイコンの型番を調べるんだけど、その時にぶっ壊れるかもしれないよ。壊れても知らないよ。続けちゃっていいの? (意訳)
問題ないのでOKボタンをクリックします。
書き込み後、下の領域に次のように「Programming/Verify complete」と表示されれば書き込み成功です!

書き込み完了後もPICkitから電源が供給されたままですので、すぐにLEDの点滅が始まります。
そのままでもいいですが、PICKitを外して電池ボックスを接続してスイッチをONにするとLEDが点滅しますので、ぜひ確認してみてください。
この手順では「プログラムをビルド」➡︎「PICマイコンに書き込み」という2つのステップで行いました。
実は、書き込みボタンを押すだけで「ビルド」と「書き込み」が行われます。
「ビルド」ボタンはあまり必要ないように思いますが、プログラムが正しくビルドできるか確認したいときもありますよね。そのような時は「書き込み」ボタンではなく「ビルド」ボタンで確認するようにします。
外部から電源を供給する方法
もうひとつの書き込み方法として、電子回路側で電源を供給する方法があります。
この方法は、電子回路側は通常動作させるときのように電源をつないでスイッチを入れるだけです。
今回の基礎編で製作した回路の場合は次のようになります。
この状態でPICkitをコネクタに接続して、書き込みをすればOKです。
書き込み手順は、上のセクション「PICkitから電源を供給して書き込む方法」の「書き込み手順」をご確認ください。
電源供給方法に問題がある場合のエラー例
ところで、外部から電源を供給する場合、電源をONにすることを忘れてしまうこともあります。
このとき、次のようなエラーメッセージが表示されます。

エラーの内容が赤文字で表示されています。
意味は、「プロジェクトの設定は外部電源供給になってますが、電源が接続されてないみたいですよ。もう一度電源の接続を確認して書き込みしてみてください。今回は残念でした」という内容です。
【補足】ビルドメニュー
ところで、このビルドボタンの隣に、ほうきマークが付いたアイコンがあります。クリーンビルドボタンとも呼ばれます。

こちらもビルドボタンですが、左側の単なるハンマーアイコンのビルドボタンとは何が違うのでしょうか。
最後に補足として、このボタンの働きから、MPLAB X IDEのビルド処理を詳しく理解していきます。
プログラムのビルドは、ビルドボタンを1回クリックするだけで終わりました。表向きは簡単に見えますが、実は裏では色々な作業が行われているんです。
これからビルドの処理の概要について説明します。
また、このビルド処理の内容は他の開発環境でも同じです。例えばiOSやmacOSの開発環境であるXcodeや、Windowsの開発環境であるVisualStudioなどでも、同じような処理になっています。
基本的なビルド処理
今回ビルドしたプロジェクトは「main.c」の1つのプログラムファイルから構成されています。このプロジェクトをビルドすると、裏では以下の処理が行われています。
ビルドボタンをクリックするとビルドできてしまいましたので、なんとなく「main.c」からすぐに実行コードか生成されているように思いますよね。(「実行コード」とはPICマイコンが処理できる形式のプログラムです)
でも、実際には上の図のようになっています。
最初に「コンパイラ」と呼ばれるアプリが、ソースコードである「main.c」から、一度中間コードに変換します。中間コードはオブジェクトファイルとも呼ばれて、実行コードを作成するための材料のようなものです。
次に、「リンカ」と呼ばれるアプリに処理をバトンタッチします。
「リンカ」は中間コードを実行コードに変換します。(リンカによる実行コードの生成処理は「リンク」と呼ばれます。リンカは「hlink」というアプリです)
このビルドの過程を見ると、ソースコードが「main.c」ひとつですので、プログラムファイルから実行コードを一気に生成してしまった方が早そうですよね。
でも、ソフトウエア規模が大きくなってくると状況が変わってきます。
規模が大きくなると、プログラムファイルを複数に分けるのが普通です。
そこで、これから気象データを収集するプログラムを例にこの状況を考えていきます。
プログラムの規模が大きくなってくると、「main.c」に全ての処理を記述すると見通しが悪くなってきます。
そこで、プログラムをいくつかのファイルに分割します。
例えば「main.c」は全体の制御を行う処理、「sensor.c」は温度センサーや湿度センサーの値を読み取る処理、「sdcard.c」はSDカードのファイル書き込みを行う処理、といった具合です。
複数のファイルがある場合、次のようにコンパイラがそれぞれのファイルを中間コードに変換し、リンカがそれらをまとめで実行コードに変換します。
ここで、上の図でプログラムにバグがあり、「sensor.c」を書き換えた場合を考えます。
当然ながら「sensor.c」が変更されますので、その中間コードも変更になります。つまり「sensor.c」は再度コンパイルする必要があります。ただし、「main.c」と「sdcard.c」のソースコードは変更されていませんので、再度コンパイルして中間コードを生成する必要はありません。
つまりプロジェクトが複数のソースコードファイルから構成されているとき、そのうちのひとつのファイルを修正して再度ビルドする場合、修正したソースコードのみコンパイルし、あとはリンクすればよいことになります。
このときのビルド処理では、次の図でピンク色の部分のみ変更されることになります。
このように、変更されたソースコードのみコンパイルして処理を行うビルドが、ほうきマークが付いていないビルドボタンの処理です。
ところで、このように変更があったファイルのみ、差分で処理していく方式の場合、なんらかの理由で中間コードに矛盾が生じることがあります。例えば一度ビルドしたあと、コンパイラをバージョンアップした場合などです。
このような場合に、一部のファイルを編集した場合、一部の中間ファイルは新しいバージョンのコンパイラで生成したもので、他の中間ファイルは古いバージョンのコンパイラで生成したもの、というように生成元のアプリが異なってしまい、矛盾が生じるケースなどがあります。
このように中間コードに矛盾が生じてしまった場合は、リンク時にエラーが発生したり、完成した実行コードがうまく動かないことがあります。
このような場合は、一度中間ファイルを全部消して、全部のファイルをコンパイル、リンクすれば大丈夫です。
次の図で、赤色のファイルがコンパイル、リンク対象ファイルです。特に、「main.c」と「sdcard.c」は変更がないのにコンパイルしているところがポイントになります。
このように、一度中間ファイルを全部消して(クリーンにして)から、ビルド処理する方法を「クリーンビルド」と呼びます。
MPLAB X IDEのウィンドウ上にある、ほうきマークが付いたビルドアイコンをクリックすると、クリーンビルドが行われます。
なお開発環境によっては、「ビルド」という機能と「クリーン」という機能が別に用意されている場合もあります。この場合にクリーンビルドを行いたい場合は「クリーン」をしてから「ビルド」します。
ところで、今回作成したソースコード「main.c」はプロジェクトフォルダすぐ下のあるのですが、中間コードや実行コードはプロジェクトのフォルダでは見当たりませんよね。
これらのファイルは実際のりプロジェクトフォルダの「dist」フォルダ ➡︎ 「default」フォルダ ➡︎「production」フォルダにあります。(とはいっても見ない方がいいかもしれません。余計に謎が増えそうです)
更新履歴
日付 | 内容 |
---|---|
2016.11.6 | 新規投稿 |
2018.11.24 | PICkit4記述追加 |
2019.5.18 | MPLAB SNAPの情報追加 |
2022.1.28 | MPLAB SNAPの情報削除 |
2025.4.11 | PICkitの情報更新、MPLAB PICkit Basic情報追加、説明順序変更 |
いつも参考にさせてもらいありがとうございます
pickit3からpickit4にハードウェアを新調し入れ替えしたいのですが
いつものように書き込みが進みません
OUTPUT内容は以下
Connecting to MPLAB PICkit 4
Currently loaded versions:
Application version………..00.04.15
Boot version………………01.00.00
PCB version……………….3
Script version…………….00.05.85
Script build number………..d33d758f73
Tool pack version …………2.1.1763
の状態でフリーズしてしまうのですが
何か3と4で設定を変えないとダメなのでしょうか
pickit3であれば問題なく書き込みできます
お時間のある時にでもご返信いただけると幸いです
ご質問どうもありがとうございます。
こちらで、PIC12F1822の回路で、第17回の記事にあるプログラムを使用して確認してみました。結論としてはご質問いただいたような現象は発生しませんでした。ただ、気になる点がございますので、以下、状況含めてまとめます。
確認した環境は以下です。
OS: Windows11とmacOS Sonama
MPLABX IDE: Version 6.15
PICKit: PICKit3とPICkit4
いずれの環境、PICkitでも問題なく書き込み、PICは動作しました。
まず、PICkit4で正常に書き込みができたときのログは次のようなものでした。
——-
Connecting to MPLAB PICkit 4
Currently loaded versions:
Application version………..02.00.85
Boot version………………01.00.00
PCB version……………….3
Script version…………….00.05.85
Script build number………..d33d758f73
Tool pack version …………2.1.1763
PICkit 4 is supplying power to the target (5.00 volts).
Target device PIC12F1822 found.
Device Revision Id = 0x9
Device Id = 0x2700
Calculating memory ranges for operation…
Erasing…
The following memory area(s) will be programmed:
program memory: start address = 0x0, end address = 0xf
program memory: start address = 0x7d0, end address = 0x7ff
configuration memory
Programming/Verify complete
——-
また、PICkit4に何も接続しない状態で書き込みしてみました。エラーは出るものの、途中まで作業は進み、ログは次のようなものでした。
——-
Connecting to MPLAB PICkit 4
Currently loaded versions:
Application version………..02.00.85
Boot version………………01.00.00
PCB version……………….3
Script version…………….00.05.85
Script build number………..d33d758f73
Tool pack version …………2.1.1763
PICkit 4 is supplying power to the target (5.00 volts).
Target Device ID (0x0) is an Invalid Device ID. Please check your connections to the Target Device.
——-
ご連絡いただいたログを見ると、Tool pack versionのところで止まっていますので、MPLABX IDEがPICkitから情報を取得した後、PICkit4から電源を供給するときに何かが原因でその先に進まなくなっているようです。
すぐに原因特定できず申し訳ございませんが、まず、使用されたMPLABX IDEのバージョンを教えていただけませんでしょうか。
ちょっと気になるのが、PICkit4の情報の「Application Version」です。その他の項目は私のログと同じ数字なのですが、このApplication Versionが異なっています。
Application version………..00.04.15
と表示されていますので、もしかしたらこのバージョンが何か影響している可能性もあるかな、と思いました。
お手数ですが、よろしくお願いいたします。
迅速なご返信いただきありがとうございます
MPLAB Xのバージョンは6.15でした
macのバージョンは12.5 Montereyです
pickit4のバージョンをどうにかアップデートする方法が何かあるのでしょうかね…
情報どうもありがとうございます!
MPLABX IDEもOSも問題なさそうですね。
となると、PICkit4が何らかの原因でファームのアップデートができないのかもしれませんね。
以下にPICkit4のユーザガイドのPDFがありますので、トラブルシュートを一度試された方がいいかもしれません。
https://ww1.microchip.com/downloads/jp/DeviceDoc/50002751C_JP.pdf
このPDFのp.35下の方に、PICkitをブートローダモードにする手順が書かれています。この手順に従って、PICkit4をブートローダモードにした状態で、MPLABX IDEから書き込みしていただくと、最新ファームがダウンロードできるかもしれません。
これでも通信できない場合は、p.36の工場出荷時の状態に戻すという手段がありますが、ブートローダで解決できるといいのですが…
ご連絡いただきありがとうございます
MPLAB X IDE→
Debug→
Farmware Recovery→
WARNINGが出るが気合を入れて手順に沿って慎重に進む
で繋ぎ直すと自動で最新のファームウェア
(現在Application version………..02.00.85)
にアップデートされ
無事に書き込み完了しました(緑のランプになるんですね)
めちゃくちゃ感謝です!
本体に尖ったモン刺さないといけないのでマジで大丈夫か?と
かなりヒヤヒヤもんでしたが
同じトラブルに遭遇した方にもこの書き込みがお役に立ってもらえればいいですね
この度はありがとうございました
また引き続き参考にさせていただきます
ご連絡いただきどうもありがとうございます!
動きましたか!本当によかったです!
私も一度工場出荷時状態に戻したことがありますが、本体に針をさして…というのはちょっと勇気がいりますよね…
ご報告いただきどうもありがとうございました。他に困っている方がいたら役立つと思います!
どうもありがとうございました