PIC16F84電子遊戯(5)
最終更新日:2001年1月7日
99分タイマー(1ページ) (2ページ)へ (3ページ)へ (4ページ)へ

99分タイマーを作ろう
今回より本格的な製作に取り掛かりましょう。
ここのHPのポリシーとしては72mmX47mmの名刺サイズの穴明き基板で出来る製作を目指します。
まずは回路図を見て下さい。ソフト作成を重視しますのでハードはさらりといきましょう。
(99分タイマー回路図)
回路のポイントだけ説明します。まず数字を表示する7セグメントLEDはデコーダ・ドライバIC(74HC4511)で駆動します。マイコンのポート数を補うのとソフトが簡単になる効果を狙います。LEDはカソードコモンタイプです。一桁づつダイナミック点灯します。
キーは3個付けます。それぞれの用途は後で説明します。
タイマーがタイムアップした時の音を何にしようと考えていたのですが、ここは簡単にするために3端子オルゴールIC(UM66T32L)を使用します。
単品では入手出来るかわかりませんが、電子工作のキットなどでこのICが3種類入っているのがありましたので今回はそれを使用しました。
皆さんもこの辺はオリジナルを考えて見て下さい。
(ひょっとしてうまく鳴らないときは回路を変更するかもしれません。)
ではハード部分の完成写真を見て下さい。(ソフトは入ってないのでまだ動きません。)
基板をスペーサーで挟んだ格好にしました。下側の基板はケースの役目をしているだけです。とりあえず電池BOXを両面テープで固定しました。
圧電ブザーは電池BOXの側面に取り付けました。
これでケース無しでも実用に耐える格好になりました。
99分タイマーの基本仕様
ハードが準備出来ましたので、この製作の基本仕様を考えましょう。
1)最大99分がセット可能な減算タイマーです。減算表示は1秒ごとです。
2)設定は1分単位です。設定時間を早めるために10分と1分を別々に設定出来ます。
3)LED表示は分、秒の表示を行います。
4)10分と1分のキーを同時に押せば、00分に戻ります。
5)タイマーはSTART/STOPキーでスタート・ストップ出来ます。
6)タイマーが00分00秒になればアラーム音を鳴らします。START/STOPキーでアラーム音を止めることが出来ます。
7)タイマー減算時には10分、1分のキーは効かないようにします。
以上基本的はタイマー仕様としました。ソフト作成途中で都合が悪くなれば随時仕様修正することにします。
99分タイマーのポート割付
回路図に従ってマイコンのポートを割り付けましょう。
ポート名 入出力 機能
RA0 OUT タイムアップ出力
RA1 OUT N.C.
RA2 IN SW3(START/STOP)
RA3 IN SW2(+1分)
RA4 IN SW1(+10分)
RB0 OUT 7セグ駆動
RB1 OUT 7セグ駆動
RB2 OUT 7セグ駆動
RB3 OUT 7セグ駆動
RB4 OUT 1秒選択
RB5 OUT 10秒選択
RB5 OUT 1分選択
RB7 OUT 10分選択
(99分タイマーのポート設定)
99分タイマーのポートの方向設定
ではソフト上でのポートの方向をレジスタに設定します。入力は「1」、出力は「0」です。
--- --- --- PA4 PA3 PA2 PA1 PA0
--- --- ---

1

1

1

0

0

(TRISA)
PB7 PB6 PB5 PB4 PB3 PB2 PB1 PB0

0

0

0

0

0

0

0

0

(TRISB)
99分タイマーのタイマー割り込みの設定
今回のタイマーの表示精度は1秒です。出来るだけ簡単に1秒を得るためのタイマー割り込みを考えます。
タイマー割り込みの基本となるプリスケーラ値をまず128分周にします。
発振子が4MHz時基本クロックは1usecなので、128usecごとにタイマーカウンタがアップします。その他の設定はテストボードの時と同じにします。(詳しくはテストボードのページを参照して下さい。)
ではレジスタにデータを設定しましょう。
RBPU INTEDG TOCS TOSE PSA PS2-0

1

0

0

0

0

1

1

0

(OPTION_REG)
さて1秒を作る方法を考えましょう。まず128usecのタイマーカウントアップを使用して20msecごとにタイマー割り込みを掛けるようにします。
128usec x 156 = 19.968msec
128usecを156カウントして約20msecにします。
正確には20msecではありませんが、ひとまずこれで決めます。
次にこのタイマー割り込みを50回カウントして約1秒にします。
19.968msec x 50 = 0.9984sec
99分でどれほどの誤差か計算しますと
0.9984sec x 99 x 60 = 5930.496sec
となり約10秒です。10秒というと誤差が大きいように見えますが、10分では約1秒ですので実用上は全く問題ないと考えます。
次に定数を設定します。まず20msecの割り込みを掛けるためにタイマーカウンタに設定する初期値です。タイマー割り込みはタイマーカウンタがオーバーフローするごとに掛かります。従って初期値を255-156 = 99 = 63HにすればOKです。
tm0_setdata
63H
(tm0_setdata)
次に1秒を刻むための初期値データです。50 = 32Hです。
cnt_setdata
32H
(cnt_setdata)
このタイマー割り込み処理で使用する作業RAMを設定します。
1秒のカウントのために、20mscの割り込みを何回カウントしたかのRAMが必要になります。これはcnt_setdataの初期値から減算してカウントします。ここのRAMが「0」になれば1秒経ったことになります。
count_data
1秒カウントまでの残り
(count_data)
99分タイマーのポート初期設定
マイコンが動作してからのポートの初期状態を設定します。
PORTAで出力として使用しているのはRA0のみですが入力には影響しないのでPORTA全体をLに設定します。
PORTBは後述するLED表示ルーチンで順次表示処理を行う時に制御しますが、とりあえずは次のように設定しましょう。
PORTA PORTB
00H F0H
(ポート初期設定)
この続きは(2ページ)へ

不明点などあればメールお願いいたします。nonchansoft@nifty.com

Copyright(c)2000-2001 nonchansoft