簡體   English   中英

RBIE 中斷僅工作一次 - PIC16F877A

[英]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.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM