Это код таймера, который начнется после нажатия кнопки (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);
}
}
Где вы думаете об этом? –
Вам не нужны намеренные задержки в любом ISR - как НИКОГДА! ISR всегда должен обрабатываться как можно быстрее. Храните информацию (нажата кнопка) из ISR в некоторой «глобальной» переменной и выполняйте обработку в цикле main(). –