前回、内部クロックを使ってPIC12F675で時計を作って試してみたら、4~6%の誤差だった。
今回はそれよりは精度の高いと思われるセラロックを使った外部からのクロックを用いて時計を試した。
セラロックは真ん中のピンをグランドに、残りの両側の2本のピンをCLKINとCLKOUTにつなぐだけだ。
プログラムの方は、mikroBASICのプロジェクトの設定で、Oscillator Selection を HS oscillator に変更し、今回使ったのが16MHzのものなので、前回内蔵オシレーターの4MHzでは、
4 x 256 x 256 x 15 = 3932160 ( 4MHz = 4000000 ) で近似させていたものを
4 x 256 x 256 x 61 = 15990784 ( 16MHz = 16000000 ) で近似させることにした。
5LEDs001
カウントのプログラムの誤差だけでも、前回は約1.70%だったものが今回は0.06%に収まった。
ああ、それで、時計用の水晶発振器の周波数が32.768kHzとかなのな。といまさら気づく。
32768は2の15乗だから、もしPIC12F675に使うとしたら、きっちりな数にできるわけだ。当然他のデジタル機器でも同様に1秒を作りやすい。
また、今回は経過時間の記録の際にEPPROMを満遍なく使って1ヶ所だけに書き込みが集中しないようにした。
結果は、実時間が 4191秒、PICの数えた時間が 4123秒 となって、誤差は1.62%となった。
セラロックは周波数精度±0.5%ということなので、もう少し精度が出てもいいかなとは思う。
追記
まったく、無知ってこわい。
上では一生懸命に近似とか言って計算してるわけだが、実は、というか幾度も読んでいたのにその意味が頭に入っていなかったらしく、TMR0にあらかじめ値を入れておけばその続きからカウントが始まるんだということがスッポリ頭から抜けていた。
つまり、それが8ビットに収まる範囲なら好きな数を選んでカウントさせられることができるわけだ。
何で、256にこだわってたんだろう。
たとえば、16MHzなら 4 x 256 x 125 x 125 できっちりと16000000になって、近似も何もないわけだ。ただし、その処理にかかる時間は誤差になるので、どっちを取るかは誤差の程度次第ということになる。