Atmega328
INT0 и INT1 — это внешние прерывания которые обрабатываются когда возникают внешние события на входах INT0 и INT1. Внешним событием может быть изменение логического состояния на входах INT0 и INT1, а само срабатывание прерывания может происходить как по фронту, так и по уровню входного сигнала.
За внешние прерывания отвечают три регистра.
Регистр EICRA — определяет тип обрабатываемого события
7 | 6 | 5 | 4 | 3 | 2 | 1 | 0 |
ICS11 | ICS10 | ICS01 | ICS00 |
Биты регистра ICS01 и ICS00 отвечают за тип события на INT0, ICS11 и 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 секунд и загорится вновь.