Добавил:
Upload Опубликованный материал нарушает ваши авторские права? Сообщите нам.
Вуз: Предмет: Файл:
Консп лек прог ЦТ и МК 2.doc
Скачиваний:
30
Добавлен:
01.05.2015
Размер:
897.54 Кб
Скачать

11 Лекция 11. Прерывания и сторожевой таймер

Цель лекции: познакомить студентов с выполнением прерываний. Научить применять встроенный таймер 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