Самодельный кодовый замок на микроконтроллере (pic16f628a)

Принцип работы сигнализации на микроконтроллере

Схема работает следующем образом.

  1. После того как мы подали напряжение. То схема после истечения 10 секунд должна перейти в охранный режим. Если схема перешла в этот режим, то она просигнализирует об этом. Информирование происходит подачей импульса 0.5 сек. на сирену. Только должно быть условие что контакты замкнуты на корпус. И далее должен загореться индикатор «статус» системы.
  2. Если у нас один из контактов разомкнут то будет подано 3 импульса. Продолжительность каждого импульса 0.5 сек, и с паузой в 0.5 сек. Светодиод «статус» при этом будет мигать 1 раз ( если разомкнут контакт 1). Если разомкнут контакт 2 то будет мигать  2 раза . При разомкнутых контактах 2 или 3 будет мигать 3 раза. Продолжительность мигания 1 секунда, интервал 0.5 сек. перерыв 4 сек. Режим охраны не включается.
  3. Если мы перешли и находимся в режиме охраны и в этом состоянии у нас размыкается контакт 1. То с задержкой 3 сек начинается оповещение (подается импульс на сирену длительностью 60 секунд). Также подается импульс в 3 сек. на светодиод оптопары. Светодиод «статус» как в пункте 1 и 2 начинает мигать. Если с момента размыкания контакта 1 в течении 3-х минут не он не замкнется. То будет повторно оповещение.
  4. Если, с момента первого разрыва контакта 1, в течении 6-ти минут  шлейф не восстановлен то выдается повтор оповещения.
  5. После того как контакты разомкнулся и не восстановился после 7-минут. На оптопару будут поданы 6 импульсов с продолжительностью 3 сек. и периодом 1 час. После того как контакт 1 разомкнули, микроконтроллер мониторит состояние контакта 2.
  6. Если во время процессов оповещения по контакту 1 происходит разрыв контакта 2, то оповещение по контакту 2 происходит с задержкой  1 минута.
  7. При условии что по истечению 60 сек. после первого разрыва шлейф №1 восстановлен на период 10 сек., на любом этапе, то через 10 сек. схема продолжает работу с п.2, за исключением светодиода «статус» который запоминает что шлейф №1 был разорван (повторение п.2.5 возможно не более 10 раз)
  8. Если в режиме охраны  шлейф №2 разрывается начинается оповещение (импульс на сирену продолжительностью 60 сек и импульс продолжительностью 3 сек на светодиод оптопары). Светодиод «статус» начинает мигать, как указано в п.1.1. 3.1. Если, с момента первого разрыва шлейфа №2, в течении 3-х минут  шлейф не восстановлен то выдается повтор оповещения.
  9. Если, с момента первого разрыва шлейфа №2, в течении 6-ти минут  шлейф не восстановлен то выдается повтор оповещения.
  10. Если, с момента первого разрыва шлейфа №2, шлейф не восстановлен в течении 7-ми минут то на светодиод оптопары подается 6 импульсов продолжительностью 3 сек с периодичностью 60 минут. На период разрыва шлейфа №2 охрана ведется по шлейфу №1. 3.4 Если во время процессов оповещения по шлейфу №2 происходит разрыв шлейфа №1, то оповещение по шлейфу №1 происходит с задержкой 60 сек.
  11. Если по истечении 60 сек. после первого разрыва шлейф №2 восстановлен на период 10 сек., на любом этапе, то через 10 сек. схема продолжает работу с п.3 за исключением светодиода «статус» который запоминает что шлейф №2 был разорван (повторение п.3.5 возможно не более 10 раз).
  12. Если разорваны оба шлейфа схема ожидает восстановления шлейфов как в п.2.5 и п.3.5. При дальнейшем восстановлении работы схемы светодиод «статус» сохраняет память о сработанных шлейфах.

Принципиальная схема

Устройство, схема которого изображена на рис. 1, позволяет посредством введённого кода отпирать дверь и запирать её.

Рис. 1. Принципиальная схема самодельного кодового замка на микроконтроллере PIC16F628A.

Код хранится в EEPROM микроконтроллера DD1, а при включении питания устройства программа копирует его в оперативную память. Индикатор HG1 — четырёхразрядный семиэлементный светодиодный с общими катодами знакомест. В процессе набора кода цифры сдвигаются по нему справа налево.

Если код состоит из пяти цифр, то при наборе его последней пятой цифры первая уходит за пределы индикатора. Тем не менее действуют все пять набранных цифр. В исходной программе предварительно записан нулевой код, который действует сразу после первого включения замка.

Чтобы открыть замок, находящийся в этом состоянии, достаточно убедиться, что его индикатор очищен, и нажать на кнопку SB8. Будут включены светодиод HL1 (им можно, например, освещать внутренность сейфа) и зелёный светодиод HL3 (путь свободен).

Затем кратковременно, примерно на две секунды, будет включён исполнительный двигатель М1, который и откроет запор. Для дальнейшей эксплуатации замка нулевой код нужно заменить новым секретным кодом, который должен находиться в интервале от 1 до 65535. Ввести его можно только при открытом замке при условии, что на индикаторе нули.

Для замены кода кратковременно нажмите на кнопку SB12. Индикатор очистится, включится светодиод HL1. Введите новый код, нажмите на кнопку SB 12 и удерживайте её нажатой около двух секунд.

Светодиод HL1 будет выключен, а индикатор HG1 очищен. Теперь новый код записан в EEPROM микроконтроллера. В дальнейшем код можно заменять неоднократно.

Если новый код был введён без предварительной очистки индикатора, но при нулях на нём, то светодиод HL1, сигнализируя о записи кода, погаснет на две секунды и включится снова.

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

Чтобы отпереть замок после смены кода, нужно будет очистить индикатор кратковременным нажатием на кнопку SB 12. Затем ввести именно этот код и нажать на кнопку SB8. Если код был набран правильно, но механика замка по какой-либо причине заела, можно нажимать на кнопку SB8 неоднократно.

С каждым нажатием на неё двигатель М1 будет включаться на отпирание. Закрывают открытый замок кратковременным нажатием на кнопку SB 12. Светодиод HL1 погаснет, а приблизительно через две секунды индикатор HG1 очистится. Далее нажмите на кнопку SB8.

На две секунды будет включён красный светодиод HL2, а на двигатель М1 подано напряжение противоположной подаваемому при открывании полярности. Запор закроется. Эту операцию можно выполнить только один раз после каждого отпирания.

Повторное запирание невозможно. Если операции открывания и закрывания замка исполняются неправильно (одна вместо другой), то следует изменить полярность подключения двигателя М1. При первом включении замка на индикаторе HG1 могут появиться случайные цифры.

Чтобы удалить их или исправить ошибку в наборе кода, необходимо кратковременно нажать на кнопку SB12. На случай, если хранящийся в EEPROM микроконтроллера сменный код утерян, в его программной памяти имеется постоянный код, которым замок тоже можно отпереть

. В прилагаемой к статье программе он равен 45457. Изменить его можно только путём перепрограммирования микроконтроллера. Для этого нужно указать новое значение кода в строке:

«POSTKOD EQU .45457»

исходного текста программы (файла ZAMOK.ASM). Эта строка находится в самом его начале. Предшествующая коду точка означает в данном случае, что это десятичное число.

Значение постоянного кода должно находиться в пределах от 1 до 65535, в противном случае он действовать не будет. После изменения постоянного кода программу необходимо транслировать заново и загрузить в микроконтроллер полученный НЕХ-файл.

Заливка кнопок

   Настало время закрепить кнопки на свое место в заранее просверленных отверстиях. Вставляем кембрик в кнопки и ставим их на свое место, как это видно на фото. После, нужно скрепить их каплями клея или термоклея. Но делать это надо аккуратно, так чтобы не осталось щелей, в том случае если заливать кнопки эпоксидной смолой! Потому что у меня, первая панелька, залитая эпоксидкой, осталась в качестве музейного экспоната. Эпоксидка, очень текучая, и она просочилась в кнопки и склеила их. Вот так. Пришлось делать все по новому и на этот раз, заливал панель термоклеем. Кнопки можно предварительно клеить, так чтобы закрепить их на свои места, двухкомпонентным, мгновенным клеем применяемым мебельщиками для склеивания МДФ, продается там же где и алюминиевые профиля – в магазинах мебельной фурнитуры. 

Микроконтроллеры ATmega328P и ATtiny45 семейства AVR

Программируемый чип ATmega328P представлен 28-контактным микроконтроллером, входящим в семейство AVR. Микроконтроллер хорошо знаком обладателям конструктора «Ардуино», где используется в качестве основного компонента электронного набора.

Однако микроконтроллер ATmega328P способен делать куда больше, чем выжимает из этого чипа популярный электронный конструктор «Arduino». Доказательств тому масса, стоит лишь посмотреть фирменный даташит (datasheet) микроконтроллера ATmega328P.

Микроконтроллеры семейства AVR нашли широчайшее применение в практике конструирования электронных устройств различной сложности. Серия ATMega и ATiny часто выбираются для аппаратного программирования

В тесной связке с «братом по крови» выступает другая микросхема — ATtiny45. Но здесь налицо явная отличительная черта: микроконтроллер ATtiny45 имеет 8-контктный форм-фактор.

Микросхема ATtiny45 обладает многими функциями, присущими AT328P. Однако функциональность ATtiny45 несколько ограничена по причине малого числа контактов ввода-вывода.

Традиционно программирование ATmega328P и ATtiny45 осуществляется через последовательный периферийный интерфейс (SPI). Контактная шина на 3 проводника, плюс «земля». По шине данных следуют сигналы:

  1. Вход приёма данных (MOSI)
  2. Выход передачи данных (MISO)
  3. Вход синхронизации приёма(SCK)

Сигнал SCK (SCLK) генерирует ведущее устройство (программатор). Этим сигналом обеспечивается синхронная приём/передача между ведущим и ведомым устройствами. По сути, интерфейс SPI следует рассматривать «синхронной» коммуникационной шиной.

Выбор физических программаторов под AVR микроконтроллеры

Существует масса программаторов, которыми доступно программировать ATmega328P и ATtiny45. Например, профессиональная разработка «Atmel-ICE» от родной чипам компании «Atmel».

AVR Pocket Programmer: 1 — входной интерфейс USB; 2 — ISP коллектор; 3 — выходной интерфейс ISP; 4 — буферные элементы 74АС125; 5 — переключатель режима питания; 6 — основной чип ATtiny 2313

Для любителей-электронщиков этот вариант финансово обременительный. Поэтому логичным видится более простой выбор – USB программатор «AVR Pocket Programmer».

Раз в пять дешевле профессиональной разработки «Atmel», этот девайс доступно купить, к примеру, здесь. В продаже есть другие, более дешёвые программаторы (от 200 руб.), но не проверенные на практике.

На крайний случай несложно собрать программатор «AVR Pocket Programmer» своими руками. Принципиальная схема устройства построена на чипе ATtiny2313. Внешние элементы – лишь несколько резисторов, стабилитронов, светодиодов.

Принципиальная схема программатора AVR Pocket Programmer — достаточно простая, вполне доступная для сборки устройства программирования своими руками

Сигнальные линии (MICO, MOSI, SCK) желательно (но не обязательно) буферизировать. Поэтому следует дополнить схему буфером, к примеру, использовать микросхему 74AC125.

Такой буфер, кстати, применяется на фирменной сборке. Не исключается и транзисторный вариант буфера.

Для работы схемы программатора потребуется драйвер под USB. Возможно, потребуется также программный продукт Zadig, универсальный инсталлятор под Windows для установки общих драйверов USB (версия под Windows 7 и выше):

  • WinUSB
  • Libusb-Win32
  • Libusb0
  • LibusbK

Прошивка и утилиты для «AVR Pocket Programmer» находятся здесь. Драйвер программатора предпочтительно ставить в систему Windows до подключения физической схемы к ПК.

Электронный кодовый замок — принципиальная схема

К561ИЕ8, К561ИЕ9, К176ИЕ8, CD4022CD4017CD4017К561ИЕ8, К176ИЕ8EL4017AEскачайте тут

   Итак, работа схемы электронного кодового замка очень проста. При вводе правильного четырёхзначного последовательного кода на выходе микросхемы (Q4) появляется логическая единица, которая приводит к открыванию замка. При наборе неверной цифры (кнопки S5-S10), не являющаяся частью кода, схема переходит в исходное состояние, то есть обнуляется через 15 вывод микросхемы (RESET). При нажатии S1 единичное состояние на третьем выводе Q0 микросхемы поступает на вход полевого транзистора VT1 открываясь он поддает напряжение на вывод 14 (CLOCK) который переключает единичное состояние на второй вывод Q1, потом при последовательном нажатии кнопок S2, S3, S4, сигнал переходит на Q2, Q3, и в конечном итоге при вводе правильного кода с выхода Q4 сигнал открывает транзистор VT2 на короткое время, определяемое емкостью конденсатора С1, включая реле К1 который своими контактами подает напряжение на исполнительное устройство (электрозамок, защелка, или автомобильный «активатор” (актуатор)).

Схема устройства

Схема устройства представлена на следующем рисунке и содержит в своем составе Arduino, модуль клавиатуры, буззер (звонок) и ЖК дисплей. Плата Arduino управляет всеми процессами работы схемы: считывание пароля с модуля клавиатуры, сравнение паролей, включение/выключение буззера и передача статуса на ЖК дсиплей. Клавиатура используется для ввода пароля. Буззер используется для индикации, а ЖК дисплей используется для отображения статуса операции и различных сообщений. Буззер управляется с помощью NPN транзистора.

Столбцы модуля клавиатуры непосредственно подключены к контактам 4, 5, 6, 7, а строки – к контактам 3, 2, 1, 0 платы arduino uno. ЖК дисплей подключен к плате Arduino в 4-битном режиме. Управляющие контакты RS, RW и En подключены к контактам Arduino 13, GND и 12. Контакты данных ЖК дисплея D4-D7 подключены к контактам 11, 10, 9 и 8 arduino. Буззер подключен к контакту 14(A1) arduino с помощью NPN транзистора BC547.

Программирование микроконтроллера ATmega8

Практика электронщиков (начинающих и уже достаточно опытных) отмечает частое пользование ещё одним чипом из серии AVR, именуемым даташит «ATmega8». Несмотря на приличный «возраст» с момента своего рождения, эта микросхема остаётся не менее популярной, чем упомянутые выше микроконтроллеры.

Благодаря этой микросхеме удаётся собирать электронные устройства нередко уникальные по своим техническим возможностям

Форм-фактор: 28-контактный (PDIP) либо 32-контактный (TQFP), причём 23 контакта из 28 – это линии ввода/вывода общего назначения. Для питания микросхемы потребуется стабилизированный источник 5В, а для удобства использования рекомендуется применить колодку (сокет) на 28 контактов.

Чтобы понять азы процедуры программирования, достаточно запрограммировать, например, функцию включения /выключения светодиода. Для решения задачи потребуется присоединить электронный элемент — светодиод, к любому контакту ввода/вывода микроконтроллера ATmega8.

Например, выбрать 28 контакт, обозначенный на схеме «PC5», входящий в 7-контактный набор PC0 — PC6 (порт C). Следует отметить: согласно схеме ATmega8, имеются также другие наборы контактов, имеющих отношение к порту B (PB0-PB7) и порту D (PD0-PD7).

Ресурсы программирования  ATmega8

Нужно подготовить программный код для прошивки микросхемы. Потребуется компилятор языка программирования «C». Соответственно, необходим также программатор под загрузку скомпилированного кода в память микроконтроллера.

В качестве компилятора обычно используется фирменное программное средство «Atmel Studio 7.0» (установщик онлайн). Для прошивки микросхемы ATmega8 опять же удачно выступает утилита AVRDUDE.

Заставка фирменного компилятора программного кода от компании «Atmel». Мощное средство, необходимое для создания уникальных дампов

Далее пошаговый процесс программирования можно описать следующим образом:

  1. Запускается компилятор «Atmel Studio 7».
  2. В меню выбрать «Новый проект» (New Project) и далее «AVR GCC».
  3. Затем указать месторасположения сохранения проектного файла.
  4. Перейти «Далее» (Next) и выбрать из списка симуляторов ATmega
  5. Завершить кнопкой «Finish» после чего можно писать программный код.

Первая нитка программного кода:

#include <avr / io.h>

Функция Include включает системную библиотеку в проект, обеспечивая доступ к основным функциям ввода / вывода и макросам.

int main()

Вторая строчка указывает точку входа в программу пользователя. Отсюда программа пользователя стартует.

Дальше необходимо обозначить вывод порта C. В данном случае — «PC5». Для этого используется специальный регистр DDRC:

DDRC = 0x20;

Значение регистра 0x20 задаёт целевую «1» для контакта «PC5», согласно двоичному представлению. Тем самым пользователь открывает действие на активацию контакта «PC5».

Следующий шаг, решение непосредственно поставленной задачи — включение и выключение светодиода исполнением кода. Если нужен бесконечный цикл, решение может быть таким:

Простейший программный код для микроконтроллера ATmega8, которые заставляет мерцать подключенный к микросхеме светодиод

Завершающий этап компиляции кода выбор опции меню «Сборка» (Build). В результате «Atmel Studio 7» создаст файл с расширением .hex, с именем, указанным пользователем. Например: «test.hex». Останется только записать программный код в память микроконтроллера с помощью прошивки.

Схема кодовой кнопки на Attiny

Пару слов про резистор на выходе микроконтроллера. Используемое реле может потреблять менее 20 мА (чем выше напряжение, тем ниже будет ток удержания катушки), что при усилении тока около 200 дает около 0,1 мА базового тока. Когда выходной сигнал от платы составляет около 5 В, а падение на переходе база-эмиттер составляет около 0,7 В, базовый резистор может иметь значение 4,3 В / 0,1 мА или 43 кОм. Любое меньшее значение гарантирует полное насыщение в этом диапазоне. Так что 4,7 кОм уже даст полное насыщение.

Написана программа в BASCOM и после компиляции она занимает ровно 1024 байта. Bin файл для программирования во вложении. Тактовая частота 1,2 МГц. Работа кнопки шифрования несколько напоминает код Морзе, когда код короткий и длинный нажимается в нужное время. Всего у нас 256 комбинаций. Это может быть немного, но вряд ли кто захочет тратить столько времени на перебор ввода кода (надо ещё знать что вообще требуется сделать). После включения питания в течение 1,5 секунд схема выполняет внутреннюю очистку и готова к работе.

Этапы управления кодовым замком

Рассмотрим это на конкретном примере. Допустим, нам нужно задать следующий секретный код: первая цифра 8, вторая цифра 12, третья цифра 9.  Для этого подаем  питание на устройство, затем нажимаем и удерживаем обе кнопки (SB1 и SB2). После этого отпускаем кнопку SB1, и как только начал мигать светодиод HL1 отпускаем и кнопку SB2. После этих манипуляций светодиод HL1 будет гореть постоянно, а светодиоды HL2 и HL3 не будут гореть. Это состояние светодиодов говорит о том, что устройство перешло в режим программирования.

Теперь чтобы записать первое число нам нужно нажать и удерживать кнопку SB2, при этом все три светодиода начнут мигать. Нужно отсчитать необходимое количество вспышек (в нашем случае это 8) и отпустить кнопку. После этого, в подтверждении правильности введенного числа, светодиоды промигают такое же количество раз (8 раз). Все, первое число записано. Далее загорается светодиод HL2 – напоминая нам, что необходимо записать второе число.

Поступаем точно так же как и с записью первого числа: нажимаем и удерживаем кнопку SB2 и отсчитываем необходимое число вспышек светодиодов (в нашем примере это 12), отпускаем кнопку и проверяем правильность ввода по повторным вспышкам. Затем загорается светодиод HL3 для третьего числа, и повторяем туже процедуру и для третьего числа (число 9).

После того так мы записали в память микроконтроллера все три числа и для выхода из режима программирования нужно нажать кнопку SB1.

 Набора секретного кода

Рассмотрим так же это на примере. До этого мы записали секретный код 8-12-9. Для ввода вначале нажимаем кнопку SB1 и отпускаем ее сразу, после того как загорится светодиод HL1, тем самым переводим наш замок в режим ввода кода. Свечение светодиода HL1 свидетельствует, что нужно ввести первую цифру. Процедура ввод цифр  аналогична тому, как вводились цифры при программировании. То есть, нажимая на кнопку SB1, отсчитываем необходимое количество, после чего отпускаем кнопку и наблюдаем подтверждение наборной цифры путем мигания светодиодов. Затем переходим ко второй и третьей цифре.

Блок питания 0…30 В / 3A
Набор для сборки регулируемого блока питания…

Подробнее

В том случае если все три цифры секретного кода введены верно, сработает реле и на 15 секунд включится светодиод HL4, светодиоды HL1,HL2,HL3 будут светиться в режиме бегущих огней.

Для ввода секретного кода предоставляется три попытки. Если в третий раз код введен неверно, возможность ввода блокируется на 2,5 минуты. По прошествии этого времени замок снова будет готов к вводу кода.

 При программировании микроконтроллера следует выставить следующие фьюзы:

  • CKDIV8 = 0
  • BODLEVEL0 = 0
  • SPMEN = 0

Скачать прошивку (1,3 MiB, скачано: 1 993)

Режимы работы кодового замка на PIC16F628

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

Состояние ввода кода

Для ввода секретного кода необходимо поочередно ввести четыре цифры, каждая цифра соответствует количеству нажатий на кнопку SA1. После первой введенной цифры, светодиод мигнет один раз. Затем необходимо ввести следующую цифру. После набора четвертой цифры при верно набранном коде светодиод быстро мигнет три раза и активируется реле. При неверно набранном коде светодиод также мигнет три раза, но медленно. Затем можно повторить попытку ввода. Изначально в памяти микроконтроллера записан код 1234.

Состояние программирования кодового замка

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

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

Меню программирования кодового замка состоит из трех пунктов:

  1. Запись нового секретного кода в память микроконтроллера PIC16F628. При переводе SA2 в режим программирования и включении питания, светодиод будет светить одинарными вспышками. Это свидетельствует, что вы находитесь в первом пункте меню.  Для записи нового кода необходимо поочередно ввести каждую цифру, так же как и при обычном вводе. После ввода последней цифры устройство подтвердит успешное завершения серией быстрых вспышек светодиода. Теперь питание можно выключить и перевести SА2 в обычный режим, либо можно перейти ко второму пункту меню программирования кодового замка. Для этого необходимо нажать кнопку SA1 и удерживать ее не менее 3 секунд. После отпускания кнопки, светодиод будет мигать двойными вспышками.
  2. Изменения продолжительности включения реле. Каждое нажатие прибавляет одну секунду. Допусти если нужно чтобы реле было активно в течении 5 секунд, то необходимо нажать кнопку SA1 пять раз с частотой нажатий  в одну секунду. После этого устройство подтвердит запись значения серией частых вспышек. Для перехода в 3 пункт меню также нажимаем кнопку на 3 и более секунды и отпускаем. Теперь светодиод будет мигать тройными вспышками.
  3. Режим работы реле кодового замка. При одном нажатии реле будет активироваться на период, установленный во втором пункте меню. При двойном нажатии – реле будет включаться при вводе секретного кода, и выключаться только при повторном вводе секретного кода.

Для программирования микроконтроллера PIC16F628 модно воспользоваться несложным программатором, который описан здесь.

Скачать прошивку (1,2 MiB, скачано: 2 493)

Цифровой мультиметр AN8009
Большой ЖК-дисплей с подсветкой, 9999 отсчетов, измерение TrueRMS…

Подробнее

Microchip ATmega328P

Вторым в нашем списке идет 8-разрядный AVR микроконтроллер ATmega328P.

Рисунок 3 – Микроконтроллер ATmega328P от Microchip

Выводы GPIO с возможностью генерирования прерываний

ATmega328P имеет 23 вывода GPIO, разделенных на три порта: PORTB (восемь выводов), PORTC (семь выводов) и PORTD (восемь выводов). Все выводы имеют возможность генерирования прерываний по изменению состояния на выводе. Однако отдельных флагов прерываний выводов нет, вместо этого флаг прерывания есть у каждого порта. Но два вывода на PORTD можно настроить как внешние прерывания, у них есть отдельные флаги прерывания.

Настройка прерываний

23 прерывания по изменению состояния на выводе предварительно настроены для обнаружения логического изменения значения на выводах (с 0 на 1 или с 1 на 0). Два внешних прерывания могут быть сконфигурированы для обнаружения только нарастающего фронта (изменение с 0 на 1), только спадающего фронта (изменение с 1 на 0) или постоянного значения 0. Прерывание по изменению состояния на выводе для каждого вывода может быть отдельно включено или выключено. Кроме того, может быть включено или выключено прерывание для каждого порта.

Флаг прерывания для порта или любого из выводов внешних прерываний устанавливается всегда, когда происходит событие, для которого он настроен, независимо от того, включено ли прерывание или выключено. Кроме того, флаг будет установлен независимо от того, настроен ли вывод как выход или как вход.

Вектор прерывания, обработчик и приоритеты

Каждый порт имеет один вектор прерывания (у PORTB – это PCINT0, у PORTC – это PCINT1, у PORTD – это PCINT2). Кроме того, каждый вывод внешнего прерывания имеет свой собственный отдельный вектор (вывод 2 в PORTD – INT0, а вывод 3 в PORTD – INT1). Каждый вектор прерывания может быть включен или отключен индивидуально, но это делается в периферийном устройстве GPIO, а не в контроллере прерываний (то есть контроллер прерываний не имеет возможности отдельного включения векторов прерываний, и все разрешения векторов прерываний выполняются в периферийных устройствах).

Поскольку векторы прерываний есть только у портов (для прерываний по изменению состояния на выводе), в обработчике прерывания необходимо выяснить, какой вывод и какое событие вызвало прерывание. Для этого потребуется прочитать маску прерываний для порта (чтобы узнать, прерывания каких выводов включены) и текущее значение вывода, чтобы выяснить, какое логическое изменение произошло. Однако для двух внешних прерываний вы уже будете знать, какой вывод вызвал прерывание, поскольку каждый вывод имеет отдельный вектор. Аппаратное обеспечение автоматически очищает флаги прерываний для внешних прерываний, хотя, ради безопасности, вы также можете очистить их в своем коде.

В ATmega328P приоритеты прерываний фиксированы и не могут быть изменены. После прерывания сброса прерывания выводов имеют самый высокий приоритет среди всех прерываний в следующем порядке: INT0, INT1, PCINT0, PCINT1, PCINT2.

Обработчики прерываний в ATmega328P могут быть прерваны прерываниями с более высоким приоритетом, но это не происходит автоматически. Когда запускается обработчик прерывания, CPU отключает все прерывания. Вы должны вручную включить прерывания в коде своего обработчика, чтобы разрешить вытеснение. Кроме того, существует регистр, называемый регистром состояния AVR, который является частью CPU, и значение которого CPU не сохраняет автоматически перед входом в прерывание и не восстанавливает после выхода из прерывания. Вы должны в своем обработчике прерывания сохранить и восстановить его значение. Причина, по которой вы должны это сделать, заключается в том, что CPU должен возобновить работу в том состоянии, в котором он находился до возникновения прерывания. Возможно, что действия, которые вы выполняете в своем обработчике, могут изменить этот регистр, поэтому, если вы не сохраните значение, которое он имел до начала ваших действий, и не восстановите его, CPU после вашего прерывания вернется в другое состояние, что может трудноуловимые ошибки в вашей системе.

Рейтинг
( Пока оценок нет )
Понравилась статья? Поделиться с друзьями:
Электрик в доме
Добавить комментарий

;-) :| :x :twisted: :smile: :shock: :sad: :roll: :razz: :oops: :o :mrgreen: :lol: :idea: :grin: :evil: :cry: :cool: :arrow: :???: :?: :!: