[英]RBIE interrupt works only once - PIC16F877A
在我的代碼中,我有兩個中斷,一個來自 TMR0 的溢出,另一個來自按下按鈕時。
這是 MikroC 中的代碼:
int compt = 0;
int seconds = 10 ;
int enable = 0;
void interrupt(){
if (INTCON.INTF) {
PORTD = 9;
enable = 1;
seconds = 10;
INTCON.INTF = 0;
}
if (INTCON.TMR0IF) {
compt++;
INTCON.TMR0IF = 0;
TMR0 = 0x06;
}
}
void main() {
TRISB = 0x01;
PORTB = 0;
PORTD = 0;
TRISD = 0x00;
INTCON = 0xB0;
OPTION_REG = 0x44;
TMR0 = 0x06;
while(1){
if (compt == 625){
if (enable) seconds--;
compt = 0;
}
if (seconds > 0 && enable == 1) {
PORTD = seconds;
PORTB.RB1 = 1;
} else {
enable = 0;
PORTB.RB1 = 0;
PORTD = 0;
}
}
}
我試圖用我的代碼實現的目標如下圖所示:
當我按下其中一個按鈕時,倒計時開始並且 LED 亮起直到倒計時結束,如果用戶在倒計時仍未達到 0 時按下按鈕,則重新開始,直到倒計時再次達到 0,然后LED 應該關閉。
我在這里面臨的是,來自 RBIE 的中斷僅起作用一次,第二次按下按鈕時,沒有任何反應。
我不確定 TMR0F 是否與此有關,嘗試了很多方法,但無法使其正常工作。
我希望你能看到我沒有注意到的東西,並幫助我。
使用MikroC,發布的代碼在編譯時不會發出警告或錯誤。
該代碼使用MLPAB v8.92中的模擬器運行,並且當使用模擬器激勵來聲明INT0中斷時,每次都會對其進行正確處理。
您的電路圖看起來是使用Proteus創建的,該模擬器的工作方式可能存在問題。
我可以找到的唯一可疑設置是為PORTB啟用了弱上拉功能,但是您的電路圖在INT0(RB0)引腳中有一個10K歐姆的下拉電阻。
我建議將OPTION_REG的第8位設置為1,以關閉PORTB上拉電阻。
抱歉,我的回答還不確定,但是我無法從發布的信息中重現您的問題。
好像這個問題也是在StackExchange上問的。
您已啟用內部弱上拉電阻並在引腳 RB0 上連接下拉電阻,不需要外部電阻,您還需要在按下按鈕后提供一些延遲(約 300 毫秒)。
聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.