セミナー終了まで残り半日。しかし,ここから立て続けにプログラムを作成する上で,重要なことを学ぶことになる。登場したのがタイマ機能。タイマ機能とはプログラムの動作とは独立して時間を一定間隔でカウントを数えてくれる機能。例えば,一定時間後に処理を実行したい場合,または一定時間間隔で処理を実行したい場合などは,タイマ機能を利用することになる。各種の制御を行う上では非常に重要だ。

 では,実際にはどのように間隔を設定するのか。マイコンでは動作周波数が決まっている。そして単純に言えば,この動作する回数をレジスタなどでカウントする。時間と回数を掛け合わせて,目的とする時間が来たら信号を出すようにプログラムする。例えば,10Hzで動作するマイコンを利用したときに,1秒間隔で信号を出したければ,10回動作するごとに信号を出すようにプログラムするわけだ。

図3●俄然ペースアップする実習に筆者の理解が追い付かない。

 このように原理だけを書くと簡単なように思えるが,実際にコードを書くとなると簡単にはいかない。実際のマイコンのクロック周波数は高いので,そのまま利用すると多くの数を数えなくてはならない。このため,周波数を数分の1にする分周の設定を行ったりなどが必要。正直,プログラムを使いこなせるかどうかは,利用する場面が来ないと分からない(図3)。

 さらに重要な機能の説明が続く。次の機能は割り込み処理。マイコンで実行したい仕事が複数個ある場合,ある仕事に対してほかの仕事を優先させて実行したい場合がある。これを可能にするのが割り込み処理機能。たとえばAとBという二つの仕事があって,Bの仕事の優先度の方が高いとする。このような場合,たとえAの仕事をしているときでも,Bの仕事が入ってくれば優先的にBの仕事を行い,それが終われば再びAに戻るようにしなくてはならない。これを可能にするのが割り込み処理だ。

図4●割り込みの優先度に応じて仕事を実行する。
図4●割り込みの優先度に応じて仕事を実行する。 (画像のクリックで拡大)

 仕事は二つだけでなく複数ある場合もある(図4)。そのようなときは,それぞれの仕事に対してプログラム上で優先度を設定する。こうすれば,CPUはその都度,優先度を判断して仕事を実行すればよい。

 割り込み処理においては,たとえばある仕事の途中に割り込みが入ったら,割り込みの仕事が終われば以前の仕事の途中に戻らなくてはならない。このふるまいは,前述したサブ・ルーチンを実行した場合に似ている。このため割り込み処理においても,戻り先のアドレスをスタックエリアに格納する。サブ・ルーチンと違う点は、割り込みはいつ発生するか分からないので、戻り先アドレスのほかにプログラムの状態を保持しているPSWというレジスタの値もスタックエリアに退避してくれる点である。

プログラムにするのは難しい

 ここまで来ると,タイマ,割り込みともに機能の概要は頭の中では理解できるものの,それをどうプログラミングするかがお手上げ状態。レジスタやメモリの設定が,どうもしっくりこない。

 とはいえ,授業は最終スパート。新しく学んだ機能を使った実習に入っていく。まずは,割り込み機能を使った以下の問題。

(4)7セグメントLEDの制御
外部割り込みによる表示桁切り替え制御
(3)の問題を元にして,プッシュスイッチの代わりに,CPUボード上のINTP1(SW2)スイッチを押すたびに表示を更新するプログラムにしなさい。
*INTP1は立ち上がりエッジで認識させること
*INTP1(P4.6)にはプルアップ抵抗を接続(付加)すること
*桁選択情報は,内蔵RAM中に保存しておくこと
*16進数の値は,P15から入力すること。
*表示桁の切り替えには,INTP1(SW2)を用いること

 前の問題とは違った位置にあるボタンを押したときの信号を割り込みとして,表示を切り換えろというもの。確かに割り込みを理解するには,良い問題だ。(次のページへ