[英]AVR C how to stop interrupt
我正在编写AVR MCU。
它具有读取模拟引脚的POT。 似乎该中断一直在被调用,并且必须在LCD_display方法期间调用该中断,因为它与我的LCD混乱了。
有没有办法在程序块运行之后停止入侵?
int main(void)
{
/*Turn on ADC Interrupt */
ADCSRA |= (1 << ADIE);
/*Turn On GLobal Interrupts*/
sei();
/* Intalise LCD */
lcd_init(LCD_DISP_ON); /* initialize display, cursor off */
lcd_clrscr();
lcd_puts("READY");
DDRB &= ~(1 << PINB5); //set input direction
ADC_Init(128, 0); //initalize ADC
while (1)
{
if (!bit_is_clear(PINB, 5))
{
_delay_ms(500);
if (!pressed)
{
lcd_gotoxy(0,0);
lcd_clrscr();
lcd_puts("test"); //Doesnt work unless I dont comment out the last line of interrupt
pressed = 1;
}
}
/* INTERRUPTS */
//ADC INTERRUPT
ISR(ADC_vect)
{
char adcResult[4];
uint8_t theLowADC = ADCL;
uint16_t theTenBitResults = ADCH<<8 | theLowADC;
itoa(theTenBitResults, adcResult, 10);
ADCSRA |= (1 << ADSC); //next conversion *if i comment out this line it works*
}
如果中断处理程序的行为不佳,原因可能是您在中断处理程序上花费了太多时间。 您只应在中断处理程序中执行关键工作,而在应用程序代码中延迟次要工作; 使用在处理程序和应用程序代码之间共享的volatile
标志,以使应用程序代码知道它是否有工作要做。 在您的示例中,您应该在应用程序代码中延迟itoa
调用。
我相信,我迟到了,但仍然遇到了使用以下方法解决的相同问题,
使用两个标志允许中断1.一个全局中断标志2.一个模块相关的中断标志(在您的ADC中)
您可以控制与模块相关的标志,在ADCSRA控制寄存器中,有一个名为ADIE- ADC中断允许标志的标志,您可以使用它来控制中断。
例如,在主要功能中,您可以启用该标志,而在ISR中则禁用该标志。
main()
{
//enable global flag and ADC flag
while(1)
{
//your logic
// enable ADC flag
}
}
ISR()
{
//disable the ADC flag
}
我希望这能解决您遇到的问题。
使用cli(); 禁用中断和sei(); 在完成显示例程后再次启用它们。 您正在使用哪个MCU? 您应该适当使用计时器,而不要使用500毫秒的延迟。
声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.