AVR外部中断错误

时间:2015-09-25 07:30:08

标签: timer external interrupt avr atmega

这是Timer的代码,它会在按下按钮(INT0)后启动,并在按下按钮一段时间后在Atmega128中复位。但是按下按钮一会儿,Timer会自动启动。在我看来,在释放按钮后,外部中断以某种方式激活。但我知道为什么?我将非常感谢您的帮助

#include <avr/io.h>
#include <avr/interrupt.h>
#include <util/delay.h>
int a,b,c;
int main(void)
{   DDRA = 0xff;
    DDRB = 0xff;
    DDRC = 0xff;
    DDRD = 0x00;
    sei();  
    OCR1A = 0xFFFF; 
    TIMSK |= (1 << OCIE1A);
    TCCR1A |= (1 << COM1A0);
    TCCR1B |= (1<<WGM12);

    EIMSK = (1 << INT0);

    while (1)
    {
        int iggy;
        iggy=iggy+1;
    }
}
ISR (TIMER1_COMPA_vect) //When Timer interrupt activates, These actions will be taken
{
    if(a==9)
    { a=0;
        if(b==9)
        {b=0;
            if(c==9)
            {  c=0;}
            else
            {  c=c+1;}
        }
        else
        {b=b+1;}
    }
    else
    { a=a+1;}
    PORTA = a;
    PORTB = b;
    PORTC = c;
}

ISR(INT0_vect)          //When button is pressed it will start timer clock and if it pressed too long it will stop the clock and reset values
{
    TCCR1B |= (1 << CS10);
    _delay_ms(800);
    if(PIND==0b00000000)
    {   
        TCCR1B |= (0 << CS10);
        a=0;
        b=0;
        c=0;
        PORTA = a;
        PORTB = b;
        PORTC = c;
        _delay_ms(1000);
    }
}

1 个答案:

答案 0 :(得分:0)

这是一个很晚的答案,但对于那些第一次见过的人: 作为外部中断的机械开关并不像它看起来那么简单。 机械开关导致弹跳,即一系列脉冲&#39;而不是一个简单的改变。 它可以通过硬件延迟或软件来解决。 有关详细信息,请参阅:http://www.instructables.com/id/Arduino-Push-Switch-Debouncing-Interrupts/