2015-09-25 1 views
1

Это код таймера, который начнется после нажатия кнопки (INT0) и сброс после нажатия кнопки некоторое время в Atmega128. Но после того, как я нажимаю кнопку, пока Таймер запускается автоматически. По-моему, внешнее прерывание активировалось как-то после того, как я отпустил кнопку. Но я понял, почему? Я буду очень признателен с вашей помощьюОшибка внешнего прерывания AVR

#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); 
    } 
} 
+0

Где вы думаете об этом? –

+0

Вам не нужны намеренные задержки в любом ISR - как НИКОГДА! ISR всегда должен обрабатываться как можно быстрее. Храните информацию (нажата кнопка) из ISR в некоторой «глобальной» переменной и выполняйте обработку в цикле main(). –

ответ

0

Это довольно поздно ответ, но и для тех, кто видел это в первый раз: механический выключатель как внешнее прерывание не так просто, как это может выглядеть. Механический выключатель вызывает «подпрыгивание», то есть серию «импульсов», а не одно чистое изменение. Это может быть решена аппаратной задержкой или программным обеспечением. Для получения дополнительной информации см.: http://www.instructables.com/id/Arduino-Push-Switch-Debouncing-Interrupts/