Таймеры и процессоры событий.
Большинство задач управления, которые реализуются с помощью МК, требуют исполнения их в реальном времени (т.е. с привязкой к реальным отрезкам времени, таким как секунда, минута и т.д.). Возлагать функции формирования управления в реальном масштабе времени только на центральный процессор неэффективно, так как это занимает ресурсы, необходимые для расчетных процедур. Поэтому в МК используется аппаратная поддержка работы в реальном времени с использованием таймера.
Таймеры представляют собой цифровые счётчики, которые подсчитывают импульсы либо от высокостабильного генератора частоты, либо от внешнего источника сигнала. Во втором случае таймер называют счетчиком внешних событий.
К системной шине микропроцессора таймеры подключаются при помощи параллельных портов. Пример структурной схемы таймера-счётчика представлен на рис 5.1.
Рис 5.1: структурная схема таймера счётчика.
На рис 5.1 блок таймер-счётчик представляет собой регистр, значение которого либо увеличивается, либо уменьшается на единицу по приходу на него тактового импульса. Т.о. различают три режима работы таймера:
А) инкрементный. В этом режиме значение регистра таймера увеличивается на единицу каждый принятый такт.
Б) декрементный. В этом режиме значение регистра таймера уменьшается на единицу каждый принятый такт.
В) инкрементно-декрементный. В этом режиме таймер с начала увеличивает значение своего регистра на единицу, а по достижении максимального (или заданного пользователем) значения уменьшает его на единицу за принятый такт до тех пор, пока не достигнет нуля. После чего цикл начинается заново.
За режим работы таймера-счётчика отвечает Блок управления. Он задаёт направление счёта, значение с которого будет начинаться счёт, момент начала счёта, сброс регистра счёта в блоке Таймер-счётчик и т.д.
Как уже было сказано выше, таймер может тактироваться либо от стабилизированного тактового генератора, либо от генератора внешних событий. За выбор источника тактирования отвечает Селектор тактового сигнала.
В первом случае, точно зная тактовую частоту генератора, можно с помощью таймера отсчитывать заданные интервалы времени. Т.к. импульсы от генератора приходят через строго заданные промежутки времени, то для вычисления заданного времени надо отсчитать определённое число отсчётов от генератора.
К примеру, тактовая частота генератора равна 10МГц. Требуется отсчитать на таймере 1 мс. Для начала вычисляем период тактового сигнала:
(1)
Т.е. счётчик увеличивает на единицу своё состояние каждые 100 нс. А значит, что он отсчитает 1 мс через:
(2)
Т.е. когда таймер отсчитает 10 000 тактов с генератора, пройдёт ровно (с точность стабильности генератора) 1 мс. Значит, для отсчёта 1 мс, необходимо запрограммировать таймер так, что бы как только он досчитает до 10 000, выдал сообщение об этом. Такое сообщение называется запросом на прерывание.
Обычно в таймере существует следующие виды прерываний:
А) Прерывание по переполнению. Это прерывание срабатывает, когда таймер переходит из состояния все 1 во все 0. При этом количество тактов, которое может насчитать таймер равно разрядности этого таймера. Обычно разрядность таймера равна 8-ми, 16-ти или 32-м. В первом случае таймер отсчитает максимум 256 тактов, во втором – 65536, в третьем более 4 миллионов тактов.
Возвращаясь к примеру, отметим, что решить его на 8-ми разрядном счётчике напрямую невозможно, т.к. он может отсчитать только 256 тактов, а требуется 10 000. Из чего следует, что для каждой задачи требуется выбирать тот таймер, который наиболее близок по максимальному функционалу к поставленной задаче. Т.е., если требуется отсчитать 200 тактов, то предпочтение следует отдать 8-ми разрядному таймеру (если таковой присутствует), т.к. 16-ти разрядный может потребоваться для более серьёзной задачи.
Б) Прерывание по сравнению. Зачастую невозможно задать требуемый интервал времени с помощью прерывания по переполнению. Тогда на помощь приходит прерывание по сравнению. В этом случае таймер, досчитав до заданного значения (регистр OCRn на рис 5.1), выдаст запрос на прерывание. После чего счётчик может быть сброшен в ноль или продолжать счёт дальше. В первом случае таймер будет стабильно выдавать запросы на прерывания через заданный промежуток времени до тех пор, пока не будет отключён. Во втором случае он выдаст прерывание по переполнению (если таковое включено), а затем, досчитывав опять до заданного значения, выдаст прерывание. При этом очевидно, что время между двумя прерываниями по сравнению будет равно времени отсчёта таймером полного диапазона.
Если же разрядности таймера не хватает для того, чтобы отсчитать заданный интервал, можно задать интервал в N раз меньший, где N – целое. И программно отсчитать N прерываний, увеличивая каждый раз переменную на единицу.
Для увеличения задаваемого диапазона времён, в таймере обычно присутствует предделитель тактовой частоты, который делит тактовую частоту МК на заданное значение (обычно равное 2N).
Опять возвращаясь в рассмотренному выше примеру, отметим, что задача могла быть решена на 8-ми разрядном таймере, если его частоту тактирования поделить предделителем на 64. При этом на таймере пришлось бы считать до 156. Но, т.к. 10 000/64= 156,25, будет небольшая ошибка в расчёте времени. В случае высоких требований к точности этот метод может не работать.
Во втором случае таймер работает как счётчик импульсов. При использовании таймера в этом режиме, можно построить частотомер для прямоугольных сигналов, отсчитывая количество тактов внешнего генератора событий за одну секунду. При этом секунда отсчитывается на другом таймере.
Дата добавления: 2017-01-16; просмотров: 2494;