• ベストアンサー
※ ChatGPTを利用し、要約された質問です(原文:16ビットPICのインプットキャプチャについて)

16ビットPICのインプットキャプチャについて

このQ&Aのポイント
  • 16ビットPICのインプットキャプチャは、8ビットのPICとは異なる使用方法があります。
  • dsPIC33Eを使用しているが、パルス幅計測がうまくできない問題がある。
  • C-Bの計測で値が狂っている可能性がある。バッファの使い方や配列の要素の違いによるエラーかもしれない。

質問者が選んだベストアンサー

  • ベストアンサー
  • koujikuu
  • ベストアンサー率43% (429/993)
回答No.2

No.1追記 pic24は勉強中の身で間違っているかも知れませんが 1) ReadCapture関数 この関数は、すべての待ち状態の入力キャプチャ・バッファを読み出します 参考 http://www.microchip.com/stellent/groups/devtools_sg/documents/devicedoc/jp019851.pdf 2) ICxCON2 / ICTRIG=0 同期モード キャプチャの度にタイマがクリアされる 参考 12.9.1 同期タイマ動作 http://ww1.microchip.com/downloads/jp/DeviceDoc/70352B_JP.pdf キャプチャ1、キャプチャ2で同じ信号をキャプチャする場合、キャプチャタイマ1,2共に同期を取る必要があるのでは? 又は 単純キャプチャモード&エッジ検出モードの方が時系列の判別がしやすいと思います。

Snoodam
質問者

お礼

アドバイスを頂いてから、まだ触れていません。 申し訳ございません。 仰られる通り、FIFOに拘らず、「実現させたい機能は何か」 を考え、もう一度考えなおします。

その他の回答 (1)

  • koujikuu
  • ベストアンサー率43% (429/993)
回答No.1

プログラム見ました、データシートで確認した限りでは, 1) キャプチャ開始時にICxBUF_FIFOバッファのクリアが必要 2) ICxBUF読み込み時にICOV,ICBNEフラグのチェックがされていない(データが正しいか不明) 3) 割り込み処理内でLCD表示を行っている、(LCD表示は時間がかかります) 以上を検証してみて下さい。 参考にしたデータシート dsPIC33E/PIC24E ファミリリファレンス マニュアル セクション12. 入力キャプチャ http://ww1.microchip.com/downloads/jp/DeviceDoc/70352B_JP.pdf PIC24FJ128GA310 http://www.microchip.com/stellent/groups/picmicro_sg/documents/devicedoc/jp556267.pdf LCD SC1602B コマンド処理時間 1.52mS~37μS http://akizukidenshi.com/download/ds/sunlike/SC1602BBWB-XA-LB-G.pdf

Snoodam
質問者

お礼

アドバイスありがとうございます。 お礼が遅れまして申し訳ございません。 また、私の見にくいプログラムまで見て頂き本当にありがとうございます。 現在、割込みでキャプチャ値を取得し、 メインループ内でLCDの表示するように変更をしております。 初めのエッジ(FRE,FDE)はうまく取得できていますが、2つめ(SRE,SDE) の値が安定しないので、理由を探っています。 割込みイベントの発生を1回~4回まで指定できるので、2回度に割込みを掛けましたが それでも2つめの取得がうまくいきません。 16FファミリではFIFOバッファはないので、本日のもう一度一から考えなおして 駄目であれば、16Fファミリーの様に、バッファのない場合での取得を考えなおします。 (キャプチャフラグを見て、そのループに入るとカウンタを+して、配列型の変数に代入) if(IC1のフラグ){ i++; Captimae[i]; } の様に致します。 仕様書まで、探して頂きありがとうございます。 dsPICの方は、下名も所持しておりました。 また,LCDはそのものズバリでした。 いつもありがとうございます。 /*以下ソースコード参照先*/ http://anasys.blog.fc2.com/blog-entry-5.html /*以下抜粋*/ void _ISR _IC1Interrupt(void){ ReadCapture1(&FDE); // First Down Edge ReadCapture1(&SDE); // Second Rise Egde do { ReadCapture1(&dumy); }while(IC1CON1bits.ICBNE); IFS0bits.IC1IF=0; } void _ISR _IC2Interrupt(void){ ReadCapture2(&FRE); ReadCapture2(&SRE); do { ReadCapture2(&dumy); }while(IC2CON1bits.ICBNE); IFS0bits.IC2IF=0; }

関連するQ&A