2017-03-31 146 views
-2

我是PIC編程新手,我正在使用MPLAb。我有一個關於中斷的問題.. 所以我想要做什麼,當我按下一個按鈕,然後我想打開LED 0,如果我釋放按鈕,然後打開LED 1.我認爲我寫的代碼是有道理的但它不起作用。PIC編程中斷故障。

這是發生了什麼事。假設按下按鈕時,中斷引腳的初始狀態爲低電平(0)。然後,LED 0亮起,當我鬆開按鈕時,LED 1亮起。當我再次按下按鈕時,我期望LED 0亮起,但LED 1保持亮起,並且永不改變狀態。

我添加了最後一行來查看中斷引腳的狀態,一旦中斷爲高電平,它永遠不會將其更改爲低電平。請您告訴我什麼是我的誤解?

在此先感謝!

這裏是我的代碼:

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)'在中斷hanlder中是一個非常糟糕的主意。 – Olaf

+0

我知道我不應該寫一個具有長處理類型的中斷。這個程序的目的是嘗試瞭解中斷是如何工作的,所以我編寫了可視化演示輸出(LED)。這是中斷驅動的代碼,主要功能基本上是空的。如果你能給我任何建議,我將不勝感激。 –

回答

0

您需要重置在ISR功能的中斷標誌,否則將只是保持觸發。請閱讀數據表,應該提及是否有必要。所以只需添加INTCONbits.INTF = 0;到ISR,它應該按預期工作。

當設置MCU的任何外設或功能時,應該查看數據表並使用寄存器的描述以及設置它們的內容。您還需要小心模擬端口,模擬端口通常默認爲模擬模式而不是數字模式,導致中斷不會按預期觸發或導致意外中斷。最好先設置MCU配置位,設置TRIS和模擬選擇寄存器(ANSELx或ANSELAx等),然後設置要使用的任何外設的寄存器。然後設置中斷,總是重置所有要用來啓動已知狀態的中斷標誌。

您還設置TMR0IE = 1,它會做同樣的事情,觸發一箇中斷。如果你不重置TMR0標誌,它將繼續觸發,鎖定你的單片機或減慢速度。