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のみについて記述)。
- 2つのタイマがカスケード接続しているのではない(ようだ)。
- タイプB(例えばT2CK)の入力を利用する。タイプC側の設定、例えばプリスケーラは効かない。
- 全制御ビットはT2CONに存在する。
- TMR3をアクセスせず、代わりにTMR3HLDを利用する。
- TMR3とTMR3HLD間のread/writeは、TMR2のread/writeと同期して実施される。だからTMR2よりも、先にTMR3HLDをwrite、あるいは後でTMR3HLDをreadする。順番を間違えると、TMR3HLD経由でTMR3の値を正しくread/write出来ない。
- タイマ割込はTimer2ではなく、後段のTimer3の割込T3IFで発生する。
- 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はバイトアクセスして良い」とはどこにも書かれていない。まあ、バイトアクセスする必要性は少ないと思うからよいけど。