レッスン4 60分タイマを作る - PF

レッスン 4 60分タイマ
レッスン4
60分タイマ
このレッスンでは、60分タイマを作りますが、初めにマイコンプロ1で作った99秒タ
イマを移植した後にこれを基に拡張して60分タイマに仕上げます。
4.1
99秒タイマの移植
【課題 13-1】
99秒タイマは、オブジェクト指向プログラミングを行っており、以下のようなクラス図
で構成されていますが、マイコンプロ1の IO パネルとマイコンボードの違いは、下図の
switch、7segmentLED、timer、LED のマイコンポートとの接続方法のみです。従って、この部
分のクラス図に書かれている関数を改造すれば良いと考えられますが、下図を見るとほと
んどのクラスが変更した部分に繋がっているので、無傷なのは、timer_control のみになって
しまっています。
IO 周りの違いを挙げてみると以下のようになるので、それぞれ改造の方針を決めます。
① 押しボタンスイッチ
接続しているマイコンのポートの違いなので、単純にポート番号を入れ替える。
② 7segmentLED、LED
接続しているポートの違いだけでなくデコーダを入れるなど論理の違いがあるので、
1
レッスン 4 60分タイマ
関数単位で入れ替える。
シミュレータでは、単体 LED が独立しているので、alarm_control
に直接 LED を繋いでいましたが、マイコンボードは、7segmentLED と LED は一体
となっているので表示を display.c に一体化する構造に alarm_control からアラーム表示
に表示データをインタフェースする read_alarm()関数を追加する。書き換えたクラス図
を以下に示す。
③ timer
クロックを 20MHz にしたことでタイマ時間の再設定が必要となります。特に1秒タイ
マは、カウンタの長さの関係で元クロックが8MHz→20MHz になることで、設定のみ
で合わせ込むことは出来ず、論理の変更が必要となります。
操作と関係を追加する
僕がやった移植のソースをダウンロードの ex13-1 に置いておきます。
2
レッスン 4 60分タイマ
4.2
60分タイマを作る
【課題13-2】
これから作る60分タイマの仕様を示します。
外部仕様
・ タイマの設定範囲は、0~59 分 59 秒とする。
・ タイマ時間設定は SW1 を押すごとに1増加、SW2 を押すごとに1減少する
・ SW1、SW2 を 2 秒以上長押しすると10単位で、0.5 秒間隔で自動増加/減少を
行う
・ SW4 を押すことで、入力する桁の分と秒を交互に切り替える。分入力の場合
LED2、秒入力の場合は、LED1 を点灯する。
・ 設定値が0以外で SW3 スイッチを押すと1秒単位でカウントダウンを開始する
・ カウントダウンしている状態で SW3 を押すとカウントダウンを停止する
・ この状態で SW1、SW2 を押すことで表示を増減することが出来る
・ さらにこの後 SW3 を押すとカウント値をクリアする
・ カウントダウン中は SW1、SW2 は押しても無効になる
・ カウントダウンがゼロに達したらカウントダウンを停止しアラームとして、圧電ス
ピ ー カ か ら ア ラ ー ム 音 を 1 0 秒 間 鳴 ら す 。 ア ラ ー ム 音 は 800Hz0.2 秒 、
1600Hz0.1 秒の繰り返しとする。
内部仕様
・ LED のダイナミック駆動はタイマ50割り込みを使う
・ 1秒のカウントダウンはタイマ 51 割り込みを使う
・ スイッチの短押し、長押しの判断は、タイマ 51 割り込みを使って計測し判定する
・ アラームの点滅の時間制御にもタイマ 51 割り込みを使う
・ アラーム音の方形波発生にタイマ0を使用する。
分
秒
LED2 LED1
SW1 SW2 SW3 SW4
3
レッスン 4 60分タイマ
■ プログラム作成上のヒント
僕がやった改造の要点をヒントとしてまとめて置きます。当然他にも良いやり方があると
思いますが、悩んだら参考にしてみて下さい。ソースはダウンロードの ex13-2 に置い
ておきます。
①クラス図は 99s タイマと余り変わりませんが一応スピーカ等が増えているので、書
き換えると以下のようになります。
②スイッチ周りのステートマシンについては、SW4 による秒と分の桁を切り替えるモ
ードを追加して、そのモードでSW1、SW2 を押したときに値を変更する桁を切り
替えるようにする程度で大きな変更は不要です。
③時刻データの持ち方は、99秒タイマが秒を2桁で持っていたので、同じ考え方で、
分2桁、秒2桁の合計4桁分の配列で持つやり方でも良いと思いますが、僕は、分と
秒に char 型の配列の1つの要素を割り当てて、1つの要素で 0~59 迄を2進でカ
ウントするようにして表示の時に 10 進に変換する方式にしました。これにより 99
秒タイマの桁上がり桁下がりのロジックを余りいじらないで分の拡張を実現してい
ます。
④SW4による分と秒の桁設定の切り替えを単体 LED に表示するために、read_
timer 関数の戻り値を構造体にして、タイマデータと切り替え表示の二つのデータが
読めるようにします。
4