時計作ってみた
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カウント。
むだにTeXで表現。ま、よーはこれで約32.8msが生成される。ちょっとこれでは使いにくい。そこで、カウンタの初期値を178にセット。
これで約10ms。つまりカウンタのオーバーフロー割り込みが入るたびに、別のカウンタ変数で100回数えたら1秒が得られたり。うむ、ココまでくれば楽勝。
んで、次に3つ値が入っている配列を考える。それぞれ時、分、秒。
で、秒が59以上になると分にインクリメント。秒は0にリセット。同じように分が59以上になると時をインクリメント。分は0にリセット。
時が23以上になると0にリセット。こう書けばRTCが実現できる。まあ当たり前なんだろうけれど。