PIC時計をセラロックのみでタイマー0で動かしていた時の処理を見直してみた。
タイマーのインターバルの計算部分を抜き出してみると、以下のように定義してある。
// タイマーの設定 #define PERIOD 1000000 // period in uS - one second here #define XTAL 4000000 // crystal frequency - 4MHz #define IPERIOD (4 * 1000000 / XTAL) // Period of instruction clock in uSeconds #define SCALE 256 // Timer 0 prescaler #define T0_TICKS 256 // Number of counts for interrupt #define TICK_PERIOD (SCALE * IPERIOD) // Period (uSec) of one increment of timer 0 #define RELOADS ((PERIOD/T0_TICKS)/TICK_PERIOD)
これらの#define
をちゃんと計算してみると、以下のようになる。
IPERIOD = (4 * 1000000 / XTAL) = 1 TICK_PERIOD = (SCALE * IPERIOD) = (256 * 1) = 256 RELOADS = ((1000000/256)/256) = 3906.25/256 = 15.2587890625
このRELOADS
が割り切れないから正確じゃないんじゃないかと思う。
プリスケーラーとか調整してうまく設定できないのかな?
1000000を分解すると64×25×25×25となるから、タイマー1みたくタイマーのカウンターを設定できればいけるんじゃないかな?
水晶発振子のチェックが終わったら試してみよう。
ピンバック: セラロックのみの見直しの失敗 « Physical Computingに挑戦!