目次>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)を補正の単位としました。
下の表は、補正値とその意味,プログラムでの処理などをまとめたものです。
補正値 | 補正値の意味 | 実際の補正方法 | プログラムの処理
| +-1 | 2日毎に+-1秒補正 | 5400秒毎に+-31.25mS補正 | TMR0割込み172800回毎にTMR0割込みカウンタを+-1する
| +-2 | 2日毎に+-2秒補正 | 2700秒毎に+-31.25mS補正 | TMR0割込み86400回毎にTMR0割込みカウンタを+-1する
| +-3 | 2日毎に+-3秒補正 | 1800秒毎に+-31.25mS補正 | TMR0割込み57600回毎にTMR0割込みカウンタを+-1する
| : | : | : | :
| +-19 | 2日毎に+-19秒補正 | 284秒毎に+-31.25mS補正 | TMR0割込み9095回毎にTMR0割込みカウンタを+-1する
| +-20 | 2日毎に+-20秒補正 | 270秒毎に+-31.25mS補正 | TMR0割込み8640回毎にTMR0割込みカウンタを+-1する
|
例えば、2日(48時間)で5秒遅れる場合は+5を補正値として設定します。
逆に、2日で8秒進む場合は−8を補正値として設定します。
尚、温度補正はしていませんので夏と冬ではくるい方が異なります。
温度補正も必要な場合は、別のページで紹介している温度センサを使用すれば可能です。
|
|
|
LCDへの表示
|
|
LCDの表示は以下のようにしました。
-
| 2 | 0 | 0 | 8 | / | 0 | 5 | / | 0 | 1 | - | - | 1 | 2 | 3
| p | m | | 0 | 7 | : | 2 | 3 | : | 3 | 6 | | | + | 1 | 6
|
上段に日付、下段に時刻を表示します。
薄い文字は通常表示しません。
右上の「123」は、通常モードでスイッチを押した時、その状態を表示します。
左下の「pm」は、12時間表示の時am/pmを表示します。(現在、未サポートで24時間表示のみ)
右下の「+16」は設定モードの時、補正値を表示します。
- 通常モード
-
| 2 | 0 | 0 | 8 | / | 0 | 5 | / | 0 | 1 | - | - | 1 | 2 | 3
| p | m | | 1 | 9 | : | 2 | 3 | : | 3 | 6 | | | + | 1 | 6
|
|
| 上段に日付、下段に時刻を表示
|
- 設定モード
-
| 2 | 0 | 0 | 8 | / | 0 | 5 | / | 0 | 1 | - | - | 1 | 2 | 3
| p | m | | 0 | 7 | : | 2 | 3 | : | 3 | 6 | | | + | 1 | 6
|
|
| 右下に時刻補正値を表示 設定項目にカーソルを表示
|
|
外部仕様(使い方)
|
|
プッシュボタンスイッチ3つで、日付と時刻を合わせます。
以下では、回路図に記述しているスイッチの記号(sw1,sw2,sw3)を使って使い方を説明します。
-
通常モード
| 2 | 0 | 0 | 8 | / | 0 | 5 | / | 0 | 1 | - | - | 1 | 2 | 3
| p | m | | 1 | 9 | : | 2 | 3 | : | 3 | 6 | | | + | 1 | 6
|
| <−−−−> sw1長押しで 切り替え
|
設定モード(補正値変更)
| 2 | 0 | 0 | 8 | / | 0 | 5 | / | 0 | 1 | - | - | 1 | 2 | 3
| p | m | | 0 | 7 | : | 2 | 3 | : | 3 | 6 | | | + | 1 | 6
|
|
|
| ↓ sw1チョイ押し
|
|
|
設定モード(秒変更)
| 2 | 0 | 0 | 8 | / | 0 | 5 | / | 0 | 1 | - | - | 1 | 2 | 3
| p | m | | 0 | 7 | : | 2 | 3 | : | 3 | 6 | | | + | 1 | 6
|
|
|
| 以下同様、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)
| PIC16F84A | 5.38 | 0.83
| PIC16F648A | 5.38 | 0.79
| LCDのみ | 5.38 | 0.59
|
- (2)誤差
-
20日間連続運転し、時計の狂いは−5秒でした。
目標の月差15秒はクリアできましたが、やはり温度による精度も気になります。
夏と冬では、月10秒程度は違ってきそうです。
高精度なオシレータも試してみたいと思います。
- (3)メモリと時間に余裕があれば組み込みたかった機能
- ・補正を10日で+-99秒補正(月差3秒以内)
- ・温度を測定して補正
- ・曜日の表示
- ・12時間表示と24時間表示の切り替え
- ・設定モード中でも時を刻む
- ・人の動きがない時は、LCDをオフにして省電力化
|