時計作ってみた

UART

7セグメントLEDは配線がいろいろ面倒だったり、面倒なわりにあまり新しいことは無いのでUARTを使用してPCに表示することにする。
UARTとはシリアル通信の規格で、2線で送って受けたりできるのだ。RS232CクロスケーブルでやればPC2台を通信しあうことも出来るぞ。うむ、便利だぜ。
で、PCの裏側のシリアル端子につなぐのはめんどいので、AE-UM232RというUSBとシリアルを変換するモジュールを用いて実験。
AVRのTiny2313にはハードウェアの機能でUARTがそなわっているのでそれを利用。
とりあえずUARTの機能についてAVR-Wikiで調べてみる。
http://avrwiki.jpn.ph/wiki.cgi?page=Getting+Started+Notes+%2D+UART
ちょっとやってみたけれど、いろいろなんかめんどくさいことやらないといけない。ええい、なんかライブラリ的なものは無いか!とゆとり的発想で探したらあった。
d:id:yaneurao:20080716
ラッキーということでそのまま使わせていただく。ごめんなさい。このライブラリを用いるとお手軽に送受信が出来た。

RTC

さて今度はタイマを用いた1秒の表現。
またAVR-Wikiから拝借。
http://avrwiki.jpn.ph/wiki.cgi?page=Getting+Started+Notes+%2D+Timer0
なんか簡単そうなのでこちらは自分で記述。やっぱり簡単だった。
今回はRC内部発振器で8MHz。これからプリスケーラで1024分周。さらにTIMER0を用いるので256カウント。
\frac{1}{8*10^6\rm{Hz}} * 1024 * 256 = 0.032768\rm{s}
むだにTeXで表現。ま、よーはこれで約32.8msが生成される。ちょっとこれでは使いにくい。そこで、カウンタの初期値を178にセット。
\frac{1}{8*10^6\rm{Hz}} * 1024 * (256-178) = 0.009984\rm{s}
これで約10ms。つまりカウンタのオーバーフロー割り込みが入るたびに、別のカウンタ変数で100回数えたら1秒が得られたり。うむ、ココまでくれば楽勝。
んで、次に3つ値が入っている配列を考える。それぞれ時、分、秒。
で、秒が59以上になると分にインクリメント。秒は0にリセット。同じように分が59以上になると時をインクリメント。分は0にリセット。
時が23以上になると0にリセット。こう書けばRTCが実現できる。まあ当たり前なんだろうけれど。

作ってみた。

んでもって、これらをUARTで送ってみた。

左のWebページはこちらを利用。
右はTeraTermでシリアル接続し、AVRマイコンからの文字列を表示している。
ちなみに起動時に時刻を設定するようにした。このせいでプログラムRAMを8割、データRAMを99%使っていたりする。単純機能でここまで使うのは、わたくしみたいな初心者ぐらいか。
で、これは1時間半ぐらい走らせてみたときのSS。内部RC発振のため、既に30秒ほど誤差がある。ちなみに先ほどのカウンタ初期値じゃもっと速くて、これじゃ絵にならないので、177に設定している。それでもこれである。まあ仕方ないかな。内部発振だし。