ATtiny2313
PCINT0…7 — это входы для внешнего прерывания которое срабатывает при изменении состояния на входах PCINT7..0.
Для ATtiny2313 входы PCINT0..7 соответствуют входам PB0..7.
За внешние прерывания отвечают три регистра.
Регистр GIMSK — разрешает прерывания
7 | 6 | 5 | 4 | 3 | 2 | 1 | 0 |
PCIE |
Прерывания на выводах PCINT0…7 разрешено, если PCIE бит установлен в 1. Любое изменение на любом из выводов PCINT0…7 сгенерирует прерывание.
Пример использования:
GIMSK |= (1 << PCIE); // разрешает прерывания на PCINT0…7
Регистр PCMSK — маска прерываний
7 | 6 | 5 | 4 | 3 | 2 | 1 | 0 |
PCINT7 | PCINT6 | PCINT5 | PCINT4 | PCINT3 | PCINT2 | PCINT1 | PCINT0 |
Каждый бит из PCINT0…7 отвечает за свой вывод. Установка какого-нибудь бита из PCINT0…7 разрешает соответствующему выводу работать в качестве источника.
Одновременно можно задействовать несколько входов, которые будут работать как источник прерывания.
Пример использования:
PCMSK |= (1<<PCINT0) | (1 << PCINT3); // разрешает входам PCINT0 и PCINT3 работать в качестве источника прерываний.
Регистр флагов — EIFR
7 | 6 | 5 | 4 | 3 | 2 | 1 | 0 |
PCIF |
При смене логического уровня на любом из выводов PCINT0…7 происходит вызов прерывания, при этом устанавливается соответствующий флаг прерывания PCIF. Этот флаг очищается аппаратно после выхода из подпрограммы обработки прерывания.
Обработчики прерывания PCINT_vect
Пример использования:
ISR(PCINT_vect){ // — код — //} — при возникновении прерывания исполняется // — код — //
Пример:
byte i; void setup() { DDRD |= (1 << 5); // PD5 - выход DDRB &= ~(1 << 0);PORTB |= (1 << 0); // вход PCINT0 как вход, использовать подтягивающий резистор DDRB &= ~(1 << 3);PORTB |= (1 << 3); // вход PCINT3 как вход, использовать подтягивающий резистор GIMSK |= (1 << PCIE);// разрешает прерывания на PCIN PCMSK |= (1<<PCINT0) | (1 << PCINT3);// разрешает выходам работать в качестве источника } void loop() { PORTD |= (1 << 5); // PD5 выход 1 if(i==1)delay(5000);i=0; // как сработает прерывание подождать 5 секунд } ISR(PCINT_vect){ PORTD &= ~(1 << 5); i=1; }
Светодиод подключенный к выходу PB5 горит всегда, если кратковременно замкнуть вход PCINT0 или PCINT3 на GND, светодиод погаснет на 5 секунд и загорится вновь.