2017-03-31 5 views
-2

私はPICプログラミングを初めて使い、MPLAbを使用しています。私は中断に関する質問を持っています。 私は何をしたいのですか?ボタンを押すとLED 0が点灯し、ボタンを放してLED 1が点灯すれば意味があります。しかしそれはうまくいかなかった。PICプログラミング割り込みの誤動作。

ここでは何が起こりますか。ボタンが押されると、割り込みピンの初期状態がロー(0)であるとしましょう。その後、LED 0が点灯し、ボタンを離すとLED 1が点灯します。もう一度ボタンを押すと、LED 0は点灯していますが、LED 1はオンのままで、状態は決して変わらないと思います。

最後の行を追加して割り込みピンの状態を確認し、割り込みがハイになっても、決してlowに変更しません。私の誤解は何ですか?

ありがとうございます!あなたがISR機能の割り込みフラグをリセットする必要があるか、それだけでトリガ続ける

void interrupt ISR(void) 
{ 

if(INTCONbits.INTF) 
{ 
     nextLED = 1; 
     LATC = Output_Code_Buffer[nextLED]; 
     __delay_ms(250); 
} 

else 
{ 
     nextLED = 0; 
     LATC = Output_Code_Buffer[nextLED]; 
     __delay_ms(250); 
} 

nextLED = INTCONbits.INTF + 2; 

LATC = Output_Code_Buffer[nextLED]; 
__delay_ms(250); 
} 

// Interrupt Enable settings 
INTCONbits.INTE = 1; 
INTCONbits.TMR0IE = 1;   // Enable TMR0 interrupts 
INTCONbits.TMR0IF = 0;   // Clear TMR0 interrupt flag 
INTCONbits.GIE = 1;    // Enable global interrupts 
+1

割込みハンドラの '__delay_ms(250)'は**非常に悪い考えです。 – Olaf

+0

長い処理タイプの割り込みを記述しないでください。このプログラムの目的は、割り込みの仕組みを理解しようとしているので、視覚的提示出力(LED)を書いたのです。これは割り込み駆動型のコードであり、主な機能は基本的に空です。あなたが私に何か示唆を与えることができれば幸いです。 –

答えて

0

は、ここに私のコードです。データシートをお読みください。したがって、INTCONbits.INTF = 0を追加するだけです。 ISRに報告し、期待どおりに動作するはずです。

mcuのペリフェラルまたは機能を設定するときは、データシートを参照して、レジスタの説明と設定するものを使用する必要があります。また、アナログポートに注意する必要があります。アナログポートは、デジタルではなくアナログにデフォルト設定されているため、割り込みが予期したとおりに発生しないか、予期しない割り込みが発生することがあります。最初にMCU設定ビットを設定し、TRISとアナログ選択レジスタ(ANSELxまたはANSELAxなど)を設定してから、使用する周辺機器のレジスタを設定することをお勧めします。次に、割り込みを設定し、常に使用する予定のすべての割り込みフラグをリセットして、既知の状態で開始します。

TMR0IE = 1も設定します。これは同じことを行い、割り込みをトリガーします。 TMR0フラグをリセットしないと、トリガが維持され、あなたのMCUがロックされるか遅くなります。

関連する問題