PICでもっと遊ぶその1「ラジコンサーボを自由自在に動かす」夏でも楽しい工作教室(3/3 ページ)

» 2005年07月08日 14時11分 公開
[小林哲雄,ITmedia]
前のページへ 1|2|3       

割り込むには割り込みルーチンが必要なのだ

 割り込みを使う以上、割り込みルーチンも書く必要がある。PCはPICが自動的に退避してくれるが、そのほかは自前で退避する必要がある。とくにアキュムレータとステータスフラグは必ず退避する必要がある(そうしないと戻り先のプログラムがおかしくなる)。これは割り込みの説明のところにサンプルルーチンがあるので、これをそのまま使うするのが簡単だ。少々面倒くさいことをやっているのはフラグを保持して退避するためらしい。もう一つ、割り込みルーチンの最後はRETFIE命令を使う。これで割り込みを終了したという証だ。

MOVWF WBUF ; レジスタ類退避
SWAPF STATUS,W
BCF STATUS,RP0
MOVWF SBUF
;
(割り込みの作業)
;
SWAPF SBUF,W ; レジスタ類復帰
MOVWF STATUS
SWAPF WBUF,F
SWAPF WBUF,W
RETFIE

 割り込みは本業に影響を与えないようにフラグとWレジスタは退避しておく必要がある。今回の例ではTMR0が割り込み要因で冒頭で説明した「電話番号表示」に相当するINTCONの第2ビット(T0IF)が1になっている。これは割り込みルーチン内でクリアする必要がある。割り込みルーチンの最後は「RETFIE」命令を使う。

 今回の割り込みルーチンはサーボをコントロールするパルスを出すルーチンだ(これもタイマーで管理するとカッコよさそうだが、面倒なのでプログラムウェイトにする)。冒頭で説明したように1.5マイクロ秒を中心に±500マイクロ秒のパルスを作る。128を中心にして±127(つまり1〜255)の入力データに応じたパルスを作るのがよさそうだ。0が残るがこれは無制御にしてしまおう。127分割で500マイクロ秒にすると計算が大変なので1カウント4マイクロ秒とすると±508マイクロ秒となる。つまり992〜2008マイクロ秒のパルスができる。規格外といわれそうだがこのぐらいは「気にしない」か有効範囲を3〜253にすればよい。

 整理すると、入力データが0ならパルス無発生、1〜253の場合はまず988マイクロ秒のパルスを作ってから、さらに入力データ×4マイクロ秒のループを作ってパルス幅を広げる、というプログラムを書けば………おっと、その前に次回説明する予定の「割り込みに備えた」タイマーの再初期化と割り込みフラグを0に戻し、最後に割り込み再許可をさせる必要がある。

 今回のプログラムは各種の初期化のみだけなので、回路を組んでもサーボはピクリともせず、見た目的にはまったくつまらないので、検証作業はシミュレータ動作だけで済ませてしまおう。割り込みルーチンの冒頭にブレークポイントを設定し、実行させて停止するときの実行時間を監視すれば「大体20ミリ秒毎」に割り込みがかかっていることがわかる(サンプルプログラムを見ると分かるが0の処理は今回サボってやってないのであしからず)。

 該当するビットを立てる部分と下げる部分にブレークポイントを設定して実行し、停止したときの時間の引き算をおこなうと問題なく動作していることが分かる。さらにワークレジスタを書き換えてパルス幅を変えてみるのもテストしてみるとよい(テストプログラムにはこのためのコメントが入っている)。

 ということで、今回は割り込みをある程度理解したところで、次回、さらにプログラムを進めていく。

ブレークポイントを設定してデバッガを動かす。大体20ms毎の割り込みが発生しているようだ。
前のページへ 1|2|3       

Copyright © ITmedia, Inc. All Rights Reserved.

最新トピックスPR

過去記事カレンダー