2016-04-24 41 views
0

我正在使用MPLAB爲我的項目編程PIC16F84A。我有一個彙編代碼,其中RB4-7位連接到按鈕,因此用作輸入。一箇中斷子程序被實現來處理任何新的中斷(當一個按鈕被按下時)。一切正常,當按下按鈕時,圖片會轉到指定的子程序。但現在,當我在子程序中時,我必須清除該標誌(INTCON - RBIF),但該標誌未被清除,但清除INTCON寄存器中的任何其他位都可以正常工作。所以我該怎麼做?MPLAB,試圖清除一點,但它仍然是1

這裏是我的代碼:

 ORG  0X00 
     GOTO START 
     ORG  0x04 
     BTFSC INTCON,RBIF 
     GOTO RBX_INT 
START CLRF PORTA 
     MOVLW B'10001000' 
     MOVWF INTCON 
     BSF  STATUS,RP0 
     CLRF TRISA 
     MOVLW B'11110000' 
     MOVWF TRISB 
     MOVLW B'10000111' 
     MOVWF OPTION_REG 
     BCF  STATUS,RP0 
MAIN GOTO MAIN 

這是我的子程序:

RBX_INT BCF  INTCON,RBIF 
     MOVLW D'156' 
     CALL DELAY 
     RETFIE 
+1

如果這是一個「變更中斷」,即使您不需要知道狀態,您也需要**讀取**端口。如果你不這樣做,觸發中斷的邏輯將繼續觸發。 –

+0

@RogerRowland是的,這是問題所在。 – kamal

回答

0

,應清除該位從中斷返回的權利之前,否則新的中斷可能已經發生,而在delay循環和RBIF將被再次清除。發生這種情況是因爲按鈕反彈(https://en.wikipedia.org/wiki/Switch#Contact_bounce)。

此外,數據表規定:

輸入引腳(RB7的:RB4) 與鎖定在最後 讀PORTB的舊值進行比較。 RB7:RB4 的「不匹配」輸出被OR運算在一起產生RB端口變化 標誌位RBIF(INTCON < 0>)的中斷。

這意味着您必須在清除RBIF之前閱讀PORTB以更新鎖存值。

RBX_INT 

    MOVFW PORTB  ;Read PORTB to update the latch. 
    MOVLW D'156' 
    CALL DELAY 
    BCF  INTCON,RBIF ;Clear interrupt flag as close as possible to RETFIE. 
    RETFIE 

此外,您應該瞭解有關中斷服務例程的上下文保存/恢復。在這個例子中,它並不重要,因爲主循環什麼也不做,只是因爲中斷可能隨時發生,所以應該注意保存它使用的所有寄存器和資源,並在退出中斷之前恢復它們以防止損壞來自任何數據/狀態主代碼路徑。

見部分

6.9 現場保護中斷

在PIC16F84A數據表時。

+0

延遲已經在處理反彈效應。我已經做了你的建議,但沒有奏效。 – kamal

+0

只要您清除RBIF,PORTB上的任何活動都會在硬件中重新設置。延遲僅在清除RBIF之前執行時纔有所幫助。 – Unimportant

+1

是的你說的是正確的,但那不是我的問題。該標誌未被設置爲零。我正在使用刺激來觸發中斷,並且我正在查看每一步的位數,但仍然沒有清除RBIF。 – kamal

相關問題