先週は、スイッチに関連する処理コードを決めました。猛暑 何はなくとも、タイマー/カウンタ機能をマスター
の中を今日もロボを連れて、哲さんがやってきます。短パン
にTシャツ、麦藁帽子。Tシャツをランニングにしてみると
放浪の画家、山下清になります。道行く人は、そんなことを
思ってか、クスリと笑っていきます。でも、哲さんはロボの
後をついていくのが、精一杯なのでした。
哲 :こんちは。今日も、熱いなあ。子供の愛のようにプール にでも、行きたいよ。 啓二:じゃあ、今日は、やめるのか。 哲 :いや、いや、ここまで来たら、愛の夏休みが終わる前に 完成させないと。夏休み終了の3日前は、宿題を手伝う ので、大変だから。 啓二:何だよ。まだ、宿題を手伝っているのか。この前のLED フラッシャーを自由研究の課題提出にすれば、いいだろう。 哲 :そうなんだが、数学と英語の宿題がさあ。 そう言えば、お前、中学校のとき、夏休み開始5日で全部 終わらせていたよなあ。 啓二:ああ、やりたいことがあったから、すぐに済ませておいた。 でも、半分は、先輩から聞いておいた内容を、夏休み前の 10日からコツコツやっておいたのさ。 哲 :情報収集の能力が、モノを言ったってか。 啓二:そういうこと。事前に、内容がわかっているから、対策も 立てやすい。今、お前がやっている時計だって、同じさ。 そうだ、今日は、タイマー/カウンタをマスターしよう。 哲 :Windowsマシンでなら、タイマー割込みを使ったことがある から、簡単だと思うけれどな。 啓二:マイコンを侮るなよ。OSが貸し出しているタイマー/カウンタ は、ある意味飼い馴らされた猫なんだ。マイコン内部に棲む猛獣 であるタイマー/カウンタは、使い方を間違うと、牙を剥いて、 襲いかかってくる。猫パンチなんてかわいいもんで、爪で切裂く こともある。 哲 :脅かさないでくれよ。 啓二:78kならば、Appliletで、そこそこ飼い馴らせるが、それでも 相手の性格を知らないと、ひどい目にある。 哲 :そうなんだ。 啓二:78kに限らず、最近のマイコンは、タイマー/カウンタの機能 が複雑になる傾向にあるんだ。作る側も、あまり複雑にすると、 使ってもらえないからか、機能を絞りこんで、設定を簡単にと、 流れている。 哲 :じゃあ、お前がすすめる、簡単習得の方法はなんだ。 啓二:そうだなあ、まずは、ハード仕様がどうかを頭に入れるのが、 最初かな。クロックをどこから入れるか。プリスケーラのある なし。プリスケーラは、タイマー/カウンタの入力クロックを 予め、分周しておく回路のことだ。これがあると、プログラム で、カウントに使う変数のサイズ(8ビットとか、16ビット とか)を小さくできる。 哲 :その他には、何に気をつけて、マニュアルを読めばいいかな。 啓二:どういうモードで、タイマー/カウンタを使えるかが問題だ。 インターバル動作、ワンショット動作、オーバーフロー割込み コンペアマッチなんていうモードがあるので、自分が使おうと しているモジュールで、どれが使えるかを知っておかないと。 哲 :インターバル動作っていうのは、どういうモードなんだ。 啓二:簡単に言えば、剰余系をハードウエアで実現したものかな。 0から1ずつ増やして、ある値になったら、0に戻り、また カウントアップ動作をする。当然、このときには、比較値が 必要だから、そのためのレジスタが用意されている。 哲 :ワンショット動作っていうのは、ある値になったら、0に戻る が、一度0に戻ると、2度とカウントアップ動作をしないのか。 啓二:うん、そうだ。どちらで利用するかは、モードレジスタって いうのがあって、その中に情報を書き込めば、決められる。 哲 :オーバーフロー割込みは、カウンタがオーバーフローしたとき 割込みが発生するようにして、割込みをトリガーにした処理を 実現するんだ。 啓二:その通り。例えば、8ビットのタイマー/カウンタならば、 最大値の255から0に切り替わるとき、オーバーフロー が発生する。そレを通知するか否かを、これまた、モード レジスタに書き込んでおく。 哲 :オーバーフロー割込みを利用する、具体例はないかな。 啓二:チャタリング除去によく使ってきたな。8ビットのタイマー/ カウンタのクロックが、300μsだとする。チャタリングは 40msで収拾するとすれば、135カウントごとにオーバー フロー割込みを発生させて、スイッチの値を入力する。 哲 :どうやって、255から0に変化させるんだよ。135じゃ できないじゃないか。 啓二:ふふふ、簡単だよ。カウンタを、256−135=121から カウントアップさせる。オーバーフローが発生したら、再度、 カウンタに121を設定する。 哲 :あっと、その手があるか。お前、やっぱり、ハード屋だなあ。 1つのタイマー/カウンタで、使えるモードは1つだよな。 啓二:そう。インターバル動作、ワンショット動作でも割込みを発生 できることもある。このあたりは、マニュアルを読めば書いて あるが、Appliletにやらせてしまった方が楽だ。 哲 :お前が話してくれた内容は、マニュアルにあるんだろうが やっぱり、噛み砕いた説明がないと、わからないよな。 啓二:そのためのAppliletなんだろうさ。 哲 :だけど、もっと親切に噛み砕いて説明してくれてもいいよな。 バックグラウンドの知識がないと、わからないぞ。 啓二:まったくだ。LSI設計の経験があるから、カウンタがどうしたとか オーバーフロー割込みの発生を好きな様に扱えるが、初めてやる人間 には、お手あげだろうなあ。WindowsやOfficeシリーズの簡単操作本 だけが書店に並ぶような状況もよくないし、ハードを扱える技術者が 忙しすぎて、継承や伝承の場がないことも一因だろうなあ。 哲 :2007年問題って、こういうところにもあるのかな。 啓二:そうかも知れない。話が暗くなりそうだから、やめよう。 哲 :コンペアマッチというのは、どんなことをするんだ。 コンペアというくらいだから、何かと比較するだんろうけど。 啓二:タイマー/カウンタを、インクリメントだけするフリーランニング で使って、2つの値A、Bを境界とする。2つの境界値の前と後で 出力論理値を変えるのさ。 哲 :それで、何が嬉しいんだ。別に、1と0の出方が変わっても、何も いいことないじゃないか。 啓二:それが、そうでもないんだなあ。例えば、RATIOとして、 カウンタCNTが、0〜99の値を繰り返すとしよう。 RATIO=25として、次の条件を与えみる。 if ( cnt <= ratio ) out_v = 1 ; else out_v = 0 ; これで、カウンタCNTの値をインクリメントして、出力値が どうなるかをホワイトボードに描いてみろ。 哲 :よし来た。こんなんで、いんでないのかい。 啓二:変数RATIOの値を、適当に動かして、OUT_Vが どうなるか、考えてみろよ。 哲 :じゃ、75、50としてみるか。 あれれ、RATIOの値で、出力が1になっている時間が 変わるぞ。 これは、何かに利用できるのか。 啓二:うん、DCモータのスピードを変えたり、LEDの 輝度を変化させたりできる。 哲 :じゃあ、LEDを使ったイルミネーションに応用すると、 明るさを可変にできたんだ。何故、教えなかったんだよ。 啓二:あのとき教えても、頭に入らないと思ったからだよ。 タイマー割込みででも説明すると、理解しやすいからだ。 哲 :そうか。確かに、あのときは、3色LEDの光り方を変える だけでも、充分にイルミネーションになっていたからなあ。 マイコン応用のひとつとして、テーマが増えたな。 啓二:そういうこと。じゃあ、今日は、お開きだ。