2016-11-20 59 views
0

我寫了一些代碼,一個簡單的程序,試圖在的中斷期間遞增計數器。該方案建立沒有錯誤但警告存在:MPLAB XC8中斷程序沒有被調用IOC(圖16f877a)模擬器

::警告:(1273)全知代碼生成在免費模式下不可 的main.c:32:警告:(520)功能「_interrupt」從來都不是所謂

#define _XTAL_FREQ 8000000 

#include <pic16f887.h> 
#include <xc.h> 

char counter = 0; 
char dummy = 0; 

void main(void) 
{ 
    TRISB = 0x80;   //Configure PORTB pin 7 to input 
    TRISC = 0xOO;   //Configure PORTC to output 

    INTCONbits.RBIF = 0; //clear interrupt on change flag 
    INTCONbits.GIE = 1; //enable global interrupts 
    INTCONbits.RBIE = 1; //enable port change interrupt 

    while(1) 
    { 
     PORTC = counter; //update PORTC with value of counter 
    } 
    return; 
} 

void Interrupt (void) 
{ 
    INTCONbits.RBIF = 0; //clear Interrupt on change flag 
    dummy = PORTB;  //do a dummy read to clear IOC flag 
    counter++;   //increment counter 
} 

在我見過的代碼片段,人們通常是在硬件上測試他們的中斷。然而,我還沒有硬件,所以試圖做一些模擬和檢查地址寄存器等東西。

我做了一個假設,我可以用軟件驗證中斷程序(參見附件屏幕抓取)。 File RegistersCounter Variable Address

因此,如果任何人都可以指出我的遺漏,或引導我在正確的方向,這將是非常感激。

+0

你覺得'中斷'會怎麼被調用? – Olaf

+0

我的歉意,我忘了提及我可以在模擬器中切換PORTBbits.7。因此,我期望一旦我這樣做,這個例程就會被調用。 – misterjase

+0

嗨,Olaf,你是否提到我在中斷定義中缺少[tag:ISR]的事實?那麼事情並不是你所指的,我已經包括它,我現在有一個乾淨的構建,但我仍然無法訪問中斷服務程序。還有什麼提示? – misterjase

回答

0

您需要將函數限定符interrupt添加到您的中斷服務例程的定義中,以便編譯器知道它是中斷服務例程而不是常規函數,並且可能重命名該函數本身,以便名稱和限定符明確分開:

void interrupt ISR (void) //Added 'interrupt' qualifier and renamed function to 'ISR' for clarity. 
{ 
    INTCONbits.RBIF = 0; //clear Interrupt on change flag 
    dummy = PORTB;  //do a dummy read to clear IOC flag 
    counter++;   //increment counter 
} 
+0

我在教程中看過,這樣做並不是必須的,所以我沒有嘗試過。將做出調整,看看會發生什麼。 – misterjase

+0

謝謝。這解決了一個問題。 – misterjase

+0

我將你的修改添加到我的代碼中,並且我沒有關於構建的錯誤或警告,但是我現在試圖弄清楚爲什麼我不能在ISR中打破這個中斷點。 – misterjase

相關問題