PIC16Fシリーズのタイマ0の動作
2014-07-06
仕事の多忙に加え、またしても填まってしまったゲームに余暇を費やしてしまい、無線系に割く時間が短い状況です。GPSモニタのソフトについてはボチボチ完成しそうなんで、適当にブレッドボードに組んでデバッグしてしまいたいところなんですが、ついついゲームパッドに手が行ってしまいます・・・年甲斐も無く
幾つか覚え書きしておきたいことを得意のパワポで書き出していますが、GPSモニタの次に着手するであろう周波数カウンタ・・・まぁ、この構想も幾つかバリエーションがあるんでどういう風に進んでいくか自分でも謎ですが、PIC16Fシリーズで実現する場合に関わりそうな部分を今回の「公式備忘録」(=このブログの記事)にしました。
まず、PIC内蔵のタイマで周波数を測定する場合、タイマ0かタイマ1をカウンタとして使いますが、タイマ0は固定的に内部クロック(システムクロック)と同期カウントさせるような仕掛けになっていることから、プリスケーラなしでは数MHz程度までしか測定できません。
一方のタイマ1は、この内部同期を取る・取らないの選択ができ、同期を取らなければカタログ値でも数十MHzまでのカウントができるようです。さらにタイマ1は「カウンタ・ゲートの制御機能」を持っており、特に拡張ミッドレンジ・・・簡単に手に入るシリーズでは18xxや19xxなどのPICでは、かなりのバリエーションのゲート制御ができますから、周波数カウンタとして使うならタイマ1に軍配が上がるものと思います。
タイマ1のゲート制御方式の中に、タイマ0のカウント・オーバフローを使ったものがあります。タイマ0のオーバフローをトリガにタイマ1のカウントを停止させるこの方式を使うことで、ゲートタイムの設計を柔軟に考えることができる非常に好都合な機能なんですが、ゲートタイムとしての正確性を確保できなければ意味がありません。そこで、このタイマ0に正確なクロックを与えることが命題となります。
タイマ0に正確なクロックを与える方法は、システムクロック自体を正確なものにするか外から与えるかの二択になりますが、システムクロックをタイマ0で分周してゲートタイムを作るとすると、比較的長い時間のゲートタイム・・・例えば1秒のものは、タイマ0の分周のみでは非常に低いシステムクロック(約262KHz)となってしまい、ちょっと現実的ではありません。勿論、ソフト処理を介在させればどうにでもなるんですが、ソフトで片付けるのは余り面白くありません
・・・と、能書きは置いて(え、能書きだったの
)、タイマ0で無理なく分周でき、かつ長いゲートタイムが作れるよう、タイマ0に外からクロックを供給した場合の動作をまとめました。

実は直前の記事が伏線になっていたりします
タイマ0に与えるクロックが「2のべき乗」になっていると、分周設定が楽・・・ここでは「256Hz」を与えたことにしました。
タイマ0のT0CKIのサンプリングは、命令タイミングのQ1、Q3の立ち上がりエッジが起点となります。Q1で認識されたもの(図中の黄色)は3クロック後のQ4、Q3で認識されたもの(図中のオレンジ)は5クロック後・・・つまり次の命令タイミングのQ4ということになります。また、あまりに短いパルスは認識できませんが、この辺りの詳細は各PICのデータシートに記載されています。
図では、前提となっている「★」の条件にした場合65ns程度の遅れが生じることから、多分「Q3で認識される」という様子をオレンジで示しており、この65nsの遅延は常に同じですから、タイマ0のカウントアップも常に同じタイミングで起きる・・・という解釈をしています。
以上、これまた自分にしか必要の無い備忘録でした。

幾つか覚え書きしておきたいことを得意のパワポで書き出していますが、GPSモニタの次に着手するであろう周波数カウンタ・・・まぁ、この構想も幾つかバリエーションがあるんでどういう風に進んでいくか自分でも謎ですが、PIC16Fシリーズで実現する場合に関わりそうな部分を今回の「公式備忘録」(=このブログの記事)にしました。
まず、PIC内蔵のタイマで周波数を測定する場合、タイマ0かタイマ1をカウンタとして使いますが、タイマ0は固定的に内部クロック(システムクロック)と同期カウントさせるような仕掛けになっていることから、プリスケーラなしでは数MHz程度までしか測定できません。
一方のタイマ1は、この内部同期を取る・取らないの選択ができ、同期を取らなければカタログ値でも数十MHzまでのカウントができるようです。さらにタイマ1は「カウンタ・ゲートの制御機能」を持っており、特に拡張ミッドレンジ・・・簡単に手に入るシリーズでは18xxや19xxなどのPICでは、かなりのバリエーションのゲート制御ができますから、周波数カウンタとして使うならタイマ1に軍配が上がるものと思います。
タイマ1のゲート制御方式の中に、タイマ0のカウント・オーバフローを使ったものがあります。タイマ0のオーバフローをトリガにタイマ1のカウントを停止させるこの方式を使うことで、ゲートタイムの設計を柔軟に考えることができる非常に好都合な機能なんですが、ゲートタイムとしての正確性を確保できなければ意味がありません。そこで、このタイマ0に正確なクロックを与えることが命題となります。
タイマ0に正確なクロックを与える方法は、システムクロック自体を正確なものにするか外から与えるかの二択になりますが、システムクロックをタイマ0で分周してゲートタイムを作るとすると、比較的長い時間のゲートタイム・・・例えば1秒のものは、タイマ0の分周のみでは非常に低いシステムクロック(約262KHz)となってしまい、ちょっと現実的ではありません。勿論、ソフト処理を介在させればどうにでもなるんですが、ソフトで片付けるのは余り面白くありません

・・・と、能書きは置いて(え、能書きだったの


実は直前の記事が伏線になっていたりします

タイマ0のT0CKIのサンプリングは、命令タイミングのQ1、Q3の立ち上がりエッジが起点となります。Q1で認識されたもの(図中の黄色)は3クロック後のQ4、Q3で認識されたもの(図中のオレンジ)は5クロック後・・・つまり次の命令タイミングのQ4ということになります。また、あまりに短いパルスは認識できませんが、この辺りの詳細は各PICのデータシートに記載されています。
図では、前提となっている「★」の条件にした場合65ns程度の遅れが生じることから、多分「Q3で認識される」という様子をオレンジで示しており、この65nsの遅延は常に同じですから、タイマ0のカウントアップも常に同じタイミングで起きる・・・という解釈をしています。
以上、これまた自分にしか必要の無い備忘録でした。
- 関連記事
-
- PIC焼きと4倍速・・・
- PICのConfigビットの「逆論理」な奴
- PIC16Fシリーズのタイマ0の動作
- LCDライブラリを整える
- IPEで書けた!