第23回 プログラムを書き込む

今回はプログラムの書き込みと動作確認をします。といっても以前すでに確認済みですので復習となります。

今回の説明

回路を完成させるために以下の順序で説明しています。このエントリの説明は(4)「PICマイコンに書き込んで動作させる」の部分になります。

  1. LEDを電池と抵抗のみで光らせる回路を組み立てる
    PICマイコンの回路を組み立てる前に、まずはブレッドボードに慣れておくことにします。電池、抵抗、LEDのみを使って、ブレッドポード上に回路を組んでLEDを光らせてみます。ここでは電池、抵抗、LEDの回路記号と回路図の説明をして、回路図からブレッドボードに組む方法を説明します。まずはブレッドボードに慣れましょう!
  2. PICマイコンのベース回路を組む
    はじめの一歩の回路は、LEDを1秒に1回光らせるだけの回路です。この回路をブレッドボードに組み立てます。
  3. プログラムを作る
    LEDを1秒に1回光らせるプログラムを作成します。
  4. PICマイコンに書き込んで動作させる
    作成したプログラムをPICマイコンに書き込んで動作させてみます。
  5. ベース回路にスイッチを追加
    LEDの点滅をスイッチで開始させるために、ベース回路にスイッチを追加します。これまではLEDを光らせる、という出力制御をしましたが、今度はPICマイコンで外部から信号を入力する方法を確認します。
  6. ベース回路にブザーを追加
    スタートスイッチ付きの、1秒に1回光らせる回路を作りましたので、ブザーを追加してタイマーとして完成させます。

 

プログラムを書き込む方法

基礎編の「第17回 ブレッドボードの回路を動作させてみる」で、すでにプログラムの書き込みと動作確認をしていますので、今回は復習になります。

作成したプログラムをMPLABX IDEでビルドすると、PICマイコンに書き込むプログラムファイル(バイナリ、とも呼んだりします)が生成されます。このプログラムファイルを書き込むには書き込みツール(PICkit)を使用して書き込みます。以前説明した図を再掲しておきます。

PICマイコン開発概要

PICマイコンにプログラムファイルを書き込むには、PICマイコンに電源を接続して動作させる必要があります。電源を接続する方法は2通りあります。ひとつはパソコン→USBケーブル→PICkit経由で電源を供給する方法、もうひとつは電池ボックスなどを電子回路に接続して電源を供給する方法です。

PICkitから電源を供給した方が楽なような気もしますよね。特にブレッドボードで組み立てた場合、いちいち電池ボックスをつないで、電池ボックスのスイッチをONにして、、、というとちょっと面倒なので、どうせPICkitを回路に接続してプログラムを書き込むのであれば、PICkitから電源を供給してしまった方が楽なはずです。でも、どのような場合でもPICkitから電源を供給してプログラムを書き込めるわけではありませんので注意してください。また、MPLAB SNAPの場合は電源を供給する機能を持っていませんので注意してください。

この2通りの電源供給方法ですが、電池ボックスなどを電子回路に接続して電源を供給する方法はどのような場合でも使えます。一方、PICkitから電源を供給する方法は、「電子回路側の消費電流が少ない場合」のみ使える方法となります。

PICkitから電源を供給すると、電子回路はPICkitから供給された電源で電子回路が動作してしまいます。もしその動作する内容が、かなり電流を消費する場合、PICkitからの電流供給が足りなくなり、うまくプログラムが書き込めない場合があります。

では、PICkitから電子回路にどのくらいの電流が供給できるかというと、PICkitのマニュアルによるとPICkit3では30mA程度、PICkit4では50mAです。例えば、電子回路側に常時点灯する高輝度発光ダイオードが数個付けられている場合、高輝度発光ダイオードは20mAぐらいで光らせることがありますので、このようなケースではPICkitからの電源供給方法は使えないことになります。

とはいっても自分が作った電子回路の消費電流なんてよくわからないケースが多いと思いますので、ここまで詳しく説明してからなんですが、

・感覚的にPICkitからの電源供給で大丈夫そうで、電子回路側の電源接続が面倒だったら、PICkitからの電源供給で書き込んでみる
・なんかよくわからないエラーが出たら、電子回路側の電源供給に切り替える

といういい加減な方法がよいと思います。そのうち「あっ、これはダメそうだよね」みたいな感覚がつかめてくると思います。(無責任ですが)

 

PICkitから電源を供給する方法

電源供給方法は、プロジェクトのプロパティから設定します。まずはPICkitから電源を供給する方法の設定です。MPLAB SNAPの場合は電源供給機能がありませんので、この設定項目は表示されません。この記事の後半にある「電子回路側で電源を供給する方法」というセクションの説明を確認してください。

プロジェクト名のところを右クリックしてメニューを表示します。

Pic basic 23 project menu

以下のようなプロジェクトのプロパティダイアログが表示されます。

プロジェクトのプロパティダイアログ

続いて、左の “Categories:” の中から使用するPICkitに合わせて “PICkit3” または “PICkit4” を選択します。このプロパティ設定でPICkitからの電源供給方法を指定します。

PICkit電源供給設定1

右側の領域がPICkitの設定メニューになりますので、”Option categories:”のプルダウンメニューから “Power” を選択します。

PICkit電源供給設定2

PICkit3の電源供給方法(Power)の設定画面になりますので、PICkitから電源を供給する場合は “Power target circuit from PICkit” のチェックボックスをチェックします。供給しない場合は、チェックを外します。また、PICkitから電源を供給する場合は、供給電圧を指定します。今回のPIC12F1822は5VでOKなので5Vにします。なお、PICマイコンの中には低電圧モデル(3.3Vなど)もありますので、その場合は供給電圧の設定に十分注意します。

PICkit電源供給設定3

関係ないですが、”Power target circuit from PICkit” の “Power” は名詞ではなく動詞(他動詞)ですね。マイコン関係のアプリやデータシートは日本語がないものが多いので、英語の勉強も一緒にしてしまいましょう。

ここまで設定できたらOKボタンをクリックして、あとはプログラムをビルド、書き込みすることになります。

まずプログラムをビルドします。ウインドウ上のビルドアイコンをクリックします。ハンマーで何か作る(build)という意味合いで、ビルドボタンはハンマーのアイコンになっています。

Pic basic 23 build button

ビルドメッセージの中に、「BUILD SUCCESSFUL」という表示が出ていればビルド成功です。失敗した場合は赤文字でエラーの内容が表示されます。

Project built

ところで、このビルドボタンの隣に、ほうきマークが付いたハンマーのアイコンがありますよね。こちらもビルドボタンですが、上の単なるハンマーアイコンのビルドボタンとは何が違うのでしょうか。ちょっと遠回りしてこの違いを理解しておきましょう。

プログラムのビルドは、ビルドボタンを1回クリックするだけで終わりました。表向きは簡単に見えますが、実は裏では色々な作業が行われているんです。これからビルドの処理の概要について説明します(「ビルド処理」は「ビルドプロセス」とも呼ばれています。また、このビルド処理の概要は他の開発環境でも同じです。例えばiOSやmacOSの開発環境であるXcodeや、Windowsの開発環境であるVisualStudioなどでも、同じような処理になっています)。

今回ビルドしたプロジェクトは「main.c」の1つのプログラムファイルから構成されています。このプロジェクトをビルドすると、裏では以下の処理が行われています。

Pic basic 23 build process one file

ビルドボタンをクリックするとビルドできてしまいましたので、なんとなく「main.c」からすぐに実行コードか生成されているように思いますが、実際には上の図のようになっています。最初に「コンパイラ」(MPLABXの場合はXCコンパイラ)と呼ばれるアプリが、ソースコードである「main.c」から、一度中間コードに変換します。中間コードはオブジェクトファイルとも呼ばれて、ほとんどの開発環境では複数のファイルが生成されます。次に、「コンパイラ」が「リンカ」と呼ばれるアプリを呼び出して処理をバトンタッチします。「リンカ」は中間コードから実行コードに変換してビルド処理が終わります。(リンカによる実行コード生成処理は「リンク」と呼ばれます。またMPLABXの場合、リンカは「hlink」というアプリです)

ソースコードが「main.c」ひとつの場合は、プログラムファイルから実行コードを一気に生成してしまった方が早そうですよね。

ところで、ソフトウエア規模が大きくなってくると、プログラムのファイルは複数に分けるのが普通です。例えば、気象データを収集するプログラムを考えて見ます。このぐらいの機能のプログラムになってくると、「main.c」に全てのブログラムを記述すると見通しが悪くなってきます。そこで、プログラムをいくつかのファイルに分割して、例えば「main.c」は全体の制御を行うプログラム、「sensor.c」は温度センサーや湿度センサーの値を読み取る関数群、「sdcard.c」はSDカードのファイル書き込みを行う関数群、「utility.c」はセンサーから読み取った値をテキストに変換するなどのユーティリティ関数群、、、などです。

複数のソースコードがある場合も、以下のようにコンパイラが中間コードに変換し、リンカがそれらをまとめで実行コードに変換します。

Pic basic 23 build process multiple files

ここで、上の図でプログラムにバグがあり、「sensor.c」を書き換えた場合を考えます。当然ながら「sensor.c」が変更されますので、その中間コードも変更になります。つまり「sensor.c」は再度コンパイルする必要があります。ただし、「main.c」と「sdcard.c」のソースコードは変更されていませんので、再度コンパイルして中間コードを生成する必要はありません。

つまりプロジェクトが複数のソースコードファイルから構成されているとき、そのうちのひとつのファイルを修正して再度ビルドする場合、修正したソースコードのみコンパイルし、あとはリンクすればよいことになります。以下の図でピンク色の部分のみ変更されることになります。

Pic basic 23 build process normal build

このように、変更されたソースコードのみコンパイルして処理を行うビルドプロセスが、最初に行ったほうきマークが付いていないビルドボタンの処理です。

ところで、このように変更があったファイルのみ、差分で処理していく方式の場合、なんらかの理由で中間コードに矛盾が生じることがあります。例えば一度ビルドしたあと、コンパイラをバージョンアップした場合などです。このような場合に、一部のファイルを編集した場合、一部の中間ファイルは新しいバージョンのコンパイラで生成したもので、他の中間ファイルは古いバージョンのコンパイラで生成したもの、というように生成元のアプリが異なってしまい、矛盾が生じるケースなどです。

このように中間コードに矛盾が生じてしまった場合は、リンク時にエラーが発生したり、完成した実行コードがうまく動かないことがあります。このような場合は、一度中間ファイルを全部消して、全部のファイルをコンパイル、リンクすれば大丈夫です。以下の図で、赤色のファイルがコンパイル、リンク対象ファイルです。

Pic basic 23 build process clean build

このように一度中間ファイルを全部消して(クリーンにして)からビルドする方法を「クリーンビルド」と呼びます。MPLABXの場合、ほうきマークが付いたビルドアイコンをクリックすると、クリーンビルドが行われます。

なお開発環境によっては、「ビルド」という機能と「クリーン」という機能が別に用意されている場合もあります。この場合にクリーンビルドを行いたい場合は「クリーン」をしてから「ビルド」します。

ちょっと疑問が出てきました。今回作成したソースコード「main.c」はプロジェクトフォルダすぐ下のあるのですが、中間コードや実行コードはどこにあるのでしょうか。これらはプロジェクトフォルダの dist → default → production フォルダにあります。ただし見ない方がいいと思います。余計に疑問が増えます。

かなり遠回りしてしまいました。。。

いよいよ書き込みますので、PICkitをターゲットの電子回路に接続します。

PICkitのピンヘッダ接続

おそらくPICkitが不安定になっていると思いますので、左手で押さえながら、右手でマウスを操作して書き込みボタンをクリックします。

Pic basic 23 fuse button

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

Pic basic 23 fuse alert dialog

このダイアログの意味は「警告!これから書き込もうとしているPICマイコン(PIC12F1822)だけど、3.3Vタイプと5Vタイプがあって、3.3Vタイプのものに供給電圧5V設定するとまずいこと起こるよ。これからPICマイコンのIDを調べるんだけど、その時にぶっ壊れるかもしれないよ。ねぇ、いいの? 続けちゃっていいの? ねぇ、ねぇ? (意訳)」という感じです。5VタイプなのでOKボタンをクリックします。

書き込みが成功すると以下のように、Programming/Verify completeと表示されます。

Pic basic 23 program success

あとは、PICkitを外して、電子回路に電源を接続、スイッチを入れれば動作するはずです!

 

電子回路側で電源を供給する方法

もうひとつの書き込み方法として、電子回路側で電源を供給する方法があります。この方法は、電子回路側は通常動作させるときのように電源をつないでスイッチを入れるだけです。今回この入門で作成した回路の場合は以下のようになります。

Pic basic 23 outsource power

この状態でPICkitをコネクタに接続して、先ほどの方法と同様に書き込むをすればOKです。

 

電源供給方法に問題がある場合のエラー例

ところで、PICマイコンにプログラムを書き込む際に電源供給はうっかり間違えます。私だけかもしれませんが、よく間違えます。ということで、間違えるとどうなるか、確認しておきます。

まず、PICkitからは電源供給せずに電子回路側の電源を使用する場合です。この場合、電子回路側の電源を供給しないで書き込みを行うと、以下のメッセージが出力されました。

Pic basic 23 pickit no power

電子回路に誰も電源を供給していないわけですから、何かを読み取ることも書き込むこともできないわけです。そのため、”Target device was not found (could not detect target voltage VDD). You must connect to a target device to use PICkit 3.”というメッセージが表示されます。この意味は、「ターゲットデバイスが見つからなかったんですけど。PICkitを使うときはターゲットデバイスつなげるだろ、普通」(意訳)といった感じです。ひどい言われようですね。

次は、PICkitから電源供給するにもかかわらず、さらに電子回路側も電源供給してしまった場合です。二重に電源を供給するとどちらかが壊れそうな気もしますが、たまにやっちゃうんですよね。

この場合は私の環境では以下のメッセージが表示されました。

Pic basic 23 pickit power doubled

これはちょっと不可解なメッセージです。「ターゲット回路がPICkit3が供給できる電力よりも多くの電力を使うみたいなんで、外部電源つけてください。接続に失敗しました」ってことなんですが、回路もPICkitも壊れないにしても、このメッセージはある意味壊れてるような…

このメッセージ見て、すぐに「あっ、電子回路側の電源OFFにしないと」なんて気づく人はあんまりいなさそうですよね。

上のメッセージもそうですが、あまり的確なメッセージは表示されませんので、いずれにしても書き込みの際にこのようなメッセージが表示されたら、電源供給まわりを確認するのもとひとつ、と覚えておきましょう。

 

更新履歴

日付 内容
2016.11.6 新規投稿
2018.11.24 PICkit4記述追加
2019.5.18 MPLAB SNAPの情報追加