目次>5章 第2ステップ(色々な実験)>(18)液晶ディスプレイを使った時計

液晶ディスプレイを使った時計
− 正確に時を刻む −
更新日2008.5.1

前のページで使った液晶ディスプレイ(LCD)で時計を作成します。

時計ですので、毎日1分も狂っては困ります。
ハードウェア(電気回路)でできるだけ正確な(ただし安価で容易な)クロックを作成し、誤差はソフトウェア(プログラム)で補正します。

目標は甘めで、月差15秒以内としました。(補正の精度を高めれば月差2〜3秒は可能です。)

回路図
今回の実験回路は以下の通りです。

前のページとは以下を変更しています。
・クロックを変更(20MHz→32.768KHz)水晶振動子
・LCDのR/Wは使用せずGNDに接続(クロックが遅いのでBFをチェックしない)
・時刻設定用にプッシュボタンスイッチを3個追加

実験回路を組む
ブレッドボードに組んだ所。

正確に時を刻む

ハードウェア(電気回路)
正確に時を刻むために、クロックを32.768KHzの水晶振動子に変更しました。

今回使った水晶振動子

シチズン製の小さな筒型タイプで、高精度ではありませんが安く(100円)、入手も容易だと思います。
高精度では無いと言っても、セラミックやPIC内蔵のクロックに比べれば圧倒的に高精度です。

1秒は以下のようにTMR0割込みで作成します。

クロックが32.768KHzですので
1クロックの時間(mS)=1S/32.768KHz
1命令の時間(mS)=(1S/32.768KHz)×4
そして、TMR0関連は
プリスケーラ:なし
TMR0:フリーラン
割込み周期:31.25mS ((1S/32.768KHz)×4×256)
従って、
TMR0割込みを32回カウントすれば、丁度1秒になります。
ソフトウェア(プログラム)
水晶振動子を使って精度を上げても、一般タイプでは月差15秒以内の目標はおそらく達成できません。
(精度が非常に高いものもありますが、秋月や千石では販売していませんので。)

そこで、後はソフトウェアで補正することにします。

補正は、2日(48時間)当たり+-20秒までできるようにしました。
ですが、ある時20秒停止しているように見えたりすると時計らしくありませんので、 実際の補正はTMR0割込み1回(31.25mS)を補正の単位としました。

下の表は、補正値とその意味,プログラムでの処理などをまとめたものです。

補正値補正値の意味実際の補正方法プログラムの処理
+-12日毎に+-1秒補正5400秒毎に+-31.25mS補正TMR0割込み172800回毎にTMR0割込みカウンタを+-1する
+-22日毎に+-2秒補正2700秒毎に+-31.25mS補正TMR0割込み86400回毎にTMR0割込みカウンタを+-1する
+-32日毎に+-3秒補正1800秒毎に+-31.25mS補正TMR0割込み57600回毎にTMR0割込みカウンタを+-1する
+-192日毎に+-19秒補正284秒毎に+-31.25mS補正TMR0割込み9095回毎にTMR0割込みカウンタを+-1する
+-202日毎に+-20秒補正270秒毎に+-31.25mS補正TMR0割込み8640回毎にTMR0割込みカウンタを+-1する

例えば、2日(48時間)で5秒遅れる場合は+5を補正値として設定します。
逆に、2日で8秒進む場合は−8を補正値として設定します。

尚、温度補正はしていませんので夏と冬ではくるい方が異なります。
温度補正も必要な場合は、別のページで紹介している温度センサを使用すれば可能です。

LCDへの表示
LCDの表示は以下のようにしました。

2008/05/01--123
pm 07:23:36 +16

上段に日付、下段に時刻を表示します。

薄い文字は通常表示しません。
右上の「123」は、通常モードでスイッチを押した時、その状態を表示します。
左下の「pm」は、12時間表示の時am/pmを表示します。(現在、未サポートで24時間表示のみ)
右下の「+16」は設定モードの時、補正値を表示します。

通常モード
2008/05/01--123
pm 19:23:36 +16
上段に日付、下段に時刻を表示
設定モード
2008/05/01--123
pm 07:23:36 +16
右下に時刻補正値を表示
設定項目にカーソルを表示

外部仕様(使い方)
プッシュボタンスイッチ3つで、日付と時刻を合わせます。

以下では、回路図に記述しているスイッチの記号(sw1,sw2,sw3)を使って使い方を説明します。

通常モード
2008/05/01--123
pm 19:23:36 +16
<−−−−>
sw1長押しで
切り替え
設定モード(補正値変更)
2008/05/01--123
pm 07:23:36 +16
↓ sw1チョイ押し
設定モード(秒変更)
2008/05/01--123
pm 07:23:36 +16
以下同様、sw1チョイ押し毎に
カーソルが移動する。
秒>分>時>am>日>月>年

カーソルがある所でsw2/sw3を
押すと値を変更できる
sw2:値を+1
sw3:値を−1

通常モード
・通常モードでは、1秒毎に時計を進めます。大の月,小の月,うるう年も判断しています。
・sw1を長押し(0.6秒以上)すると設定モードに切り替わります。
設定モード
・設定モードでは、設定項目にカーソルが表示されます。
・sw1をチョイ押し(0.6秒以内)すると設定項目が以下のように切り替わります。(カーソルが移動)
 補正値 -> 秒 -> 分 -> 時 -> pm -> 日 -> 月 -> 年 -> 補正値
・カーソルがある場所で、sw2/sw3を押すと値を変更できます。(pmは現在未実装)
 sw2:値を+1する
 sw3:値を−1する
・設定できる範囲は、「2000年1月1日0時0分0秒」〜「2099年12月31日23時59分59秒」です。
 補正値は+−20までです。(2日当たり+−20秒まで補正)
・sw1を長押し(0.6秒以上)すると、設定値を反映して通常モードに戻ります。
・設定モード中は、時刻はカウントしません。

プログラム全体
今回の時計プログラムはこちらです。

こんな風に表示します。

色々追加したい機能はあるのですが、PIC16F84Aではメモリが足りませんのでここまでにしました。
時計としての必要機能は持っていますので、普通に使う分には支障がないと思います。

感想など

(1)消費電流
機種電源電圧
(V)
電流
(mA)
PIC16F84A5.380.83
PIC16F648A5.380.79
LCDのみ5.380.59

(2)誤差
20日間連続運転し、時計の狂いは−5秒でした。
目標の月差15秒はクリアできましたが、やはり温度による精度も気になります。
夏と冬では、月10秒程度は違ってきそうです。
高精度なオシレータも試してみたいと思います。

(3)メモリと時間に余裕があれば組み込みたかった機能
・補正を10日で+-99秒補正(月差3秒以内)
・温度を測定して補正
・曜日の表示
・12時間表示と24時間表示の切り替え
・設定モード中でも時を刻む
・人の動きがない時は、LCDをオフにして省電力化