|
再び、USB接続の時計を作る |
時計を作るという発案の段階で反射的にRTCを選択していたが、よく考えたらソフト処理だけで対処可能でした。
さすがに内蔵オシレータで時計は無理なので、水晶は付けます。
回路図 ↓ |

12MHzの水晶とLEDを付けただけです。
LEDが2ヶ付いています、1ヶはテスト用で、使用しているのは1ヶだけです。
☆☆☆ ユニバーサル基板で組み付け ☆☆☆
できあがり↓

チップLEDにしてみました。
抵抗とコンデンサは基板下に実装。
スルーホール付きのユニバーサル基板を使用する場合は、モジュールの下面を絶縁してください。(ビアの所でがショートする危険があります。)
※ソフトウェア
ほぼ、前回のソフトの使い廻しです。
I2Cの部分を削除して、計時機能を追加します。
12MHzの源発振クロックをPLLで4倍し、PIC16F1455を48MHzで動作させます。
48MHzでないと、USBが使えません。
この48MHzがタイマー2のクロック入力になります。
タイマー2は入力クロックを4分周するので、カウンタのクロックは12MHzとなります。
PR2=124、プリスケーラ=1/64、ポストスケーラ=1/15と設定します。
クロックが12MHzなのでカウントアップの周期は
12MHz/(125 × 64 × 15)
となり ちょうど100Hzになります。
100Hz周期でタイマ割り込みが発生するので、ソフトウェアで割り込みの発生回数をカウントします。 100回割り込みが入ると、1秒が経過しています。
時と分のカウンタは、60秒経過時に分の変数(min)をインクリメントし、60分の経過時に時の変数(hour)をインクリメントします。
月や閏年の概念が無いので、簡単です。
出来上がり → USB_CLOCK_2.zip
PIC16F1455は内部に温度センサーを持っているので、温度補償を行い時計の精度を向上させることができます。(校正が面倒なので、やっていません。)
追記:2013/08/26
無調整の場合、どんど時刻がずれていくので、微調整ロジックを追加しました。
→ USB_CLOCK_2.zip
10000.5秒に1回、時計の微調整を行います。
サブセカンドカウンタ(sub_sec)が1000050カウントしたタイミングで、サブセカンドカウンタにアジャスト値(adjust_value)を代入します。
アジャスト値は0〜99の間で設定可能です。
アジャスト値を51に設定した場合、10000.5秒に付き1/100秒時計は進みます。
1日は86400秒なので、1日あたり
(86400/10000.5)× 0.01 ≒ 0.08639568秒時計が進みます。
アジャスト値を99とした場合、4.233388秒時計は進みます。
アジャスト値を0とした場合、4.319784秒時計は遅れます。
Xtalの発振精度が50ppmの場合、1日に最大(86400 ×(50 /1000000)) ≒ 4.32秒 時計は進み(又は遅れ)ます。
発振周波数がアジャスト値の可変範囲でカバー出来ない場合は、微調整の入る間隔を狭めて調整してください。
|
|
|