Open Library - открытая библиотека учебной информации

Открытая библиотека для школьников и студентов. Лекции, конспекты и учебные материалы по всем научным направлениям.

Категории

Высокие технологии Лекция 11. Прерывания и сторожевой таймер
просмотров - 251

Цель лекции: познакомить студентов с выполнением прерываний. Научить применять встроенный таймер TRM1 и регистры специального назначения, связанные с его настройкой.

11.1 Прерывания

Микроконтроллеры могут реагировать на запросы на прерывания от самых раз­ных источников, находящихся вне микроконтроллера, либо от различных портов и периферийных устройств, имеющихся в составе конкретного представителя се­мейства. К примеру, микроконтроллеры P1C16F874/7 поддерживают до 13 раз­личных прерываний от этих периферийных устройств, а также одно внешнее пре­рывание, подаваемое через вывод INT. Вход внешне­го прерывания использует ту же ножку микроконтроллера, к которой подключена нулевая линия PORTB, ᴛ.ᴇ. вывод RB0. Программист может запретить или разрешить прерывания от этих источников, а также полностью запретить работу всœей системы прерываний. Поскольку процесс реакции на пре­рывание практически не зависит от его источника, то будем вести речь именно о внешнем прерывании.

Отклик процессора на за­прос прерывания должен выглядеть так:

1. При выполнении каждой команды процессор проверяет наличие запроса прерывания от разрешенного источника. В случае если такой запрос отсутствует, микроконтроллер просто переходит к выполнению следующей команды. При наличии запроса следующие три машинных цикла затрачиваются на передачу управления процедуре обработки прерывания. В ней происходит автоматическое сохранение, по меньшей мере, состояния счетчика команд. Это крайне важно для возврата из обработчика прерывания. Некото­рые процессоры могут также автоматически сохранять содержимое регистра STATUS и дру­гих регистров специального назначения. Поскольку в РIС-микроконтроллерах среднего уровня реализован 8-уровневый аппаратный стек, из обработчика пре­рывания можно вызывать до семи вложенных друг в друга подпрограмм.

2. Запрещается вся система прерываний, что гарантирует блокирование всœех прерываний на время обработки текущего прерывания. Это осуществляется сбросом 7-го бита регистра управления прерываниями INTCON, кото­рый помечен как флаг общего разрешения прерываний (GIE). При сбросœе мик­роконтроллера бит GIE всœегда сбрасывается, так что по умолчанию пре­рывания запрещены.

Первая команда обработчика прерывания всœегда размещается по адресу h'004' памяти программ, называ­емого вектором прерывания. Разумеется, код обработчика прерыва­ния находится в каком-либо другом месте памяти программ, в связи с этим первой ко­мандой будет команда Goto.

3. Выполнение требуемых действий.

4. Восстановление состояния процессора и возврат к тому месту основной программы, в котором произошло прерывание.

5. Как и всœе подпрограммы, процедура обработки прерывания должна завершаться командой возврата. При этом при прерывании крайне важно не только извлечь из стека сохраненное значение счетчика команд PC, но и установить бит G1E регистра INTCON для разрешения последующих прерываний. Для этого используется команда возврата из прерывания Retfie. Τᴀᴋᴎᴍ ᴏϬᴩᴀᴈᴏᴍ, после возврата в фоновую программу можно будет обработать всœе отложенные или будущие прерывания.

11.2 Подсчет посœетителœей с помощью прерываний.

Рассмотрим задачу подсчета числа посœетителœей в небольшом магазинœе. Одним из возможных решений является использование пары маломощный лазер — фотоэлемент, расположенных по бокам от входной двери. При пересечении луча покупателœем на управляющий микроконтроллер поступит сигнал в виде прямоугольного импульса, как показано на рисунке 11.1. В данный момент микроконтроллер может быть занят выполнением своей основной задачи, к примеру, организацией обмена данными между торговым терминалом и основным компью­тером склада.

Рисунок 11.1. Контроль числа посœетителœей магазина

Предположим, что при каждом проходе покупателя в магазин инкрементируется регистр, который мы назовем EVENT. Разумеется, покупатели будут еще и выходить из магазина, однако, если проход достаточно узкий, мы можем просто разделить общее количество проходов на два, чтобы получить реальное число по­сетителœей. Τᴀᴋᴎᴍ ᴏϬᴩᴀᴈᴏᴍ, максимальное число посœетителœей, регистрируемое системой, составит 128.

В подпрограмме обработчика прерываний применяется команда SWAPF для копирования данных в регистры Status и W, поскольку она не меняет состояние регистра STATUS.

Фрагменты программы подсчета числа посœетителœей.

include <p16F877.inc>

_STATUS EQU h'51'; регистр, для сохранения состояния Status.

EVENT EQU h'52'; счетчик событий при прерываниях.

_WORK EQU h'53'; регистр, для сохранения состояния аккумулятора.

org h’000’

GOTO MAIN; вектор сброса записываем по адресу h’000’.

org h’004’

GOTO PERS_COUNT; вектор записываем по адресу прерывания h’004.

MAIN; метка фоновой (основной) программы.

BSF INTCON, INTE; разрешаем внешние прерывания.

BSF INTCON, GIE; разрешаем работу прерываний.

CLRF EVENT; очищаем счетчик событий (посœетителœей).

. . . .

GOTO$; конец главной программы.

PERS_COUNT; подпрограмма - обработчик прерываний.

BCF INTCON, INTE; запрещаем внешние прерывания.

MOVWF _WORK; сохраняем значение W в регистре _WORK.

SWAPF STATUS, W

MOVWF _STATUS; сохраняем значение регистра Status.

BCF INTCON, INTF; сбрасываем флаг внешнего прерывания.

INCF EVENT, F; регистрация очередного посœетителя.

SWAPF _STATUS, W; возвращаем значение Status.

MOVWF STATUS

SWAPF _WORK, F

SWAPF _WORK, W; возвращаем значение W.

BSF INTCON, INTE; разрешаем внешние прерывания.

RETFIE; возврат в фоновую программу из обработчика.

END

Процедуры обработки прерываний аналогичны обыч­ным подпрограммам, однако крайне важно помнить следующее:

- обработчик прерывания должен завершаться командой Retfie.

- рабочий регистр (W), а также всœе РСН, изменяемые в обработчике прерывания, должны быть сохранены при входе в обработчик. И при выходе из него восстановлены, если они используются в фоновой программе.

- параметры не могут передаваться обработчику прерываний или из обработчика прерывания через рабочий регистр (W). Вместо этого, при крайне важности, следует использовать глобальные переменные (данные, расположенные в памяти).

- обработчики прерывания должны быть как можно короче и должны выполнять минимальный набор операций.

11.4 Сторожевой таймер

Многие системы на базе микроконтроллеров работают в сложной электро­магнитной обстановке, когда помехи наводятся как по сигнальным линиям, так и по линиям питания. Типичным примером такого устройства является система уп­равления приборной панелью автомобиля, на которую воздействуют помехи, со­здаваемые высоковольтными разрядами в блоке зажигания, и пульсации напря­жения питания, вызываемые работой генератора. Даже если поместить блок в эк­ран, а на всœех линиях поставить фильтры, никто не сможет гарантировать, что в какой-нибудь момент времени программа не собьется с корректного положения в памяти программ и микроконтроллер не «сойдет с ума». Это может привести к серьезным последствиям в работе системы управления. Иногда эти проблемы можно решить ручным сбросом системы. При этом во многих случаях это невозможно, к примеру, в случае космического зонда.

Один из способов решения данной проблемы заключается в использовании связки генератор - двоичный счетчик, которая процессор будет сбрасывать при переполнении счетчика. В случае если программа будет периодически обнулять данный счетчик во избежание переполнения, то микроконтроллер никогда не сбросится. В случае если по какой-либо причинœе микроконтроллер выйдет из основного цикла, в котором выполнялся сброс счетчика, то счетчик рано или поздно переполнится и микроконтроллер будет сброшен, а программа начнет выполняться с самого начала. Эта схема принято называть сторожевым таймером (watchdog timer), поскольку увеличивает безопасность системы.

Все микро­контроллеры PIC имеют встроенный модуль сторожевого таймера. Встроенный генератор сторожевого таймера никак не связан с основным тактовым генератором процессора и, если сторожевой таймер включен то, он постоянно генерирует сигнал с номинальным периодом 18 мс. В качестве элемента задающего время этого генератора используется внутренняя LC-цепочка, в связи с этим в зависимости от конкретного экземпляра, температуры и напряжения питания период генератора может изменяться от 7 мс до 33 мс.

Генератор сторожевого таймера подключен к 8-битному постделителю (postscaler). С его помощью период тайм-аута сторожевого таймера можно увели­чить до 0.018 * 128 = 2.3 с (0.9...4.2 с). Конкретное значение периода тайм-аута оп­ределяется состоянием битов PS[2:0] регистра OPTION_REG. Ге­нератор сторожевого таймера и счетчик постделителя сбрасываются при выполнении команды Clrwdt (Clear Watch DOG Timer — сброс сторожевого таймера). Соответствен­но, для предотвращения наступления тайм-аута сторожевого таймера крайне важно периодически вызывать эту команду.

Поскольку генератор сторожевого таймера полностью независим от системного тактового сигнала, он продолжает работать даже после перевода микроконтроллера в «спящий» режим. Для этого команда Sleep сбрасывает сторожевой таймер и флаг ТО регистра Status. К тому же она активизирует флаг PD регистра Status, указывающий на то, что процессор находится в «спящем» режиме. Благодаря всœем этим действиям между выполнением команды Sleep и наступле­нием тайм-аута сторожевого таймера проходит время, равное одному периоду сторожевого таймера. В случае если тайм-аут наступит при нахождении микроконтролле­ра в спящем режиме, то микроконтроллер проснется и продолжит выполнение программы с команды, следующей за командойSleep. Обычно этой командой является команда сброса сторожевого таймера Clrwdt