Работа с прерываниями INT0 и INT1

Atmega328


INT0 и INT1 — это внешние прерывания которые обрабатываются когда возникают внешние события на входах INT0 и INT1. Внешним событием может быть изменение логического состояния на входах INT0 и INT1, а само срабатывание прерывания может происходить как по фронту, так и по уровню входного сигнала.

За внешние прерывания отвечают три регистра.

 

Регистр EICRA — определяет тип обрабатываемого события

7 6 5 4 3 2 1 0
ICS11 ICS10 ICS01 ICS00

Биты регистра ICS01 и ICS00 отвечают за тип события на INT0ICS11 и ICS10 за INT1.

Типы событий при которых происходит прерывание:

  • 00 – Низкий уровень на ножке INT0 или INT1
  • 01 – Любое изменение на ножке INT0 или INT1
  • 10 – нисходящий фронт на ножке INT0 или INT1
  • 11 – восходящий фронт на ножке INT0 или INT1

Пример использования:

EICRA |= (1<<ISC01); // прерывание происходит при любом изменении на входе INT0

 

Регистр EIMSK — разрешает прерывания

7 6 5 4 3 2 1 0
INT1 INT0

Пример использования:

EIMSK |= (1<<INT0); // разрешение прерывания на входе INT0

 

Регистр флагов EIFR 

7 6 5 4 3 2 1 0
INTF1 INTF0

Регистр отвечает за использование прерывания, если логика на ножке изменилась, то в регистре появляется запись, и вектор прерывания начинает обрабатываться.

 

Обработчики прерывания ISR(INT0_vect) и ISR(INT1_vect) 

Пример использования:

ISR(INT0_vect){ // — код — //} — при возникновении прерывания на входе INT0 исполняется // — код — //

Пример:

bool i;

void setup(){
  DDRB |= (1 << 5); // PB5 как выход
  DDRD &= ~(1 << 2); // PD2 как вход (INT0)
  PORTD |= (1 << 2); // подтягивающий резистор к PD2 (INT0)
  EICRA |= (1<<ISC01);  //Прерывания INT0 по нисходящему фронту INT0
  EIMSK |= (1<<INT0);   //Разрешить внешние прерывания INT0
  }

void loop(){
  PORTB |= (1 << 5); // PB5 выход 1
 if(i==1)delay(5000);i=0; // как сработает прерывание подождать 5 секунд
  }

ISR(INT0_vect){
  PORTB &= ~(1 << 5); // PB5 выход 0
  i=1;
  }

Светодиод на плате Arduino Uno который подключен к PB5 горит всегда, если кратковременно замкнуть вход INT0 на GND, светодиод погаснет на 5 секунд и загорится вновь.

Добавить комментарий

Войти с помощью: