【问题标题】:PIC programing Interrupt malfunction.PIC 编程中断故障。
【发布时间】:2017-03-31 21:04:21
【问题描述】:

我是 PIC 编程新手,我正在使用 MPLAb。我有一个关于中断的问题.. 所以我想做的是,当我按下按钮时,我想打开 LED 0,如果我松开按钮,然后打开 LED 1。我认为我编写的代码是有道理的,但它没有用。

这就是发生的事情。假设按下按钮时,中断引脚的初始状态为低(0)。然后 LED 0 亮起,当我松开按钮时 LED 1 亮起。当我再次按下按钮时,我预计 LED 0 会亮起,但 LED 1 会一直亮着,并且永远不会改变状态。

我添加了最后一行来查看中断引脚的状态,一旦中断为高电平,它就永远不会将其变为低电平..你能告诉我我的误解是什么吗?

提前致谢!

这是我的代码:

void interrupt ISR(void)
{

if(INTCONbits.INTF)
{
        nextLED = 1;
        LATC = Output_Code_Buffer[nextLED];
        __delay_ms(250);
}

else
{
        nextLED = 0;
        LATC = Output_Code_Buffer[nextLED];
        __delay_ms(250);
}

nextLED = INTCONbits.INTF + 2;

LATC = Output_Code_Buffer[nextLED];
__delay_ms(250);
}

// Interrupt Enable settings
INTCONbits.INTE = 1;
INTCONbits.TMR0IE = 1;          // Enable TMR0 interrupts
INTCONbits.TMR0IF = 0;          // Clear TMR0 interrupt flag
INTCONbits.GIE = 1;             // Enable global interrupts

【问题讨论】:

  • __delay_ms(250) 在中断处理程序中是一个非常的坏主意。
  • 我明白我不应该写一个长处理类型的中断。这个程序的目的是我试图理解中断是如何工作的,所以我写了视觉呈现输出(LED)。这是中断驱动的代码,主函数基本上是空的。如果您能给我任何建议,我将不胜感激。

标签: c embedded interrupt pic microchip


【解决方案1】:

您需要在 ISR 函数中重置中断标志,否则它将继续触发。请阅读数据表,如果有必要,应提及。所以只需添加 INTCONbits.INTF = 0;到 ISR,它应该按预期工作。

在设置单片机的任何外设或功能时,您应该仔细阅读数据表并使用寄存器的描述以及设置它们的内容。您还需要小心模拟端口,它们通常默认为模拟而不是数字,导致中断无法按预期触发或导致意外中断。最好先设置 MCU 配置位,设置 TRIS 和模拟选择寄存器(ANSELx 或 ANSELAx 等),然后设置您要使用的任何外设的寄存器。然后设置中断,始终重置所有要使用的中断标志,以从已知状态开始。

您还设置了 TMR0IE = 1,它会做同样的事情,触发一个中断。如果您不重置 TMR0 标志,它将继续触发、锁定您的 MCU 或减慢它的速度。

【讨论】:

    猜你喜欢
    • 2021-02-28
    • 2017-06-23
    • 1970-01-01
    • 1970-01-01
    • 2018-02-27
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2011-07-20
    相关资源
    最近更新 更多