AVR C如何停止中断

时间:2012-02-13 09:01:10

标签: c avr avr-gcc

我正在编程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*


} 

3 个答案:

答案 0 :(得分:3)

如果中断处理程序对您的代码表现不好,原因可能是您在中断处理程序中花费了太多时间。您应该只在中断处理程序中执行关键工作,并推迟应用程序代码中不太重要的工作;使用处理程序和应用程序代码之间共享的volatile标志,让应用程序代码知道它是否有工作要做。在您的示例中,您应该在应用程序代码中推迟itoa调用。

答案 1 :(得分:0)

使用cli();禁用中断和sei();完成显示例程后再次启用它们。 您使用的是哪种MCU?您应该使用计时器而不是延迟500毫秒。

答案 2 :(得分:0)

我相信,我迟到了,但我仍然遇到了同样的问题,我使用以下方法解决了这个问题,

使用两个标志启用中断 1.全局中断标志 2.模块相关的中断标志(在你的情况下为ADC)

您可以控制模块相关标志,在ADCSRA控制寄存器的情况下,有一个名为ADIE-ADC中断使能标志的标志,您可以用它来控制中断。

例如, 在main函数中,您可以启用该标志,并在ISR中禁用该标志。

main()
{
    //enable global flag and ADC flag
    while(1)
    {
        //your logic
        // enable ADC flag
    }
}

ISR()
{
   //disable the ADC flag
}

我希望这能解决你遇到的问题。