32bitタイマ(その1)

PIC24Fには32bitタイマそのものは無いが、16bitタイマ2つを連携して32bit動作させることが可能である。
リファレンスマニュアルによると、タイマにはタイプA、タイプB、タイプCの3種類があり、タイプBとCを組み合わせる。タイプB(クロック同期回路有り)がLSW側、タイプC(クロック同期回路無し)がMSW側となる。
通常動作(16bitタイマ)と32bitタイマの切り替え設定もタイプBのレジスタに存在する。

PIC24FJ64GA002やPIC24FJ64GA004にも、これらタイプA〜Cが以下のように存在する。

タイマ名 タイプ 32bitタイマ動作
Timer1 タイプA 不可
Timer2 タイプB Timer3と組み合わせる
Timer3 タイプC Timer2と組み合わせる
Timer4 タイプB Timer4と組み合わせる
Timer5 タイプC Timer5と組み合わせる

"PIC24FJ64GA004Family Data Sheet"の"FIGURE 11-1: TIMER2/3 AND TIMER4/5 (32-BIT) BLOCK DIAGRAM"を参照すると以下のことが解る(Timer2&3のみについて記述)。

  1. 2つのタイマがカスケード接続しているのではない(ようだ)。
  2. タイプB(例えばT2CK)の入力を利用する。タイプC側の設定、例えばプリスケーラは効かない。
  3. 全制御ビットはT2CONに存在する。
  4. TMR3をアクセスせず、代わりにTMR3HLDを利用する。
  5. TMR3とTMR3HLD間のread/writeは、TMR2のread/writeと同期して実施される。だからTMR2よりも、先にTMR3HLDをwrite、あるいは後でTMR3HLDをreadする。順番を間違えると、TMR3HLD経由でTMR3の値を正しくread/write出来ない。
  6. タイマ割込はTimer2ではなく、後段のTimer3の割込T3IFで発生する。
  7. Timer2/3だけがA/Dコンバータのトリガに使用できる。

1.は次のような意味。Fosc=32MHz → Fosc/2 = 16MHzのとき、プリスケーラ1:1とする。1秒を計りたいとき、16000000をカウントするが16bitを越える。カスケード接続(1段目のコンペアマッチ信号を2段目でカウント)だと16000000 = 400 x 40000のように分割して2段階でカウントする必要があるが、一連の32bitカウントなので直接16000000(0xF42400)をカウントすればよい。MSWの0x00F4をPR3に、LSWの0x2400をPR2に設定すればよい。
5.について、だから「TMR3HLDはバイトアクセスして良い」とはどこにも書かれていない。まあ、バイトアクセスする必要性は少ないと思うからよいけど。