我在下面有一些代码有一个小错误,我不知道如何解决。基本上发生的事情是我的高ISR在设置标志后运行两次。它只运行两次并且是一致的。子程序应该只运行一次,因为当RB上的输入改变时设置标志,并且在一次改变RB输入后例程运行两次。使用工作簿功能在MPLAB v8.6中进行测试。
#include <p18f4550.h>
#include <stdio.h>
void init(void)
{
RCONbits.IPEN =1; //allows priority
INTCONbits.GIE = 1; //allows interrupts
INTCONbits.PEIE = 1; //allows peripheral interrupts
INTCONbits.RBIF = 0; //sets flag to not on
INTCONbits.RBIE = 1; //enables RB interrupts
INTCON2bits.RBPU = 1; //enable pull up resistors
INTCON2bits.RBIP = 1; //RB interrupts is high priority
PORTB = 0x00;
TRISBbits.RB7 = 1; //enable RB7 as an input so we can throw interrupts when it changes.
}
#pragma code
#pragma interrupt high_isr
void high_isr(void)
{
if(INTCONbits.RBIF == 1)
{
INTCONbits.RBIF = 0;
//stuff
}
}
#pragma code
#pragma code high_isr_entry = 0x08
void high_isr_entry(void)
{_asm goto high_isr _endasm}
void main(void)
{
init();
while(1);
}
答案 0 :(得分:2)
RB7中断标志根据最后锁存值与引脚当前状态的比较进行设置。在数据表中,它说“引脚与PORTB最后一次读取时锁存的旧值进行比较.RB7:RB4的'不匹配'输出被”或“运算,产生带有标志位的RB端口变化中断。”
要清除不匹配条件,数据表继续说“PORTB的任何读取或写入(除了 MOVFF(ANY),PORTB指令)。这将结束不匹配的情况。“
然后等待一个Tcy(执行nop指令),然后清除该标志。这在the datasheet的第116页记录。
所以这个场景中最简单的修复就是在中断例程中声明一个虚拟变量并将其设置为RB7,如下所示:
#pragma interrupt high_isr
void high_isr(void)
{
unsigned short dummy;
if(INTCONbits.RBIF == 1)
{
dummy = PORTBbits.RB7; // Perform read before clearing flag
Nop();
INTCONbits.RBIF = 0;
// rest of your routine here
// ...