КАТЕГОРИИ: Архитектура-(3434)Астрономия-(809)Биология-(7483)Биотехнологии-(1457)Военное дело-(14632)Высокие технологии-(1363)География-(913)Геология-(1438)Государство-(451)Демография-(1065)Дом-(47672)Журналистика и СМИ-(912)Изобретательство-(14524)Иностранные языки-(4268)Информатика-(17799)Искусство-(1338)История-(13644)Компьютеры-(11121)Косметика-(55)Кулинария-(373)Культура-(8427)Лингвистика-(374)Литература-(1642)Маркетинг-(23702)Математика-(16968)Машиностроение-(1700)Медицина-(12668)Менеджмент-(24684)Механика-(15423)Науковедение-(506)Образование-(11852)Охрана труда-(3308)Педагогика-(5571)Полиграфия-(1312)Политика-(7869)Право-(5454)Приборостроение-(1369)Программирование-(2801)Производство-(97182)Промышленность-(8706)Психология-(18388)Религия-(3217)Связь-(10668)Сельское хозяйство-(299)Социология-(6455)Спорт-(42831)Строительство-(4793)Торговля-(5050)Транспорт-(2929)Туризм-(1568)Физика-(3942)Философия-(17015)Финансы-(26596)Химия-(22929)Экология-(12095)Экономика-(9961)Электроника-(8441)Электротехника-(4623)Энергетика-(12629)Юриспруденция-(1492)Ядерная техника-(1748) |
Лекция 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
Дата добавления: 2014-12-07; Просмотров: 899; Нарушение авторских прав?; Мы поможем в написании вашей работы! Нам важно ваше мнение! Был ли полезен опубликованный материал? Да | Нет |