内蔵のオシレーターで時計を作るとどんな感じなのか試してみた。
回路は簡単。
プログラムはこんな感じ。
5LEDs001
プログラム内の目新しいところを書く。
OSCCAL = 0x64 という行では、プログラム・メモリーの最後に書かれている内蔵オシレーターの補正値をOSCCALに書き込んでいる。
また、EEPROM_Write を使った部分は、スターとしてからの経過秒数をカウントしておき、EEPROMに書き込んでいる。
PIC12F675のタイマー関連の仕様は以下の通り。
±1%の精度の4MHzの内蔵クロックを持っている。
このクロックを4カウントしたものがTMR0に入る。
TMR0は8ビットのカウンターと8ビットのプリスケーラーを持っている。
以上から1MHzは1秒間に1000000クロックなので、1000000 / 256 / 256 = 15.26 となって、256 x 256 x 15 = 983040 が1秒に一番近いカウントになるので、これを1秒とみなすようにプログラムを書いたつもりだ。
よーいドンで、PICの回路に電源を入れ、同時にストップウォッチで時間を計測し、41分40秒経過したときに電源を切った。
41分40秒は2500秒で、EEPROMに残されていた値は0x0981で2433秒だったので、67秒の差ということになる。約3%だ。
もともときっちりと割り切れた数字でしかカウントできないので、そのあたりを計算し直すと、2433という値は、2433 x 15 x 256 x 256 x 4 = 9566945280クロック分で、本当なら 4MHz x 2500sec = 10000000000クロックとなるところだから、実は約4%の誤差ということで、ちょっと大きいのかな。