2017-03-31 120 views
-2

我是PIC编程新手,我正在使用MPLAb。我有一个关于中断的问题.. 所以我想要做什么,当我按下一个按钮,然后我想打开LED 0,如果我释放按钮,然后打开LED 1.我认为我写的代码是有道理的但它不起作用。PIC编程中断故障。

这是发生了什么事。假设按下按钮时,中断引脚的初始状态为低电平(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 
+1

'__delay_ms(250)'在中断hanlder中是一个非常糟糕的主意。 – Olaf

+0

我知道我不应该写一个具有长处理类型的中断。这个程序的目的是尝试了解中断是如何工作的,所以我编写了可视化演示输出(LED)。这是中断驱动的代码,主要功能基本上是空的。如果你能给我任何建议,我将不胜感激。 –

回答

0

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

当设置MCU的任何外设或功能时,应该查看数据表并使用寄存器的描述以及设置它们的内容。您还需要小心模拟端口,模拟端口通常默认为模拟模式而不是数字模式,导致中断不会按预期触发或导致意外中断。最好先设置MCU配置位,设置TRIS和模拟选择寄存器(ANSELx或ANSELAx等),然后设置要使用的任何外设的寄存器。然后设置中断,总是重置所有要用来启动已知状态的中断标志。

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