【问题标题】:Interrupt-On-Change during execution runtime执行运行时的更改中断
【发布时间】:2016-07-08 09:33:57
【问题描述】:

我在 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:由于重置需要尽快发生并且对执行时间至关重要,因此我无法在主函数中添加多个 if 语句来检查 RC7 上的正触发。因此,我正在寻找一个中断选项来重置 PIC,即使它正在执行延迟或函数循环。

谢谢

【问题讨论】:

    标签: c embedded pic interrupt-handling


    【解决方案1】:

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

    #define RESET() asm("reset")
    

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

    RESET();
    

    【讨论】:

    • 是的,我正在使用 XC8。那么,这样的事情会有帮助吗? #define RESET() asm("reset") 在主循环内部: //因为我正在调用 SLEEP 函数,所以通常应该禁用 GIE 和 PEIE 位。 INTCONbits.GIE =​​ 1; INTCONbits.PEIE = 1;在 SLEEP 功能之前://禁用 GIE 和 PEIE 位以便从 SLEEP 模式唤醒 INTCONbits.GIE =​​ 0; INTCONbits.PEIE = 0;无效中断 ISR (void) { if (RC7 == 1) { INTCONbits.GIE =​​ 0; INTCONbits.PEIE = 0; IOCCF = ((IOCCF^0xFF)&IOCCF);重启(); } }
    • @ArunKumar 它应该已经定义好了,所以只要在你需要的逻辑中使用RESET(); - 该逻辑是你的选择,我只是让你知道如何强制硬件重置 PIC从代码。在您的中断中,您可以检查相关寄存器以确定您是否刚刚从睡眠中醒来。
    • @KooroshHajiani 不,不是一个好主意。跳出中断会使堆栈损坏并在以后引起问题。最好设置一个标志并在主循环中捕获它。
    • @KooroshHajiani 正确的设计是在 ISR 中设置一个标志并从主循环中捕获它。 OP 没有显示任何这种逻辑,所以不清楚为什么这是“不可能的”,但这是处理它的正确方法。从 ISR 跳出后,系统逻辑上仍位于 ISR 内部,保存了寄存器,禁用了全局中断,并期望稍后出现 RETFIE,而这将永远不会发生。这绝对不是解决方案。
    • @ArunKumar 为什么不通过中断使用 SPI 来简化你的主循环,那么你就不需要“冗长”的例程了。这是一种常见的模式。
    【解决方案2】:

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

    【讨论】:

      猜你喜欢
      • 2013-08-27
      • 2010-11-15
      • 2011-03-20
      • 2013-07-06
      • 2020-11-09
      • 1970-01-01
      • 2019-05-25
      • 2021-11-22
      • 2015-11-30
      相关资源
      最近更新 更多