| Ваш IP: 3.239.7.207 | Online(26) - гости: 8, боты: 17 | Загрузка сервера: 2.1 ::::::::::::

Работа с прерываниями PCINT0…23

Atmega328


PCINT0…23 — это входы для внешнего прерывания которое срабатывает при изменении состояния на входах PCINT0..23.

За внешние прерывания отвечают несколько регистров:

 

Регистр PCICR — определяет какую группу входов использовать в качестве источника прерывания:

7 6 5 4 3 2 1 0
PCIE2 PCIE1 PCIE0

Группа PCIE2 отвечает за входы PCINT[23:16], PCIE1 за PCINT[14:8], а группа PCIE0 за входы PCINT[7:0].

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

PCICR |= (1 << PCIE0); // определяет группу входов PCIE0 PCINT0…7

 

Далее используются при необходимости три регистра, каждый регистр отвечает за выход PCINTх в своей группе:

  • Регистр PCMSK2 отвечает за выходы PCINT[23:16]
7 6 5 4 3 2 1 0
PCINT23 PCINT22 PCINT21 PCINT20 PCINT19 PCINT18 PCINT17 PCINT16
  • Регистр PCMSK1 отвечает за выходы PCINT[14:8]
7 6 5 4 3 2 1 0
PCINT14 PCINT13 PCINT12 PCINT11 PCINT10 PCINT9 PCINT8
  • Регистр PCMSK0 отвечает за выходы PCINT[7:0]
7 6 5 4 3 2 1 0
PCINT7 PCINT6 PCINT5 PCINT4 PCINT3 PCINT2 PCINT1 PCINT0

Установка какого-нибудь бита из PCINT0…23 разрешает соответствующему выводу работать в качестве источника.

Одновременно можно задействовать несколько входов, которые будут работать как источник прерывания.

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

PCMSK0 |= (1 << PCINT0); // использовать PCINT0 в группе PCIE0

 

PCIFR — регистр флагов

7 6 5 4 3 2 1 0
PCIF2 PCIF1 PCIF0

При смене логического уровня на любом из выводов PCINT0…23 происходит вызов прерывания, при этом устанавливается соответствующий флаг прерывания PCIF0…3 (на одну группу один флаг). Этот флаг очищается аппаратно после выхода из подпрограммы обработки прерывания.

 

Обработчики прерывания PCINTx_vect, каждый для своей группы.

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

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

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

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

 

Пример:

int i;

void setup() {
  DDRB |= (1 << PB5);// выход светодиода D13 (PB5) на плате Arduino
  DDRB &= ~(1 << 0); PORTB |= (1 << 0); // выход PCINT0 (D8) как выход, подтягивающий резистор включить
  PCICR |= (1 << PCIE0); // определяет группу входов PCIE0 PCINT0...7
  PCMSK0 |= (1 << PCINT0); // использовать PCINT0 в группе PCIE0
}

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

ISR(PCINT0_vect) {
  PORTB &= ~(1 << 5); // погасить светодиод на D13
  i = 1;
}

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

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

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

Случайные статьи

  • Регулятор громкости на полевом транзисторе

    Регулятор громкости на полевом транзисторе

    На рисунке показана схема простого регулятора громкости на полевом транзисторе. Регулировка громкости осуществляется подачей отрицательного напряжения от 0 до -3 В на затвор полевого транзистора. Напряжение 0 В на затворе транзистора соответствует минимальному уровню громкости, а напряжение -3 В — максимальной громкости. Источник — https://freecircuitdiagram.com/4656-voltage-controlled-attenuator-volume-control-using-fet/Подробнее...
  • Выходной каскад (ламповые усилители)

    Однотактовый выходной каскад лампового усилителя содержит минимум деталей и прост в сборке и регулировке. Пентоды в выходном каскаде могут использоваться только ультралинейном включении, триодном или обычном режимах. При триодном включении экранирующая сетка соединяется с анодом через резистор 100…1000Ом. В ультралинейном включении каскад охвачен ОС по экранирующей сетке, что дает снижение …Подробнее...
  • ТЕРМОСТАБИЛЬНЫЙ УСИЛИТЕЛЬ МОЩНОСТИ

    ТЕРМОСТАБИЛЬНЫЙ УСИЛИТЕЛЬ МОЩНОСТИ

    С целью уменьшения нелинейных искажений при малой гром­кости режим работы транзисторов выходного каскада усилителя мощности обычно выбирают таким, чтобы в отсутствие сигнала через них протекал довольно большой ток (нередко до сотен миллиампер). Во избежание теплового пробоя, обусловленного нагреванием переходов из-за большой рассеиваемой на них мощ­ности, транзисторы выходного каскада приходится устанавливать …Подробнее...
  • Светодиодная мигалка

    Светодиодная мигалка

    Светодиодная мигалка состоит из 20 диодов в два ряда. Основа уст-ва — мультивибратор, который поочередно зажигает светодиоды. Схема очень простая, регулировка сводится к подбору С3 и С4 которые входят во время-задающую цепь мультивибратора. Усто-во работает от бестрансформаторного источника питания, который состоит из балластного конденсатора С1, резистора R2, который разряжает конденсатор С1 …Подробнее...
  • Электронный термометр (от 0 до 100°С)

    На рис. приведена принципиальная схема, предлагаемого электронного термометра. Он способен измерять температуру от 0 до 100°С, от 0 до 50°С или от — 50 до +50°С — все зависит от стрелочного индикатора РА1, используемого в приборе. Так, с показанным на схеме микроамперметром на 100 мкА термометр рассчитан на работу в …Подробнее...