AVRtiny13Aでつくるシリーズ番外編2 LCD8812K4-01でTCXO時計を
- 2016/04/08 07:18
![]()
さてさて,LCD8812K4-01というaitendoの特価LCDを,とりあえずセグメントだけ動かしてみたわけですが,そもそもこれは,同じaitendoで買ったI2CセグメントLCDの交代要員として使いたいという話からスタートしたものでした。
動かしてはみたものの,LCDまわりのハードもソフトも新規になって,新しい時計をもう1つ作るのと同じくらいの手間ですから,交代要員もクソもないんですが,せっかくですからやるだけやってみましょう。
(1)ハードウェア
これまで,クロックジェネレータであるSi5351AとLCDが同じI2Cであることを最大限生かし,ピン数を大幅に削減できたことで,tiny13Aでの実装が可能になっていました。2端子で複数のデバイスをぶら下げる事が出来るI2Cは,こうした少ピンのマイコンにはぴったりです。
ですが今回は,Si5351AにI2C,LCDにSPI(SPIではありませんが,書き込み専用とすればSPIといえなくもないので,以下SPIと書きます)と,それぞれのデバイスにそれぞれのインターフェースを用意しなくてはいけなくなりました。電気的にもソフト的にも,tiny13Aには厳しいです。
まずはピンの問題から。I2Cに2本,SPIに3本,32.678kHz入力に1本ですでに6本です。この段階で,RESET端子を潰してGPIOにすることは避けられません。なんというか,滅多に使わないだろうなと思っていたヒューズリセッタが大活躍ですよ。
しかしそれでも,時刻設定用の悪阻ボタンスイッチが置けません。そこで,Si5351Aの初期設定時にだけ必要なI2Cを,設定後に入力端子に再割り当てし,ここにボタンを2つをぶら下げることにしました。I2Cはプルアップされているので,ボタンを置くにも困りません。
確かに,押しボタンスイッチをI2Cのプロトコルに従って操作すればSi5351Aが誤動作してしまうわけで,こういうのはプロの設計では御法度です。アマチュアの特権ですね。楽しい楽しい。
これでなんとか必要なピンは揃いました。
(2)ソフトウェア
I2C用LCDサブルーチンを,先日のLCD8812K4-01用サブルーチンに置き換えるだけです。本来ならこれで動くはず,でした。
しかし予想通り,大幅なメモリオーバーが発生して,書き込めません。2割ほど減らさないといけないなんて厳しいです・・・
そこで,まずSi5351Aの設定のうち,後半のゼロばかり書き込む部分のライトを省略しました。本当はこういうことはやってはいけないのですが,初期値がゼロならわざわざ書き込む必要もないので,すっとばします。アマチュアの特権です。
次に,意外にメモリを食う_delayを,I2C関連の関数から可能な限り外して行きます。これもSi5351Aさえ動けばいいので,ばっさり取っていきます。アマチュアの特権です。
そして,ボタンのチャタリング対策も取ります。これも使う人がイライラするだけの話ですので,極論すれば私が我慢すればいいだけです。アマチュアの特権です。
と,ここまで頑張って,I2Cのリード関数が残っていることが判明。使っていないので削除すると,綺麗にメモリ内に収まりました。めでたしめでたし。
完成して動かしている写真が,冒頭のものです。コロンが使える桁だけを使ったため,画面の一部しか使っていない不細工なものとなってしまいました。
当初,左側の2桁を時に使い,右側の4桁で分と秒を表示することも試みたのですが,見にくくなってしまったのでやめました。(これはコロンが表示出来ないという問題がきっかけだったのですが,見にくさにあらがえず,コードサイズの増大と戦いながらコロンを表示させることが出来たので,取りやめたという経緯があります。)
メモリに余裕があれば,左側の4桁にカレンダーでも表示しようかと思ったのですが,これだけカツカツ(きっちり1024バイト使い切りました)だともう全然無理でした。
ということで,この時計の話はこれでおしまい。
そのうち,このLCDを本気で使い切るために,他の表示エリアも使ってみようと思います。そうすると自動的にピン数がtiny13Aでは足りませんので,tiny2313を使う事になるでしょう。
メモリも増えるのであれこれ出来そうですが,とりあえすTCXOを内蔵したリアルタイムクロックICが売っているそうですので,これを試す時に使ってみましょうか。時刻は今の表示位置でいいとして,下のキャラクタ部に年月日と曜日を出してみましょう。
そうすると,それぞれの設定が複雑になりますね。そうだ,設定用のディスプレイに左側の4桁を使いましょう。モードボタンを1つ追加して3ボタンとし,変更可能な値が表示された左側4桁の数字を,残りの2つのボタンで増減します。終わったらボードボタンを押して,次の設定項目に切り替えます。
増減ボタン2つを押せば秒がリセットされる仕様はこれまで通り。
まあいろいろ考えているうちが楽しいものです。