Работа микроЭВМ в режиме прерываний, страница 2

Итак, при организации прерываний с помощью векторов готовность внешних устройств определяется аппаратно, а не программно. Аппаратный опрос осуществляется гораздо быстрее программного. Если обслуживание запросили несколько устройств одновременно, то обслуживание менее приоритетных будет отложено на время обслуживания более приоритетных, как и в системе прерываний с программным опросом.

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

Пример использования режима прерываний по векторам при замере частоты в энергосистеме (например, в устройствах АЧР, ГРАМ – групповое регулирование активной мощности). Возможность работы микроЭВМ в режиме прерываний

Замер частоты это практически то же самое, что и замер продолжительности периода. В нормальном рабочем режиме период длится 0.02 с (для 50 Гц; естественно, что длительность периода в нормальном рабочем режиме может несколько отличаться, то есть не точно равна 0.02 с). Для замера интервалов времени такой длительности вполне можно использовать тактовый синхронизирующий сигнал микропроцессорных устройств, частота которого может составлять уже десятки МГц. Например, если частота этого сигнала составляет 8 МГц, то в один период промышленной частоты (0.02 с) уложится 160 тысяч периодов тактового сигнала      (8 000 000 Гц / 50 Гц). Частота тактового сигнала оказывается весьма стабильной. То есть, замер длительности интервала времени (в нашем случае периода) просто сводится к подсчёту количества тактовых импульсов.

Как подсчитать количество тактовых импульсов? Для подобных целей любой современный микроконтроллер содержит в своём составе таймер, который по своей сути является счётчиком тактовых импульсов. Такой таймер или счётчик имеет свой регистр, который содержит количество подсчитанных импульсов.

Итак, с чего начинается замер продолжительности периода? Естественно, надо начинать отсчёт момента перехода через ноль синусоидального сигнала напряжения (или тока). Для улавливания этого момента в аппаратной части должен быть предусмотрен компаратор, сравнивающий синусоидальный сигнал (период которого замеряется) с нулём. Переключение выходного сигнала компаратора с одного уровня на другой укажет моменты перехода сигнала через ноль. Выходной сигнал компаратора подключается к входу микроконтроллера, который улавливает такой перепад и по фиксации перепада сигнала вырабатывает прерывание. По сути, перепад сигнала компаратора является событием, то есть поводом на прерывание. То есть вот где в этой задаче необходимо применять прерывание: то есть, заранее неизвестно в какой момент времени будет иметь место переход сигнала через ноль; режим программного опроса здесь применить в принципе можно, но тогда невозможно будет применить режим многозадачности микроконтроллера.

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

Разрядность микропроцессора ограничена. Пусть, например, микропроцессор 16-разрядный. Тогда его регистры обычно также оказываются максимум 16-разрядными. Это значит, что максимальное значение количества тактов синхросигнала (которое насчитает таймер) ограничивается также 16 разрядами, то есть количеством 65535. То есть, счётчик (таймер) «умеет считать» максимум до 65535, то есть он считает от 0 до 65535. Когда таймер насчитает 65535 тактов, возникает его переполнение, после чего содержимое регистра хранения количества тактов сразу же обнуляется.

При частоте 8 МГц 65535 тактов занимают по времени 0.008191875 секунды. Поэтому за один период промышленной частоты – 0.02 секунды – уложится 2.4414435 цикла счёта от 0 до 65535. Поэтому в микроконтроллерах всегда предусматриваются прерывания при переполнении таймера. Значит, необходимо эти прерывания также задействовать при замере продолжительности периода. При переполнении таймера генерируется прерывание, которое указывает, что содержимое счётчика достигло 65535 и их необходимо приплюсовать к общему количеству тактов. Принцип подсчёта общего количества тактов поясняется рис. 1.


Итак, изначально счётчик (таймер) инициализируется и запускается, то есть он начинает считать. Первое прерывание генерируется в момент первого перехода синусоиды через ноль от отрицательной полуволны к положительной. К этому моменту времени необходимо прочитать содержимое регистра хранение таймера, т.е. величину п2 для прошедшего периода и п1 – для следующего (в программе это две отдельные переменные). Следующее прерывание будет тогда, когда счётчик досчитает до 65535. Этот момент также фиксируется и начинается подсчёт тактов: 65535– п1 . После этого величина п1 обнуляется. Далее следует прерывание от следующего переполнения, а значит запускается следующее выполнение команды 65535– п1. Следующее прерывание возникает опять при нужном переходе через ноль синусоиды, вследствие чего запускается подсчёт тактов по следующему принципу: считывается значение п2 и п1 и рассчитывается разность п2 п1. Именно такая команда нужна, если будет иметь место такой случай, что длительность одного периода окажется меньше одного цикла счёта таймера. Продолжительность периода можно считать в количестве тактов синхросигнала, поскольку количество тактов непосредственно определяет интервал времени.

При использовании таймера для каких-то других целей можно задать и другой более удобный режим счёта, например, не от 0 и не до 65535, а также в обратном порядке.

Подсчёт количества тактов только по положительному или только по отрицательному фронту сам по себе позволяет отстроиться от смещения или апериодической слагающей. Но для увеличения быстродействия можно замерять через каждые полпериода; то есть и по положительному фронту и по отрицательному, причём на каждый вид фронт требуется свой канал – также для отстройки от апериодической слагающей.