PIC16F84を使った24時間時計です。
2チャンネルのACスイッチをタイマ制御できます。
高精度水晶発振ユニットを使い高精度です。
PIC16F84だけで出来た24時間時計です。発振素子に、高精度水晶
発振ユニットを使っているため、高精度の時計で、誤差一日1秒以下
の精度に出来ます。
表示は16文字2行の液晶表示器でバックライト付きを使って、夜中
でも表示が見えるようにしました。
またタイマプログラム機能がついており、2系統の外部制御が可能
です。今回はこれにACソリッドリレーを追加して、AC電源スイッチの
機能を付加しています。
このタイマプログラムは一日9個まで自由に設定することが出来ます。
【時計ユニットの仕様】
今回製作した時計ユニットの機能仕様は下記となっています。
・精度 :月差 30秒以下
・電源 :DC9〜12V
消費電流 バックライト無しの時 15mA
バックライト付きの時 120mA
・表示 :16文字2行の液晶表示器 バックライト付き
表示内容
現在時刻 時:分:秒
タイマプログラム設定時刻、制御内容表示
・制御出力: 2系統の On/Off
・設定 : 4個のスイッチにより下記設定
(プログラム選択、時刻選択、時刻変更、設定)
−現在時刻設定、変更
−タイマ制御 する/しない
−タイマ制御設定 9プログラムまで設定
【時計の精度と発振素子】
ここで時計を作るために必要な精度がどの程度かを説明します。
まず、目標とする時刻精度をどの程度にするかを決めましょう。
目標精度 : 月差 30秒以下
この精度を出すためには、どの程度の精度が必要かというと、
30秒 ÷ (30日×24時間×3600秒) = 0.0000116
つまり 11ppm 以下の精度が必要ということになります。
これだけの精度を、使用する温度範囲、電源変動範囲、経年変化
の各条件の変動範囲で保つことが必要となります。
これを満足する発振素子としては、通常の水晶振動子では、ちょっと
厳しくなります。(普通の水晶発振回路の精度は数十ppmです)
そこで特別高精度の水晶発振ユニットを使います。このユニットの
精度は下記のようになっていて、上記の精度より数倍良い精度と
なっていますから、これで実現できることになります。
(京セラ社カタログより)
品 名 KTXO-18シリーズ 京セラ製 出力周波数 12.8MHz 温度特性 ±3ppm -20〜+60℃ 電源変動特性 ±0.3ppm +5V±5% 経年変化 ±1ppm 年 周波数可変範囲 ±3ppm以上 内蔵トリマ
このように高精度の発振ユニットが簡単に入手できるのは、アマチュア
にとっては有り難いことです。
【時刻カウント方法】
さて必要十分な精度の発振素子が手に入ったので、これを使ってPICで
時計として動かす方法を考えてみます。
つまり1秒を作り出すにはどうすれば出来るかということです。
発振ユニットの出力周波数は12.8MHzですから、PIC16F84を外部発振
回路での使い方にして、直接12.8MHzをクロックとして動かします。
(ちょっと高目のクロックとなりますが、5V電源では安定に動作します)
そうすると、次はどうやって1秒を作るかが課題となります。今回は下記
のような方法で1秒を作り出しました。
12.8MHzクロック → 1/4のサイクルタイム(12.8÷4=3.2)
→ タイマ0をプリスケーラ4倍でフリーランさせる
(3.2MHz÷(4×256)=3125Hz)
→ タイマ0のカウントアップ割り込みを3125回カウントする
(3125Hz÷3125=1Hz(=1秒))
こうすると、タイマ0のカウントアップ割り込みが、320μsec毎に発生
することになります。従って、この割り込み処理を余裕を持って実行完了
することが必要になります。半分の150μsec以下程度で実行完了する
ように考えます。
さらに注意が必要なことは、タイマ0の割り込み処理では、決してTMR0
レジスタのセットを実行してはならないということです。
これは、この命令を実行すると、プリスケーラが一旦0にクリアされる為、
ここで時間カウントに誤差が出てしまうからです。
従って、タイマ0は完全にフリーランさせた状態で、割り込みが正確に
一定周期(3125Hzつまり320μsec毎)で入る様にします。
【時計ユニットの構成】
本時計ユニットの全体回路図は、下記のようになります。全体を制御する
のはPIC16F84で、これに16文字2行の液晶表示器を接続します。
発振回路は外部発振回路という形で、OSC1(16ピン)に発振ユニットの
出力を抵抗でレベルを調整して接続します。
あとは押しボタンスイッチを4個、ACスイッチ制御が2系統となっている
だけで、非常に簡単な回路構成となっています。
ACスイッチには、一体モジュール型のソリッドステートリレー(SSR)を
使いました。本来は、ゼロクロススイッチがノイズにも強く良いのですが、
今回は手持ちのゼロクロス機能無しのものをそのまま使いました。
★ 時計ユニット回路図(クリックすれば直接表示します)
【組み立て】
今回の時計ユニットは、1枚の自作プリント基板にすべての部品を実装
しています。 液晶表示器の下にPICや、発振ユニットなどを配置しまし
たが、部品点数は非常に少ないので、楽に実装できます。
★ 時計ユニットパターン図(解凍してWinBoradでご欄下さい)
上記回路を左写真のような、1枚のプリント基板上に
組みたてています。ケースに実装するためには
もう少しスイッチ、ACスイッチ、表示部と分けた方が
やりやすいと思います。
組み立て上で注意することは、ACスイッチの出力側の
周りはできるだけ広く空けておくこと。
液晶表示器の下側は背が高い部品が配置されない
ようにすることぐらいです。
【プログラム】
次は実際に時計機能を実現するためのプログラムの説明です。 実際の
機能はプログラムだけで大部分作られていますから、逆に、皆さんのアイ
デア次第で、どのような時計も作ることが可能となります。
今回、表示には、液晶表示器を使いました。
その表示内容は左写真のように、上側の行には
現在時刻を、下側の行で、タイマ設定表示に使う
ということで使い分けています。
《表示内容》
実際の表示内容の仕様は下図のようにしました。
![]()
《プログラムフロー》
プログラムの流れを説明します。 大きく分けてメインプログラムと、
割り込み処理プログラムがあります。
下図がプログラムの概略フロー図です。
割り込み処理プログラムは320μsecの半分 150μsec以内で実行
を完了させる、という目標がありますから、ここでは時刻のデータのカ
ウントアップだけにして、実際の表示変更や、タイマの時刻一致などの
処理はすべてメインプログラムの方で実行させています。
この結果、20μsec程度の高速処理となりました。
これを互いに同期を取るために、SECFLGというフラグを使っています。
つまり、割り込み処理で割り込みが3125回入った時にSECFLGをOn
としておきます。メインプログラムではスイッチの入力を常時チェック
しながら、同時にSECFLGもチェックし、Onの時には、表示の更新と
タイマの時刻一致を確認し、一致していたら外部出力のOn/Of制御を
実行します。
タイマ設定用のプログラム設定では、CH0だけ特別扱いになっており
現在時刻変更用のプログラム機能としていますので、CH0の時だけ
別の処理内容となっています。
スイッチが連続して押されていた時には、0.2秒間隔で同じ処理を
繰り返すようにしています。これを処理するためにSKEWというカウンタ
を使っています。
![]()
上記を実現するプログラムソースファイルは下記となっています。
ダウンロードして解凍し、MPLABでお使い下さい。
★ 時計ユニット ソースプログラムファイル