执行运行期间的中断更改

时间:2016-07-08 09:33:57

标签: c embedded pic interrupt-handling

我在PIC16LF1618的RC7上使用电平变化中断。这是我用于I-O-C的初始化位:

void I_O_C_Initialize (void) {
    INTCONbits.IOCIF = 0;
    IOCCFbits.IOCCF7 = 0;
    INTCONbits.IOCIE = 1;
    IOCCP = 0x80;
}

我可以使用RC7上的正触发将PIC从掉电模式(SLEEP)唤醒。但是,我想在执行期间也可以使用此触发器,就好像RC7上的任何正触发器应该重置PIC并转到main()函数的第一行。

请告诉我如何实现这个目标?

P.S:由于复位需要尽快发生并且对执行时间至关重要,我无法在main函数中添加多个if语句来检查RC7上的正触发。因此,我正在寻找一个中断选项来复位PIC,即使它正在执行延迟或功能循环。

由于

2 个答案:

答案 0 :(得分:1)

在大多数8位PIC器件中,假设您使用XC8,有一个定义可以调用所需的汇编命令:

#define RESET() asm("reset")

因此,在你的中断处理程序中,只需插入以下代码行:

RESET();

答案 1 :(得分:0)

此问题现已得到解决。在运行期间需要中断更改(IOC)并使用以下功能时启用GIE位后,IOC在运行时和掉电模式(SLEEP)期间工作。

void interrupt ISR (void);

void interrupt ISR (void) { 
    if (RC7==1) {
        asm("pagesel foobar");
        asm("goto foobar");
    }
    else
        return;
} 


asm("foobar:");
while (1) {
    IOCCFbits.IOCCF7 = 0;
    INTCONbits.GIE = 1;

    . //Do the calculations here
    . //Here if any Interrupt On Change happens for RC7,
    . //the ISR routine would stop all calculations and
    . //would return to the start of the loop without
    . //resetting any of the registers.

    INTCONbits.GIE = 0;
    IOCCFbits.IOCCF7 = 0;
    SLEEP();
}