IOC(pic 16f877a)模拟器不会调用MPLAB XC8中断例程

时间:2016-11-20 15:47:09

标签: c interrupt-handling mplab

我写了一些代码,一个简单的程序试图在的中断期间递增计数器。程序构建时没有错误,但是存在以下警告:

  

:: warning:(1273)Omniscient Code Generation在自由模式下不可用   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 Registers Counter Variable Address

因此,如果有人能够指出我的疏忽,或者引导我朝着正确的方向前进,那将非常感激。

1 个答案:

答案 0 :(得分: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
}