第32回 PICマイコンのプログラムデバッグ(1)

前回作成したプログラムをMPLABX IDEのデバッグ機能を使用して動作させます。

デバッグ機能とは?

今までの記事で、いくつかチャレンジ課題に挑戦していただきましたが、一発でプログラムが動作せずに困った経験はないでしょうか。自分の場合、チャレンジ課題のプログラムもそうですが、記事に載せている大半のプログラムは、一発でうまく動くことは少ないんです。

PICマイコンにプログラムを書き込んで、意図した通りに動かない場合、なんだかPICマイコンの中でプログラムがどう動いているのか実際に確認したくなりますよね。

デバッグ機能は、このような時のために用意されています。PICマイコンの中でプログラムがどのように動いているか確認しながら動作させることができる機能です。

と説明されても、いまいちどうやって確認できるのか具体的にわからないですよね。そこで、習うより慣れろということで、前回作成した動作確認用プログラムを使ってデバッグ機能を動かしてみます。

 

動作確認プログラムのデバッグで行うこと

前回作成した動作確認プログラムは、main関数内では温湿度・気圧センサモジュールのチップIDを取得するだけの動作でした。

void main(void) {

// 動作周波数設定
OSCCON1bits.NDIV = 0b0000;  // 分周1:1
OSCFRQbits.HFFRQ = 0b010;   // 4MHz

// ピン属性設定
ANSELC = 0b00000000;
TRISC  = 0b01000000;

// SPI信号線初期設定
SPI_SCK  = 0;  // クロックを0
SPI_MOSI = 0;  // マスタ→スレーブを0
SPI_CSB  = 1;  // チップセレクトを1(=無効)

// 0xD0に格納されているチップIDを読み取る
uint8_t chipid = 0;

chipid = spiRead1ByteData(0xD0);

// ここで動作停止
while(1){
}

}

このように、PICマイコンの動作設定を行なったあと、取得したチップIDの値はただ変数(chipid)に入れるだけで、LCDモジュールに表示することはありませんので、人間が外から確認することができません。このプログラムを書き込んで動作させても、外から見ると動いているのか動いていないのかすらわかりません。

そこで、デバッグ機能を使って、実際にPICマイコンを動作させてchipidの中身をみてみることにします。これから、PICマイコンを実際に動作させて、spiRead1ByteData関数を実行した後にchipidに入っている値を確認します。

なお、プログラムのデバッグはMPLABX IDEとPICマイコンが通信しながら行いますので、デバッグ動作中はPICKIT3を接続したまま使用することになります。

PICKIT3を接続すると物理的に安定しませんので、今まではプログラム書き込み時に片手で押さえていたかもしれません。デバッグ機能を使用する場合、デバッグ中PICKIT3を接続したままにしますので、両手が空くようにPICKIT3をうまく固定できるようにしておきましょう。

それでは、PICKIT3をブレッドボードのピンヘッダに接続したら、MPLABX IDEでプロジェクトを開き、電池ボックスの電源を入れましょう。

 

デバッグ手順その1

今回の「プログラムの特定の行の変数の値を確認する」などのように、プログラムの特定の行の実行結果の状態を確認したい場合、PICマイコンにはその前の行までは普通に処理を行なってもらい、指定した行で処理をストップしてもらうことができます。

このように処理をストップする特定する行のことを「ブレークポイント」と呼びます。日本語では「止める地点」という意味合いでしょうか。

chipidの変数の値を確認するには、確認する次の行にブレークポイントを設定します。具体的には

chipid = spiRead1ByteData(0xD0);

の次の行、

while(1) {

という行にブレークポイントを設定します。ブレークポイントを設定すると、設定した行を実行しない状態で処理をストップします。

それではこの行にブレークポイントを設定しましょう。設定は、以下のようにストップさせたい行の行番号を1回クリックします。

Pic practice 32 breakpoint setting

行番号をクリックすると、行番号が四角の記号に変わり、行が赤色でハイライトされます。これがブレークポイントが設定されている表現になります。

次に、PICマイコンにデバッグ実行してもらいます。今までは書き込みボタンをクリックしていましたが、デバッグの場合は以下のデバッグ実行のボタンをクリックします。もしクリックしてメニューが表示されてしまったら「Debug Main Project」を選択してください。

Pic practice 32 debug button

デバッグボタンをクリックすると、最初に以下のようなダイアログが表示されることがあります。

Pic practice 32 debug message

このダイアログの内容ですが、「現在のプログラムで設定されているPICマイコンのコンフィグレーション設定は、デバッグ実行する場合は無効になるため、デバッグ時にはそのコンフィグレーションを変更して実行しますよ、いいですか」という意味です。

具体的には、上のダイアログでは「現在のプログラム設定では、PWRTはenable、MCLRはdisableになっていますが、これらはデバッグ時には、PWRT=disable、MCLR=enalbeにする必要があるので、変更して実行しますがいいですか。でもこの変更はデバッグ実行時のみMPLABX IDEが変更し、あなたが作ったプログラムは変えないですし、デバッグ実行が終われば元に戻します」という内容です。

デバッグをする場合、このダイアログでOKボタンを押さないとデバッグ実行できないですし、そもそもデバッグ実行時のみMPLABX IDEが勝手に変更してくれるので、いちいち聞かなくてもいいような気もします。でもこのダイアログが表示されると、いつもと違った感じで「デバッグだ!」という雰囲気になりますので、一応このダイアログを確認したふりをしてOKボタンをクリックすることにします。

OKボタンをクリックしてしばらくすると、PICマイコンはプログラムの先頭から処理を実行して、ブレークポイントの行にくると処理を止めてくれます。ブレークポイントで処理が止まると、以下のようにPICマイコンは待機状態になります。

Pic practice 32 stopped at breakpoint

これで、chipidを取得した後、while行の実行手前で処理が止まりました…

止まってのはいいですが、結局chipidに何が入っているんでしょうか…

chipid変数の中身の確認方法は3通りありますので、それぞれ確認して見ましょう。

一つ目の方法は、カーソルをchipidという文字列に合わせます。カーソルを合わせてちょっと待つと、chipidの内容がツールチップして以下のように表示されます。

Pic practice 32 variable content

ツールチップには、「Address」の値と「chipid」変数の値が表示されています。Addressとは、chipidの値を格納するためのメモリ上のアドレスです。次のchipidが変数の値で、0x60であることがわかります。チップIDは0x60になるはずですのでうまく取得できていることが確認できました。

二つ目の方法は、Variablesウインドウを確認する方法です。MPLABX IDEの下の方にウインドウがいくつか並んであると思いますが、その中に「Variables」というウインドウがあるはずですので探してみてください。もし見つからない場合は、MPLABX IDEメニューの「Window」→「Debugging」→「Variables」を選択してください。

Pic practice 32 variables window

このウインドウを選択して表示すると、以下の画像は見づらいですが変数の値が表示されています。内容は先ほどと同様、chipidのアドレスと値が表示されているはずです。

Pic practice 32 variables window content

3つ目の方法は、Watchesウインドウを確認する方法です。先ほどのVariablesウインドウの並びに「Watches」ウインドウがありますので探してみてください。もし見つからない場合は、MPLABX IDEメニューの「Window」→「Debugging」→「Watches」を選択してください。

Pic practic 32 watch window

先ほどの2つの方法とは違って、何も表示されていません。このウインドウは、自分で確認したい(Watchしたい)変数などを登録しておくところになります。

それでは変数chipidを登録してみましょう。

以下の部分をダブルクリックします。

Pic practice 32 watch window register

ダブルクリックすると、以下のようなダイアログが表示されますので、以下のようにchipidと入力してクリックするとchipidが登録され、中身の確認ができるようになります。

Pic practice 32 watcih windows dialog

なお、ダブルクリックの間隔が長い場合(=2回のクリックの場合)、以下のように変数名の欄に直接変数名を入力するモードになりますので、以下のようにchipidと入力すると、chipidが登録され中身の確認ができるようになります。

Pic practice 32 watch dialog direct

これでデバッグ機能を使用してchipidの確認ができました。

PICマイコンはこの行で処理を停止しています。

この後にさらにプログラムがあり処理を継続させたい場合は、以下のContinueボタン(処理継続ボタン)をクリックします。

Pic practice 32 continue button

なお、今回のプログラムはこの後「while(1){}」ですので、実行は続けますが何も変化はありません。

また、デバッグを終了する場合は、以下のFinishボタン(デバッグ終了ボタン)をクリックします。

Pic practice 32 finishボタン

以上が典型的なデバッグの手順ですが、デバッグ機能は他にも色々な機能があります。次回の記事で、このプログラムを使用して他のデバッグ機能の確認を行います。

 

更新履歴

日付 内容
2018.5.6 新規投稿