2016-07-08 41 views
0

我在PIC16LF1618的RC7上使用了中断电平变化。下面是我用我-O-C初始化位:执行期间运行期间的电平变化中断

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

我能够使用上RC7一个正触发掉电模式(休眠)唤醒PIC。不过,我希望在执行期间也可以使用此触发器,就好像RC7上的任何正触发器都应重置PIC并转至main()函数的第一行。

请问如何让我知道如何做到这一点? P:由于复位需要尽可能快地发生,并且对执行时间至关重要,所以我无法在主函数中添加多个if语句来检查RC7上的正触发。因此,我正在寻找一个中断选项来重置PIC,即使它正在执行延迟或函数循环。

感谢

回答

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(); 
} 
0

在大多数8位PIC设备,并且正在使用XC8假设,有一个调用所需的装配命令的定义:

#define RESET() asm("reset") 

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

RESET(); 
+0

是的,我正在使用XC8。那么,像这样的帮助? #define RESET()asm(“reset”) 主循环内部:\t //因为我正在调用SLEEP函数,通常应禁用GIE和PEIE位。 \t INTCONbits.GIE =​​ 1; \t INTCONbits.PEIE = 1; 睡眠功能之前:\t //禁用GIE和PEIE位以便从睡眠模式唤醒 \t INTCONbits.GIE =​​ 0; \t INTCONbits.PEIE = 0;如果(RC7 == 1){ \t INTCONbits.GIE =​​ 0; \t INTCONbits.PEIE = 0; IOCCF =((IOCCF)(0xFF)&IOCCF); \t RESET(); } } –

+0

@ArunKumar它应该已经被定义,所以只需使用'RESET();'无论你在哪里需要你的逻辑 - 该逻辑是你的选择,我只是让你知道如何强制PIC的硬件复位来自代码。在你的中断中,你可以检查相关的寄存器来确定你是否刚刚从睡眠中醒来。 –

+0

RESET()正常工作。但是,它完成了一次完全的软重启,我想避免这种情况。有没有办法从ISR中断跳转到main()中的标签? –