60分時計(ストップウォッチ)

 まえがき:30年ほど前に、ロジックICを使ってストップウォッチを作ったことがありました。当時、電子工作をしていた子供たちの相手をしながらでしたが、 1MHzの水晶で発振し、10分周のICを3段並べて1000分の1秒とします。スタート・ストップのゲートを経て、10分周ロジック4段でカウントして、9.999秒まで1/1000秒単位の 測定ができるようにしました。表示は74LS247でLEDをドライブしました。
 当時は、まだディジタル時計が普及していなくて1000分の1秒が測定できるものは一般には無かったと思います。子供たちが喜んで「何秒間飛び上がっていられるか」などと 計っていました。現物は今も残っていますが、ベタ基板に「写し絵」パターンを付けてエッチングしたものでした。
 今では100均で手に入るストップウォッチですが、文字が小さく見にくいこともあって、LED表示のものをAVRで作ってみました。

構想:作業机に数10分程度の時間が計れるストップウォッチがあると便利です。作ってみるだけでなく使えることも考えて計画しました。
表示はLEDで4桁にします。実際には1秒単位で良いと思うのですが、それではストップウォッチとして見栄えが悪いので、100分の1秒まで測定できるようにします。 60秒を超える時間になると秒未満はほとんど意味が無くなります。そこで、1秒単位とすると4桁で59分59秒まで表示できますから、計測は1/100秒ですが、 59秒99までは1/100秒刻み、 それを超えると59分59秒まで1秒刻みで表示されるようにします。部品取りジャンク品にラジオ用のLEDアレイ(カソードコモン)がありましたので使うことにしました。
MCUはtiny2313で十分ですが、手持ちのmega8とします。(IOポートが多いから楽です) ポートDが8ビット取れるのでセグメントドライブに当て、ポートCを桁 ドライブに、ポートB0〜2にスタート・ストップ・リセットのタクトスイッチに当てます。クロックは8MHzの水晶とします。これでプログラム用ポートと兼用が 無くなります(配線が楽です)。LEDの桁ドライブは部品取り基板から外した2SC2458を使います。ドライブポートから1.5kのベース抵抗を経て接続します。LEDの電流制限 抵抗は多少多めに流れるように120Ωとします。ここまで決まると端子配置図を頼りに実装を始めます。(部品配置はいろいろ考えますが、回路図はいつものとおり用意でき ていません)


回路図

私流作り方:趣味の楽しみで作っていることと、完成してからのデバグは難しいので、ハード・ソフトとも部分で動くところができればテストランします。 今回の場合なら、mega8の電源回路(VccとGND、パスコン)とISP書き込みコネクタを配線すると、電源電流をチェックして、ライタをつなぎます。ChaNさんの avrsp.exeで -r オプションを実行し、チップ情報が表示されると成功です。次に、LEDアレイを取り付け、抵抗を介してIOポートにつなぎます。コモンのカソードを 臨時にGNDにつないで、PORTD=0b00111111; などを出力してみます。この場合、dpとgセグメントが点灯しないので"0"が表示されればいいわけです。GND接続を 他の桁のコモンカソードに変更して全桁の点灯を確認します。
あと、ドライバトランジスタ、ベース抵抗、タクトSWをつないで、動作を確認します。最後に水晶とコンデンサを付けて、内部RC発振から水晶の発振に切り換えます。 素直に進まないときもありますが、段階を追って接続を増やしますので点検はらくです。ソフトウエアも簡単な数値の表示、スイッチの確認など部分の点検を しながら、全体を整えていきます。

ソフトウエアの構想:
@ 1/100秒を作る方法は、タイマカウンタ1のオーバーフローを使うことにします。クロックが8MHzですから、カウンタクロックは64分周で作り、TCNT1=64286; とすると0.01秒後に割込みが発生します。
A スタートボタンは、ソフトウエアプルアップしておきますが、LED表示のためのウエイトルーチンの中で読みに行きます。ポートの値がLで、かつ、計測中フラグ (初期値0)が0なら、計測中フラグを1にして、スタートを実行します。チャタリングや長押しは計測中フラグが1に変わっていますので関係しません。
B スタートの実行は,TCNT1の設定と割込み許可 sei(); でします。
C ストップボタンは、スタートボタンと同じウエイトルーチンで読みます。ポートがLで計測中フラグが1の時(計測中の時)は、計測中フラグを0にして、割込みを 禁止 cli(); しています。
D 割込みのカウントは、割込みが発生したとき、発生フラグを1にします。また、TCNT1を再設定してタイマカウンタを進めます。
E 時間のカウントは、メインルーチンのLED表示ルーチン(1/2000秒で繰り返し)で、割込みフラグを監視し、フラグが立てば1/100秒変数をインクリメントして、 割込みフラグを倒します。
F 1/100秒変数は10になると0に戻し、繰り上がって1/10秒変数をインクリメントします。同様に1秒変数は10で繰り上がり、10秒変数は6で、1分変数は10で繰り上がります。 10分変数は6で0に戻ります。開始から60分後に0.00秒に戻ることになります。
G リセットボタンは、スタートボタンと同じく表示用ウエイトルーチンで読まれますが、Lが読まれるとリセットフラグが0になり、LED表示ルーチンで時間に関係する 変数をクリアします。計測中にリセットボタンを押すとカウントと時間クリアが同時に起こります。(押している間は表示が0.00)
H 表示の切り替えは、1分変数と10分変数がともに0の時は60秒未満ですから、10秒変数、1秒変数、1/10秒変数、1/100秒変数を表示用変数に代入します。 そうでない時は、10分変数、1分変数、10秒変数、1秒変数を表示用変数に代入します。なお、最上位桁はゼロサプレス機能を付けています。

プログラムはこのようになりました。

できあがった後に:
・手持ちのストップウォッチと比べると、3時間で0.5秒程度のずれが出ました。10-5程度です。
・実用には、ケースに入れて表示を縦にして、上部にスイッチを追加した方が使いやすそうです。(そのうちに加工しましょう)
・消費電流は80mAほどです。電池と一体にしたほうがいいでしょう。
・100円でストップウォッチが買えますが、今回のものが格段に見やすいです。
・スタート、ストップ、リセットが外部回路から操作が可能です。100円では困難です。
・他の割込みを使うなら、コントロールを sei(); cli(); から TIMSKレジスタのTOIE1に変更が必要です。
・PCのソフトウエアの時間測定に便利だと思います。


TOPページへもどる


inserted by FC2 system