执行运行时中断变化
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();
}
我在 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();
}