Ниже представлен код:
- Код: Выделить всё • Развернуть
#include <avr/io.h>
#include <avr/delay.h>
#include <avr/interrupt.h>
ISR(INT0_vect){
PORTB = 0b00000010;
_delay_ms(200);
PORTB = 0b00000000;
_delay_ms(200);
}
void init_ports(void)
{
DDRB = 0b00000011;
PORTB = 0b00000000;
DDRA = 0b00000001;
PORTA = 0b00000001;
DDRD=0b00000000;
PORTD=0b00000000;
}
void init_interrupt(void)
{
GICR = 0b01000000;
MCUCR = 0b00000011;
}
void led_manager(void)
{
while (1)
{
PORTB = 0b00000001;
_delay_ms(700);
PORTB = 0b00000000;
_delay_ms(700);
}
}
int main(void)
{
init_ports();
init_interrupt();
sei();
while(1)
{
led_manager();
//TODO:: Please write your application code
}
}
В протеусе это выглядет следующим образом:
К ножкам PB0 и PB1 анодами напрямую подключены светодиоды. Через кнопку падаётся напряжение на ножку PD2(INT0). Так вот. Когда запускаю симуляцию с начало кратковременно загорается светодиод на PB1, а потом по циклу функции начинает led_manager(); мигать светодиод на PB0. При нажатии на кнопку светодиод на PD2 так же кратковременно загорается и в этот момент СД на PB0 гаснет как и должно быть. Но остаётся два вопроса. Почему в самом начале после запуска симуляции выполняется процедура прерывания и почему после первого раза как нажал на кнопку она больше не выполняется?