AVR - ATmega8A - 外部中断 - 有时奇怪的行为

时间:2014-10-10 18:36:22

标签: c external interrupt avr

我目前正在开发一个MCU单元,它将响应外部中断以执行特定任务。 我正在使用的控制器:ATmega8A。

外部中断定义如下:

PORTD |= 0x04;                          //Activate pull up resistor of PD2
GICR |= (1 << INT0);                    //Enable INT0
MCUCR |= (1<<ISC00);                    //INT0 is executed on every edge

ISR:

ISR (INT0_vect)
{
                /* interrupt code here */

                v = 1;          //sets interrupt variable v to 1    
}

我目前正在测试外部中断的行为。每当检测到外部中断时,应执行特定的代码块。 任何逻辑变化都会将中断应用于INT0。

ISR (INT0_vect)
{
    /* interrupt code here */

    v = 1;                              //sets interrupt variable v to 1    
}

int main(void)
{
    USART_Init();
    I2C_init();

    //int a;                                    //test variable

    PORTD |= 0x04;                          //Activate pull up resistor of PD2
    GICR |= (1 << INT0);                    //Enable INT0
    MCUCR |= (1<<ISC00);                    //INT0 is executed on every edge

    sei();  

    unsigned char a;
    a = USART_Receive();

    while(1)
    {
        //TODO:: Please write your application code 

        do 
        {

        } while (v == 0);     //Wait for interrupt

        v = 0;

        _delay_ms(10000);

            //Communication protocol between MCU unit and GUI software application

            //Block 1

            USART_Transmit(0xFF);                           //Header start command
            USART_Transmit(0x00);
            USART_Transmit(0x08);
            USART_Transmit(0x00);
            USART_Transmit(0x09);


            USART_Transmit(0x02);


            USART_Transmit(0x04);

            USART_Transmit(0x05);
            USART_Transmit(0x06);
            USART_Transmit(0x00);

            USART_Transmit(0xFE);                           //Header finish command

            do 
            {
            } while (v == 0);          //Wait for interrupt

            v = 0;              

        _delay_ms(10000);   

            //Block 2

            USART_Transmit(0xFF);                           //Header start command
            USART_Transmit(0x00);
            USART_Transmit(0x01);
            USART_Transmit(0x00);
            USART_Transmit(0x01);


            USART_Transmit(0x01);


            USART_Transmit(0x01);

            USART_Transmit(0x01);
            USART_Transmit(0x01);
            USART_Transmit(0x01);

            USART_Transmit(0xFE);                           //Header finish command




            }

     return 0;
}

测试代码,我可以说中断被识别并且代码正常运行。但是,似乎存在一些小错误或逻辑错误。 当第一个中断发生时(块1之前),应该执行块1。现在,如果发生第二次中断,则应执行第二个块。

我可以在预先编写的GUI应用程序中看到此执行序列,但是,大多数情况下,块1(应用中断时)会多次执行,而不是块2。

它应始终遵循以下顺序:块1而不是块2,依此类推。我认为这是一个时间问题。但是我无法调试这个问题。

我也想知道C中是否有代码告诉程序等待外部中断信号而不是继续程序?

非常感谢您提前。

0 个答案:

没有答案