なる研電子工作小品集>対授業タイマー
クリック拡大

対授業タイマー

 やっと出ましたマイコンです。
 週休二日制の影響で授業の時間が不規則(47min)になり時計を見ても後何分?
 で、それを表示する物を初マイコン(AVR)で作ってみました。

●ハードをさくさく

 ATMELのAVR AT90S2323AT90S2313を使います、1200で十分事足りるのですが、ライタ制作のときに取り寄せたものが全て書き込み不可になってしまいました。
 RESETにタクトスイッチをつけて、このスイッチでカウントをスタートします。押し遅れたときのために次の時間へスキップするボタンをつけました。っていうか肝心のタクトスイッチが通販で手に入りません、ここで使ってしまおうか迷いました。
クリック拡大  表示は二つの7セグメントLEDを交互に表示してポートを節約します、残像を利用するため高速に切り替えます。私が入手した物はアノードコモンなので、Aに2本、Kに7本で I/O8本で制御できます。
 AVRはポート電流を多く取れるらしいので、とりあえず直接LEDに繋いであげました。 ISPを空けるため、Dポートをカソードに接続。ところが、テストプログラムを作って走らせてやると、異常に暗いのです、どうやらアノードへの電流を吐ききれないようです。データシートを見てみると案の定最大60mA程度、8を表示するときは1セグあたり8mAしか流れないことになります。で、トランジスタC1815を挿入→解決。 クリック拡大
 LEDはICソケットで底上げした上脱着可能にして、その下にトランジスタなどを入れてます。 クリック拡大
 最初1ヶ月ぐらいは電池(単2×4本直列)にしてましたが、最初に入れた電池を消耗しきってから電池代が惜しくなりました。
 その後結局電池ではなくACアダプタ+3端子レギュレータにしました、コンデンサはチップコンデンサを直付けしてみました(付けるとき熱でいかれないか心配)。

●プログラム

 アンセンブラで書いて、コンパイルしたものをAVRに書き込みます。 アンセンブラは「Nの電子講座」で勉強しました、これとAVRライタキットに入ってたプログラムをちょこっと変更して書いてみました。いずれも1200用のプログラムだったので、サブルーチンコールの仕方が違っていました。

ldi temp,low(RAMEND) ; スタックポインタ設定
out SPL,temp

が必要らしいです、なんでかはまだわかりません。 WEBでこの2行を探すのにだいぶ時間を食ってしまいました。できたものはだいぶ無駄な部分が多いようです、(NOPだらけ;汗)
クリック拡大  残り1分をきると表示色を変えて秒単位のカウントダウンをはじめるようにします。
 こちらも計算どおりに動いてくれません、なぜか時間が大幅にずれるのです、しょうがないのでNOPで微調整しました。後で調べたところ、安価なセラロックは誤差が尋常ではないようです。nopだらけになったのはこいつのせいです。

●課題

クリック拡大  微調整したとはいえ、精度はあまり高くなく、毎日合わせてやる必要があります、面倒です。クロックを高精度のものに変更して何もしなくても毎日精確にカウントしてくれればどれだけ楽か…。100円の時計から1Hz発信回路を拝借する案も有。
 それから、時々リセットがかかってしまいます、いくら調べても原因不明です、「だれかおしえてぇ〜」って感じです(+_+)。

 誤差についてくま様よりコメントをいただきました、精確に時を刻まないのは温度変化が原因との事です。そこで、データシートを引っ張り出しますと20度の変化で0.1%ずれるみたいです(右図)。7時間で最大3600x7/1000=25.5[s]もずれる事になります。しかしこれだけ綺麗に比例してずれてくれると温度計にできそうですね。にやり;-) (2003/02/06追記)

プログラムソース(school_timer.asm)
回路図(kairo.png)



●改良 (追記:2002/07/04)

クリック拡大  上の『課題』に書いたように、時計のモータードライブ用のモジュール(右図)を基準クロックとして使用し、精度を上げようと試みました。
 とりあえずどんな波か目視しようということで、2つの出力をPCのマイク入力に繋いで波形をキャプチャしてみました(↓)。
 対GNDで見てみると、それぞれから1/2Hzのパルスが加算すると1Hzになるように交互に出ていました。これの負の成分をダイオードでカットし、加算したものをプルダウンしてAVRに入力してやります。
 最初はアナログコンパレータか入力割り込みでカウントしようと考えていましたが、LEDの制御ピンと競合し、変更するのが面倒なので、スキップスイッチに使用していた端子で監視することにしました。スキップスイッチはISPと競合しても問題ないのでMOSIとポートを共有させます。検出方法ですが、某レジスタに常時1サイクル前の入力情報を記録しておき、最新のものと比較して0から1に変わったとき1秒進ませるようにします。
クリック拡大  ところで、このモジュールが必要とする電圧は3Vです、基板上にあるのは5Vです、ツェーナダイオードなんて持ってません、どうしましょう。LEDも電圧降下が一定ですので、用途もないのに買った赤外線ダイオードの出番です、これは電圧降下が1.1Vなのでこれ3個と抵抗を直列に繋いで3.3Vの電位差をつくります。0.3Vは愛嬌ということで^.^;
 プログラムはあまり変わりません、タイマー割り込みを消して、検出ルーチンを入れるだけです。ついでに、自動的にカウントを再開するためSleepに入ってから16時間後にRESETがかかるようにしておきます。
 時々勝手にリセットがかかってしまう問題はレギュレータの両端のコンデンサの容量を増やすことで解決できました。ACアダプタからの電流があまり善く整流されてなかったようです、スピーカに繋ぐと「ぶ〜ん」という音がしてました。
改良版プログラムソース(stimer2.asm)
改良版回路図(stimer2.png)


<<電子工作小品集へ戻る
Since 2002/06/14
LastUpdated 2003/02/06
Copyright 2002 Naru
アクセス  今日今日のアクセス  昨日昨日のアクセス