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

» 2005年04月25日 16時15分 公開
[小林哲雄,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.

アクセストップ10

2024年03月28日 更新
  1. Synology「BeeStation」は、“NASに興味があるけど未導入”な人に勧めたい 買い切り型で自分だけの4TBクラウドストレージを簡単に構築できる (2024年03月27日)
  2. 「ThinkPad」2024年モデルは何が変わった? 見どころをチェック! (2024年03月26日)
  3. ダイソーで330円の「手になじむワイヤレスマウス」を試す 名前通りの持ちやすさは“お値段以上”だが難点も (2024年03月27日)
  4. ダイソーで550円で売っている「充電式ワイヤレスマウス」が意外と優秀 平たいボディーは携帯性抜群! (2024年03月25日)
  5. ミリ波レーダーで高度な検知を実現する「スマート人感センサーFP2」を試す 室内の転倒検出や睡眠モニターも実現 (2024年03月28日)
  6. 次期永続ライセンス版の「Microsoft Office 2024」が2024年後半提供開始/macOS Sonoma 14.4のアップグレードでJavaがクラッシュ (2024年03月24日)
  7. 2025年までに「AI PC」を1億台普及させる――Intelが普及に向けた開発者支援をアップデート ASUS NUC 14 Proベースの「開発者キット」を用意 (2024年03月27日)
  8. いろいろ使えるFireタブレットが最大7000円オフ! Echo Budsは半額以下で買える! (2024年03月26日)
  9. 15.5万円の有機ELディスプレイ「MPG 271QRX QD-OLED」に指名買い続出 (2024年03月25日)
  10. サンワ、Windows Helloに対応したUSB Type-C指紋認証センサー (2024年03月27日)
最新トピックスPR

過去記事カレンダー