連載
» 2005年04月25日 16時15分 公開

入門その2「PICの開発ツールを習得する」春だからはじめる工作教室(2/2 ページ)

[小林哲雄,ITmedia]
前のページへ 1|2       

デバック作業でレジスタの中身を調べてみる

 次に実行してみよう。その前に“Debugger”メニューの“Select Tool”で「MPLAB SIM」を選択しておく。F9キーを押すと実行され左下に「Running」と出るが……それ以外は何も変わらない。ここでF5キーを押すとシミュレータは停止する。

 これでは何をやっているかわからないので、内部レジスタを見ることにしよう。“View”メニューから“Special Function Registers”を選択すると内部レジスタ一覧のViewウィンドウが開くので再度F9キー……これまた変わらない。

左下の動きから実行中らしいのだが、何も画面に変化がない

 この状態では全速力で動いているだけなので、シミュレーターの設定を変えよう。“Debugger”メニューから“Setting”を開いて、いくつかのタブ内容を変更する。まず、「Osc/Trace」タブのクロックを4MHzに変更して、Trace時での時間を正しくする。次に「Animation/Realtime Updates」タブの「Animate Step time」を500msから100msに、その下の「Realtime watch」はenableのチェックを入れ、その下の数字を1にする。

シミュレーターの設定を変更してみる。クロック周波数をあわせて実行中でもWatchが有効になるようにする

 これで再度F9を押すと、変化のあるレジスタが赤く表示されるので動作しているのが分かるだろう。アドレス0005のGPIOが定期的に変わるはずだ。ところがプログラムでポート書き込むことにしている値は「$3F」($は16進数であることを示す。以下同じ。なお、この命令はMAINLPのMOVLW 3FH)と「$00」(同じく、MAINLPのMOVLW 00H)を書いているのに表示されるのは「00」と「30」だ。これでは上位2ビットしか変化していないことになるわけで、動作がおかしい。

GPIOの値がプログラムで指定したのと違う……おかしい

 実は先のPIC12CE67XとPIC12F675では仕様にいくつかの違いがあり、12F675はポートのいくつかがアナログ用の設定になっているためこのような出力される値に違いがでてしまう。そのため、プログラムの初期設定部分を以下のように修正する必要がある。

CLRF TRISIO

の行の下に

CLRF ANSEL

 を追加しよう。再度makeして実行すると表示される値は「00」と「37」となる。ここで、「$3Fと指定しているのに37と表示されるのは、まだバグがあるからではないか?」と思われるだろう。

 ところが、GPIOのうち第3ビットにあたる“GP3”は入力専用ポートなので出力はできない仕様になっている。そのためプログラムで第3ビットが1になる$3Fと指示しても出力結果では第3ビットが0のままとなり、表示される値が「37」となってしまうのだ。ということで、これで問題点の解消となるデバッグができた。

ちょっとおかしいように見えるが、これでIO出力は問題なし

 次は、ブレークポイントの設置とトレースを行ってみよう。ソースファイルを見るとTIME1Sといかにも「一秒待ちます」という名称がついているが、本当に一秒待ちなのだろうか? 

 そこで、CALL TIME1Sとその次の命令の行でダブルクリックをする。そうすると赤いBというマークが付く、これがブレークポイントと言って先の実行をこの位置で止めることができる。止まったら、“View”メニューの“Simulator Trace”をクリックして「Trace」ウィンドウを開こう。これは「止まる直前に行った命令」を表示するものだ。

 ここで、Traceウィンドウの上で右クリックをしてサブメニューを表示させ、その中から“Display Time”で出てくるリストの中から「In Seconds Elapsed」を選択すると、直前までの実行サイクルがそれまでの16進数から秒数表示となる。

 この秒数表示の欄を見てみると、直前までの実行時間が0.00000500s(=5μs)ということがわかる(先にクロックを設定したのはこの数字が正しくするためだ)。次にもう1回F9キーを押すとTIME1Sルーチンから帰ってきたところで止まる。Traceウィンドウを見ると1.000007000sとなり余計に2μs使っているが、これはCALL命令で使われた時間で、TIME1Sは正しく1sの時間待ちルーチンになっていることがわかる。

ブレークポイントを指定すると自動的に中断する。Traceウィンドウとあわせると実行時間のチェックもできる

 先ほど、レジスタの中身を見るのにSpecial Function Registersを使ったが、これは不要なレジスタも見えてしまいちょっと分かりにくい。そこで指定した部分だけを監視できるウィンドウを開いてみよう。

 “View”メニューから“Watch”を選択して「Watchウィンドウ」を開き、左上のプルダウンメニューからGPIOを指定して、脇にある「Add SFR」(SFRとはSpecial Function Registersの略)ボタンを押すとGPIOの内容が表示される。

 ただ、このままでは16進表示だけで分かりにくい。そこで、GPIOの上で右クリックして表示されたサブメニューで“Propaties”を選び、その設定変更メニューから「Format」欄を「Binaries」にすればValueの欄が2進数、つまり、ビット単位で表示されるようになる。

Watchウィンドウを使えばレジスタの必要な部分だけを確認できる

 最後にステップ実行とAnimation実行を試そう。“Debugger”メニューから“Animate”を選ぶと、1命令づつゆっくり実行され、レジスタの結果も表示される。実行間隔は先ほどクロックの設定と一緒に変更した値(=100ms)だ。また、停止した状態でF7キーを押すと「Step Into」と呼ばれる1命令づつの実行、F8キーで「Step Over」と呼ばれるサブルーチンを全速で実行してCALL文の次で止まる動作モードになる。

 これらは“Debugger”メニューからも選択できるが、同じこのメニューから選択できる動作モードとして「Step Out」も用意されている。これはサブルーチンから出たところで止まるようになる。

 これらのステップ実行やブレークポイント、そしてWatchやSpecial Function Registersの表示を見ることによってプログラムが目的通り動くかどうかチェックできるのだ。

ある程度ゆっくり、しかも自動的に止まってくれるがAnimationだ。ここでは余計な時間待ちを省くためにサブルーチンコールをコメントアウトにしている。

 以上、駆け足だったがIDEの使い方とプログラムの入力、make、デバッグを一通り使ってみた。今回のプログラムは5つある出力端子に一秒ごとに0と1を出力するというものだったが、デバッガーの表示では今ひとつわかりにくい。そこで次回は実際にPICに書込んで動作させたい。

前のページへ 1|2       

Copyright © ITmedia, Inc. All Rights Reserved.

この記事が気に入ったら
ITmedia PC USER に「いいね!」しよう