エンハンスドミッドレンジコアのPICに搭載されているTimer2はちょいとだけ拡張されていて、相当長い時間のタイマーを仕掛けられるようになっていた。
 Timer2-1
具体的にはプリスケーラーに64:1に対応。

自作CDIではこのTimer2を利用してサイリスタゲートを駆動している。

16MHz版の変換関数を作ったので覚書。

#include "stdafx.h"
#include <iostream>
using namespace std;

// 1,000rpm時の1度のカウント=666.67(16Mhz Fosc/4)
#define COUNT_OF_1DEG 667 //*10
// ピックアップ信号は70度前に来る
#define PICKUP_DEG 70
// 割り込み処理等の時間がかかるので事前に差っ引く分
#define COUNT_OF_TUNE 1080

int _tmain(int argc, _TCHAR* argv[])
{
int in_deg;
int in_rpm;

unsigned short pre_degree;
unsigned short pre_count;
unsigned short prescaler;
unsigned short postscaler;
unsigned short pr2;
unsigned short result;
unsigned short xx;
while(1){
cout << "input degree>";
cin >> in_deg;
cout << "input rpm(x100)>";
cin >> in_rpm;

if( in_rpm == 0 ) continue;

// 70度前のピックアップ信号からの時間を作成
pre_degree = PICKUP_DEG - in_deg;
pre_count = ((pre_degree * COUNT_OF_1DEG * 10) / in_rpm) - COUNT_OF_TUNE ;
cout << "pre_count:" << pre_count << "\n";

// PIC Timer2 の値を作成
// Timer2はカウント値 Prescaler * PR2 * Postscaler でTimeup 
// PR2:        {0 ... 255}
// Prescaler:  {1:1/1:4/1:16}
// Postscaler: {1:1 ... 1:16}
// prescalerを算出
xx = pre_count/256;
if     ((xx/ 1) < 16) prescaler = 1;
else if((xx/ 4) < 16) prescaler = 4;
else if((xx/16) < 16) prescaler = 16;
else prescaler = 64;

// postscalerを算出
postscaler = pre_count/256/prescaler + 1;

// pr2の算出
pr2 = pre_count / prescaler / postscaler;
result = prescaler * pr2 * postscaler;
printf( "pre:%d post:%d pr2:%d total:%d result:%d \n"
, prescaler, postscaler, pr2, prescaler * pr2 * postscaler, result );
/*
11 = Prescaler is 64
10 = Prescaler is 16
01 = Prescaler is 4
00 = Prescaler is 1
*/
switch( prescaler ) {
case 1:  prescaler = 0; break;
case 4:  prescaler = 1; break;
case 16: prescaler = 2; break;
case 64: 
default: prescaler = 3; break;
}

unsigned char ch = ((postscaler-1)<<3)|4|(prescaler);
printf( "T2CON: 0x%X 0x%X\n\n" ,ch ,pr2);
}
return 0;
}

結果はこちら。
input degree>10
input rpm(x100)>100
pre_count:2922
pre:1 post:12 pr2:243 total:2916 result:2916
T2CON: 0x5C 0xF3

input degree>13
input rpm(x100)>100
pre_count:2721
pre:1 post:11 pr2:247 total:2717 result:2717
T2CON: 0x54 0xF7

input degree>