インプットキャプチャモジュールの罠

dsPICシリーズのインプットキャプチャモジュールの罠をご紹介しましょう。
一つ目はオートボーレートの罠です。 これは、UARTモジュールとインプットキャプチャモジュールを同時に使用しようとしたときに起こります。 dsPICのUARTモジュールにはオートボーレートという機能(?)があります。 ようするにスタートビットの長さからボーレートを自動設定しようという話です。 便利そうに聞こえますが、実はこれ、単にRxピンをインプットキャプチャにつなげるだけです。 オートとか言いながら、自動設定するためのプログラムは 全て自分で書かなければなりません。 なんという詐欺商法。
しかも、UARTが勝手にインプットキャプチャを使用するため、 インプットキャプチャモジュールはもはや使えません。 UART用ならそれ専用に用意してあればいいのに・・・
結局、オートボーレートが有効になっていると、 「なぜか良く分らないけどインプットキャプチャモジュールが使えない?!」という事態に陥るのです。 オートボーレートを有効にしていても自分でそういうプログラムを組まない限り、UARTとしては変化はなく、UARTが怪しいなどと誰も思いません。 もちろんコンパイルエラーにもなりません。

二つ目はインプットキャプチャ割り込みの罠です。 dsPICのインプットキャプチャには4データ分のFIFOバッファがあります。 サイトによってはこのFIFOバッファをクリアしないと、割り込みが発生しないと記載しています。 が、これは間違いです。 FIFOバッファをクリアしなくてもインプットキャプチャは発生しますし、割り込みも発生します。 4データ分以上のデータはオーバーフローして消えてなくなります。

三つ目もインプットキャプチャ割り込みの罠です。 dsPICではインプットキャプチャが何回か発生したら割り込む設定にすることができます。 しかし、立上り+立下りエッジの検出モード(IC_EVERY_EDGE))においては何故かこの設定に関わらずキャプチャするたびに毎回割り込みが発生します。 必要な場合はキャプチャ回数を自分で数えましょう。


次にPIC18Fシリーズのインプットキャプチャモジュール(CCPモジュール)の罠をご紹介しましょう。
PIC18Fシリーズというよりかは、コンパイラC18のバグです。 C18にはインプットキャプチャモジュールを使うOpenCapture1(), OpenCapture2()などという関数があります。 問題は二つ目のOpenCapture2()です。 この関数を使うとメモリの不正アクセスにより異常動作します。厄介なことにコンパイルエラーにはなりません。 OpenCapture2()だけです。OpenCapture1()やOpenCapture3(), OpenCapture4(), OpenCapture5()は大丈夫です。 原因はこのOpenCapture2()という関数内でのみfarデータポインタが使用されており、その後nearにもどされていないためです。
参考1参考2 (ページ37))
また、他のCCPモジュール関数であるOpenCompare2()、OpenPWM2()でも同じことが起こります。
対策は2つあります。 一つ目は、これらの関数の後に以下の文を追記。
TBLPTRU = 0;
これでnearデータポインタに戻されます。
二つ目は関数を使わないことです。すなわち、直接レジスタを操作し、
CCP2CON = 5; //Capure every rising edge
TRISBbits.TRISB3 = 1; //RB3 = INPUT

のようにします。

Top