- ベストアンサー
IC16F1829でのCCPモジュールについて
- PIC16F1829でのCCPモジュールを使用した、パルス幅のキャプチャに関する状況と問題について説明します。
- CCPモジュールを用いてパルス幅を計測しようとしているが、割込み関数を使用するとCCP1IFが検知されず、処理が正常に動作しない。
- 質問者は力不足で原因を特定できず、参考書やデータシートも調べたが解決策が見つからない状況です。
- みんなの回答 (2)
- 専門家の回答
質問者が選んだベストアンサー
補足です 参考 日本語データシートPIC16F193X http://www.microchip.jp/docs/41364B_JP.pdf の "4.0割り込み (注) " に、" 各割り込みフラグ ビットは、その他のイネーブル ビットのステートとは無関係にセットされます。" の記述があります CCP1IE=1 をセットするとCCP1割り込みが許可され、CCP1IF=1 になると割り込み処理ベクタが呼び出されます そして割り込み処理内で、CCP1IF=0 にしないと、割り込み処理終了後に、再度CCP1割り込みが発生しメインルーチンに戻らなくなります (正確にはメインルーチンのアセンブラ1命令ごとに割り込みがかかる 超低速動作) 注意) PIC16F は割り込みベクタがひとつの為、複数の割り込みが同じ割り込みベクタを共有します 割り込み処理内で、各割り込みフラグを判別して分岐するのですが、 CCP1IF=1 かつ CCP1IE=1 の時のみCCP1割り込み処理を行うようにしないと、CCP1IE=0 にしてCCP1割り込みを禁止したつもりでも、CCP1IF=1 になると他の割り込み時に間違ってCCP1割り込み処理を実行する恐れがあります。
その他の回答 (1)
- koujikuu
- ベストアンサー率43% (429/993)
検証した訳では無いですが、(TMR0IE=1;TMR1IE=1;TMR4IE=1;CCP1IE=1;CCP4IE=1) と全ての割り込みが許可されていますが、割り込み処理にてTMR0,TMR4のみしか対応していません この辺に問題があるのでは?、(例 CCP1割り込みがかかると、CCP1IFをクリアしない限り連続して割り込み処理がコールされます) CCP1IFはCCP1IEの状態に限らずセットされます、CCP1IEは割り込み処理をコールするか、しないかの違いです。
お礼
koujikuu様: 早速のアドバイスありがとうございます。 結論から言いますと、仰ることで解決できそうです。 CCP1IE=0; としたら、問題が解決できました。 あとは、最終的に細部を組んでいきます。 >CCP1IFはCCP1IEの状態に限らずセットされます、CCP1IEは割り込み処理をコールするか、しないかの違いです。 main関数内だけでCCP1IFを使う場合は、イネーブルしなくていいんですね。 本当にありがとうございました。 以下は、もしお時間があられましたら助言を頂けると幸いです。 「なぜ今回の問題にお気づきになられましたか?」 後閑さんの書籍[PIC16F1ファミリ活用ガイドブック」を中心に色々書籍を読んでみましたが、わからなっかたのでここで質問をしましたが、なぜ今回の問題が発生したかを今後自己解決したいと考えております。 (本にも書いてあって私の理解不足なのか、本にも書いていなかったのか) (1)PICの割込処理(メモリアーキテクチャ等)の問題なのか? 我流+トライアンドエラーでやってきましたので、CPUの構造等は殆ど意識せずに行ってきました。 やはり、今回の問題の発見には上記のことも意識しないと行けなかったのでしょうか。
補足
なんどもすみません。 補足です。 今回の問題の 「CCP*IF」はmain内でのみ使う場合は割込み処理をイネーブルしないというのは、PICの方言的なものなんでしょうか? AVRやH8系でも同じなのでしょうか? →私の知識がなさ過ぎて、上記のことは当たり前レベルなのでしょうか?
お礼
お忙しい中、資料までも示して頂きありがとうございます。 >割込処理ベクタがコールされる 教えて頂き、理解ができました。 今後は、CPUの内部での処理も意識して、データシートを読めるように、このあたりの勉強も していきます。 本当にありがとうございました。