执行运行时中断变化

Interrupt-On-Change during execution runtime

我在 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,即使它正在执行延迟或函数循环。

谢谢

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

#define RESET() asm("reset")

因此,在您的中断处理程序中,只需插入这行代码:

RESET();

问题现已解决。每当我在运行时需要中断更改 (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();
}