Тема 2
3.97M

Тема 2 АТС (прерывания)

1. Тема 2

Аппаратные прерывания

2.

Прерывание (Interrupt) – сигнал, сообщающий
процессору о наступлении какого-либо события.
При этом выполнение текущей последовательности
команд приостанавливается и управление передаётся
процедуре обработки прерывания.
После выполнения процедуры обработки прерываний
исполнение кода продолжается с того места, где он был
прерван.
Процедура обработки прерывания (Interrupt
Service Routine) – это подпрограмма, которую следует
выполнить при возникновении определенного события.

3.

Влияние внешнего прерывания на ход выполнения программы

4.

опрос состояния в цикле
прерывание
Программная реализация
просто
очень просто
код программы усложняется
занимает процессорное время
Аппаратная реализация
нужно устранять дребезг
очень просто
delay() использовать нельзя
delay() использовать можно
Многозадачность
многозадачности нет
псевдомногозадачность
Точность сбора данных
под сомнением
возможна

5.

Для аппаратных прерываний выделены специальные контакты.
Прерывания обозначаются с помощью идентификационного
номера, которому сопоставлен определенный контакт (пин).
attachInterrupt(pin, handler, mode)
процедура вызова
прерывания
pin – номер прерывания
handler – имя функции-обработчика прерывания
mode – режим работы прерывания
* LOW (низкий) – срабатывает при сигнале LOW на пине
* RISING (рост) – срабатывает при изменении сигнала на пине с LOW на HIGH
* FALLING (падение) – срабатывает при изменении сигнала на пине с HIGH на LOW
* CHANGE (изменение) – срабатывает при изменении сигнала (с LOW на HIGH и
наоборот)

6.

attachInterrupt(0, proc1, FALLING)
digitalPinToInterrupt(pin)
возвращает номер прерывания на пине
attachInterrupt(digitalPinToInterrupt(2), proc1, FALLING)
detachInterrupt(pin)
отключает прерывание с номером pin

7.

* переменные, изменяемые в прерывании, должны быть
объявлены как volatile
переменная со спецификатором volatile (нестабильная)
может изменяться в прерывании и компилятору её нельзя
удалять при оптимизации кода
* в прерывании не работают задержки типа delay()
* в прерывании не меняет своё значение millis() и micros()
* в прерывании некорректно работает вывод в порт. Не стоит
там его использовать – это нагружает ядро
* в прерывании нужно стараться делать как можно меньше
вычислений и вообще “долгих” действий – это будет тормозить
работу МК при частых прерываниях!

8.

Пример программы с прерыванием
# define buttonPin 2
volatile int counter = 0;

void setup()
{

attachInterrupt(0, proc1, FALLING);
}
void proc1()
{
counter++;
}
void loop()
{
Serial.println(counter);
delay(500);
}

9.

10.

Аппаратное устранение дребезга в подавляющем большинстве
случаев более предпочтительно программному, по ряду причин:
- аппаратная реализация всегда более надежна;
- высвобождаются ресурсы процессора из-за отсутствия
необходимости дополнительных вычислений;
- уменьшается объем кода и упрощается процесс отладки.
Аппаратный способ устранения дребезга основан на
использовании сглаживающих фильтров (RC-цепочек).
Конденсатор поглощает все резкие пики,
медленно накапливая и отдавая энергию.

11.

Схема устранения
дребезга с помощью
RC-цепочки
Сигнал на выходе RC-цепочки,
устраняющей дребезг
Из-за сглаживания, вызванного
конденсатором, момент прерывания
определяется неточно
Добавление резистора R2
увеличивает время разряда и
обеспечивает безопасность
компонентов

12.

Крутизну спада сигнала можно увеличить с
помощью триггера Шмитта.
Интегральные схемы с триггером Шмитта
обеспечивают резкий перепад сигнала на
выходе, при превышении входным сигналом
определенного порога.
Триггер Шмитта преобразует аналоговый сигнал в «цифровой»
Условное графическое обозначение триггеров Шмита

13.

Цоколевка микросхемы 74НС14

14.

Схема устранения дребезга триггера Шмитта
Сигнал на выходе триггера
Шмитта
English     Русский Rules