我写了一些代码,一个简单的程序试图在portbbits.rb7的中断期间递增计数器。程序构建时没有错误,但是存在以下警告:
:: 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
因此,如果有人能够指出我的疏忽,或者引导我朝着正确的方向前进,那将非常感激。
答案 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
}