- ベストアンサー
PIC16F726を使った割込み処理時のLED点灯について
- PIC16F726を使用して割込み処理を行ってLEDの点灯を行うプログラムを作成しましたが、正常に動作しない現象が発生しています。
- 割込み処理のIF文を変更した場合、LEDの点灯が行われません。設定の間違いではないかと思われますが、コンパイラのバグの可能性も考えられます。
- 使用環境はMPLAB IDE v8.30とHI-TECH C v9.71aです。同様の現象について詳しい方のご意見をお待ちしています。
- みんなの回答 (3)
- 専門家の回答
質問者が選んだベストアンサー
アセンブルされたコードを読む限り, コンパイラのバグで無いコトが分かります. タイマ割り込みのみの利用であれば, MPLABのデバッガをシュミレータに設定し, アセンブラレベルでステップ実行してPC(プログラムカウンタ)が期待の動作をしているかを確認すれば10分程度で原因の特定が可能かと思います. 気になるポイントとしてはコード全体のボリュームが不明ですが, 関数ネストが深くなっていませんか? ほとんどのPIC16Fはハードウェアスタックが8層しかないので, 一般的に割り込みブランチ時のコールなども含めたワーストでの試算が必要です.
その他の回答 (2)
- BuriBuri4
- ベストアンサー率28% (150/525)
C/C++、Javaでは && 条件で連結した場合、条件が非成立になった段階でテストが打ち切られ以降の条件はテストされません。 TMR2IE && TMR2IF の場合、TMR2IEがfalseであればTMR2IFはテストされません。 正常動作の為にTMR2IFがテストされる必要がある…って事は無いですか?
補足
回答ありがとうございます。 >TMR2IE && TMR2IF の場合、TMR2IEがfalseであればTMR2IFはテストされません。 >正常動作の為にTMR2IFがテストされる必要がある…って事は無いですか? これに関しては今のところそれらしい記述は発見できていません。 テストの順番はデータシートに書いてあった例を真似しています。 下に書いたのがその内容です。 void interrupt tc_int(void) { if (T0IE && T0IF) { T0IF=0; ++tick_count; } }
- salsberry
- ベストアンサー率69% (495/711)
コンパイラのバグである可能性はありますが、断定はできません。TMR2IEやTMR2IFが何らかの副作用を持つマクロだったりすれば、その評価順で結果が変わることもあり得ます。 TMR2IEおよびTMR2IFの定義と、コンパイラが出力したコード (正常・異常の両方) を示してください。
お礼
回答ありがとうございます。 T0IE、T0IF、TMR2IE、TMR2IFはコンパイラが用意していたヘッダーファイルに定義されていたもので、内容は下記のとおりです。 volatile bit T0IE @ ((unsigned)&INTCON*8)+5; volatile bit T0IF @ ((unsigned)&INTCON*8)+2; volatile bit TMR2IE @ ((unsigned)&PIE1*8)+1; volatile bit TMR2IF @ ((unsigned)&PIR1*8)+1; アセンブラコードはこんな感じです if(TMR2IF && TMR2IE){ //正常に動作する方 08A 1283 BCF 0x3, 0x5 08B 1303 BCF 0x3, 0x6 08C 1C8C BTFSS 0xc, 0x1 08D 288F GOTO 0x8f 08E 2890 GOTO 0x90 08F 2896 GOTO 0x96 090 1683 BSF 0x3, 0x5 091 1303 BCF 0x3, 0x6 092 1C8C BTFSS 0xc, 0x1 093 2895 GOTO 0x95 094 2896 GOTO 0x96 095 2896 GOTO 0x96 if(TMR2IE && TMR2IF){ //異常な動作を起こす方 08A 1683 BSF 0x3, 0x5 08B 1303 BCF 0x3, 0x6 08C 1C8C BTFSS 0xc, 0x1 08D 288F GOTO 0x8f 08E 2890 GOTO 0x90 08F 2896 GOTO 0x96 090 1283 BCF 0x3, 0x5 091 1303 BCF 0x3, 0x6 092 1C8C BTFSS 0xc, 0x1 093 2895 GOTO 0x95 094 2896 GOTO 0x96 095 2896 GOTO 0x96
お礼
返事が遅くなり申し訳ありません。 その後、ステップ実行を行って原因を探って見たところ どうもPORTレジスタを触るべきところでTRISレジスタを触っているようです。 試しにコンパイラのVER下げて、v9.65をインストールして使用してみたところ正常に動作したので、 やはり何かしらのバグなんじゃないかと思います。 とりあえずメーカに連絡してみようと思います。 どうもありがとうございました。