【问题标题】:AVR C how to stop interruptAVR C如何停止中断
【发布时间】:2012-02-13 09:01:09
【问题描述】:

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


} 

【问题讨论】:

  • 什么是ADCSRA?它被定义为易失性吗?它是否同时控制显示器和 ADC?您是否需要中断控制器和/或 I/O 设备的特殊中断确认操作?您的 ISR 是否足够慢以至于错过了一些中断?
  • @AlexeyFrunze - ADCSRA 是一个特殊功能寄存器,可直接操作硬件设置。它被定义为 volatile。

标签: c avr avr-gcc


【解决方案1】:

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

【讨论】:

    【解决方案2】:

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

    【讨论】:

      【解决方案3】:

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

      使用两个标志启用中断 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
      }
      

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

      【讨论】:

        猜你喜欢
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 2019-04-29
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        相关资源
        最近更新 更多