何はなくとも、タイマー/カウンタ機能をマスター

先週は、スイッチに関連する処理コードを決めました。猛暑
の中を今日もロボを連れて、哲さんがやってきます。短パン
に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の光り方を変える
      だけでも、充分にイルミネーションになっていたからなあ。
      マイコン応用のひとつとして、テーマが増えたな。
啓二:そういうこと。じゃあ、今日は、お開きだ。

戻る