Изучение таймеров микроконтроллера

Методическое указание к лабораторной работе на учебном стенде LESO1.

1 Цель работы

  1. Изучить особенности работы таймеров микроконтроллера.
  2. Изучить методику конфигурирования таймеров.
  3. Научиться формировать с помощью таймера временные интервалы.
  4. Изучить способы отладки программ на учебном лабораторном стенде LESO1.

2 Предварительная подготовка к работе

  1. По конспекту лекций и рекомендуемой литературе изучить схемы таймеров микроконтроллеров.
  2. По документации изучить особенность таймеров микроконтроллера ADuC842.
  3. Составить алгоритм работы программы, формирующей сигнал прямоугольной формы скважности 2 заданного периода, согласно варианту (таблица 3). Сигнал должен выводиться на светодиод.
  4. Составить программу на языке программирования С.

3 Краткие теоретические сведения

3.1 Общие сведения о таймерах

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

Как правило, в микропроцессорной системе в качестве генератора частоты выступает генератор внутренней синхронизации микроконтроллера. Частота генератора задает минимальный временной промежуток, который может определять таймер. Интервалы времени, задаваемые с помощью таймера, могут иметь строго определенные дискретные значения. Разрядность цифрового счётчика таймера определяет максимальный интервал времени, который может задать таймер.

Обычно в микропроцессорных системах используются 16-тиразрядные таймеры, для подключения такого таймера к 8-миразрядному процессору требуется два параллельных порта. Кроме того, необходим выделенный порт для управления таймером: таймер нужно включать и выключать, определять, не возникало ли переполнение таймера. Факт переполнения запоминается в дополнительном триггере, подключенном к выходу переноса счетчика таймера. Этот триггер называется флагом переполнения таймера. Бит включения и выключения таймера и флаг переполнения таймера подключают к системной шине микропроцессора через отдельный порт ввода-вывода. Структурная схема таймера в самом общем виде показана на рисунке 1. Каждый из портов ввода-вывода отображается во внутреннем адресном пространстве микропроцессора, и имеет свой отдельный адрес.

Структурная схема таймера MCS-51. 20КБ
Рисунок 1 – Структурная схема таймера

Очевидно, максимальное число, которое может быть записано в 16-битный счетный регистр таймера равно 216 - 1 = 65535 , что представляет собой логическую единицу в каждом разряде регистра. Таким образом, если перед запуском таймера в его счетчики были записаны нули, то переполнение таймера произойдет через 65536 машинных циклов. Зная частоту задающего генератора микропроцессорной системы, а как следствие и период сигнала генератора TG, можно легко определить время переполнения таймера в секундах:

TT = 65536·TG .

Если же требуется установить меньший интервал времени, то перед запуском таймера в его регистры можно записать начальный код, и тогда счет начнется не с нуля, а с записанного кода, и счетчику потребуется меньше времени для переполнения. В этом случае время работы таймера TT определяется по формуле:

TT = (2n - Code)·TG ,

где: Code – код, записанный в таймер до его запуска, TT – Время работы таймера, TG – период колебаний задающего генератора, n – разрядность таймера.

Если же требуется сформировать интервал времени больший, чем максимальное время переполнения, то таймер можно запустить несколько раз в цикле. В этом случае временной интервал определяется как:

ΔT = TT·N ,

где N – количество итераций цикла, TT – время срабатывания таймера.

3.2 Таймеры-счетчики микроконтроллера ADuC842

Микроконтроллер ADuC842 имеет три 16-разрядных таймера-счетчика: Таймер 0, Таймер 1 и Таймер 2. Структура и режимы работы таймеров-счетчиков соответствуют общим принципам архитектуры MCS-51. Каждый таймер-счетчик содержит по два 8-битных регистра THx и TLx (x = 0, 1, и 2).

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

В режиме таймера регистр TLx увеличивает свое значение на единицу каждый машинный цикл. Поскольку машинный цикл однотактового ядра состоит из одного тактового периода, то максимальная скорость счета равна тактовой частоте ядра.

В режиме счетчика, регистр TLx увеличивает свое значение на единицу при переходе уровня из высокого в низкий на соответствующем внешнем выводе микроконтроллера: T0, T1 или T2. Когда на внешнем выводе один машинный цикл держится высокий логический уровень, а уже в следующем цикле – низкий, тогда регистр таймера увеличивает свое значение на единицу. Таким образом, для распознавания перехода из “1” в “0” требуется два такта внутреннего генератора микроконтроллера, это значит, что максимальная скорость счета может составить половину частоты внутреннего тактового генератора.

Таймеры 0 и 1 обслуживаются регистром режима TMOD и регистром управления TCON.

TMOD – регистр конфигурации Таймера 1 и Таймера 0.
SFR адрес 0x89.
Значение после подачи питания 0x00.
Регистр не имеет битовой адресации.

Таблица 1 – Описание бит регистра TMOD

номер мнемоника описание
7 GATE Бит управления таймером 1.
При GATE = 1 для работы необходимо условие TR1 = 1 и INT1# = 1.
При GATE = 0 Таймер 1 работает всегда, когда TR1 = 1.
6 C/T# Бит выбора типа событий для Таймера 1.
При C/T# = 1 он работает как счетчик (вход с внешнего вывода T1P3.5), при С/T# = 0 — как таймер (вход с внутреннего генератора).
5 M1 M1, M0 биты определяют режим работы таймера 1
M1 M0  
0 0 TH1 работает как 8-битный таймер-счетчик, TL1 выступает в качестве делителя частоты на 32
0 1 16-битный таймер-счетчик, TH1 и TL1 включены последовательно.
1 0 8-битный таймер-счетчик с автоперезагрузкой, TH1 удерживает значение, которое загружается в TL1 всякий раз при переполнении TL1.
1 1 Таймер-счетчик 1 остановлен.
4 M0
3 GATE Бит управления таймером 0.
При GATE = 1 для работы необходимо условие TR0 = 1 и INT0# = 1.
При GATE = 0 Таймер 0 работает всегда, когда TR0 = 1.
2 C/T# Бит выбора типа событий для Таймера 0.
При C/T# = 1 он работает как счетчик (вход с внешнего вывода T0P3.4), при С/T# = 0 — как таймер (вход с внутреннего генератора).
1 M1 M1, M0 биты определяют режим работы таймера 0
M1 M0  
0 0 TH0 работает как 8-битный таймер-счетчик, TL0 выступает в качестве делителя частоты на 32
0 1 16-битный таймер-счетчик, TH0 и TL0 включены последовательно.
1 0 8-битный таймер-счетчик с автоперезагрузкой, TH1 удерживает значение, которое загружается в TL0 всякий раз при переполнении TL0.
1 1 TL0 используется в качестве 8-битного таймера-счетчика со стандартными битами управления Таймера 0. TH0 используется только в качестве 8-битного счетчика, управление происходит стандартными битами управления таймера 1.
0 M0

TCON – регистр управления Таймера 1 и Таймера 0.
SFR адрес 0x88.
Значение после подачи питания 0x00.
Регистр имеет битовую адресацию.

Таблица 2 – Описание бит регистра TCON

номер мнемоника описание
7 TF1 Флаг переполнения Таймера 1. Устанавливается аппаратно при переполнении счетного регистра таймера. Очищается аппаратно при передаче управления на процедуру обработки прерывания.
6 TR1 Бит запуска Таймера 1. При TR1 = 1 счет разрешен.
5 TF0 Флаг переполнения Таймера 0. Устанавливается аппаратно при переполнении счетного регистра таймера. Очищается аппаратно при передаче управления на процедуру обработки прерывания.
4 TR0 Бит запуска Таймера 0. При TR0 = 1 счет разрешен.
3 IE1 Флаг внешнего прерывания 1 (INT1#) Устанавливается аппаратно при падающем фронте или при нулевом уровне на внешней ножке INT1#, зависит от состояния бита IT1. Очищается аппаратно при передаче управления на процедуру обработки прерывания.
2 IT1 Бит выбора типа активного сигнала на входе INT1#. При IТ1 = 1 активным является переход из высокого в низкий, при IТ1 = 0 активным является низкий уровень сигнала.
1 IE0 Флаг внешнего прерывания 1 (INT0#) Устанавливается аппаратно при падающем фронте или при нулевом уровне на внешней ножке INT0#, зависит от состояния бита IT0. Очищается аппаратно при передаче управления на процедуру обработки прерывания.
0 IT0 Бит выбора типа активного сигнала на входе INT1#. При IТ0 = 1 активным является переход из высокого в низкий, при IТ0 = 0 активным является низкий уровень сигнала.

Каждый таймер содержит два 8-битных регистра, которые могут быть использованы как независимые регистры или скомбинированы в одиночные 16-битные регистры в зависимости от режима работы таймера.
TH0 и TL0 – старший и младший байт Таймера 0.
SFR адрес – 0x8C и 0x8A, соответственно.
TH1 и TL1 – старший и младший байт Таймера 1.
SFR адрес – 0x8D и 0x8B, соответственно.

Адреса регистров SFR таймеров MCS-51. 22КБ
Рисунок 2 – Адреса регистров SFR таймеров

3.3 Режимы работы Таймера 1 и 0

Для выбора нулевого режима следует установить биты M1 = 0 и M0 = 0 регистра TMOD. В этом режиме таймер-счетчик сконфигурирован как 13 битный счетный регистр. Этот счётчик состоит из 8 бит регистра ТНх и младших 5 бит регистра TLx, где x в обозначении регистра заменяется на 0 или 1 в зависимости от того таймера, которым мы управляем. Старшие 3 бита регистров TLx не определены и игнорируются. Установка запускающего таймер флага TR0 или TR1 не очищает эти регистры. Работе таймера 0 или таймера 1 в режиме 0 соответствует схема:

Структурная схема таймера в режиме 0. 15КБ
Рисунок 3 – Структурная схема таймера в режиме 0 (для Таймера 0)

Переполнение таймера происходит, когда единицы в каждом разряде меняются нулями, при этом флаг переполнения TFx устанавливается в единицу. Флаг TFx может быть использован для прерывания. К входу счетчика подключен источник сигналов, когда TRx = 1 и выполняется одно из условий Gate = 0 или INTx = 1. В этом случае удобно управлять таймером через флаг TRx. В случае, когда Gate = 1 таймер может управляться с внешнего вывода микроконтроллера INTx, такая возможность позволяет измерять длительность импульсов. Измеряемый импульс должен подаваться на вход INTx. Тип источника тактовых импульсов определяется флагом C/T#, когда флаг установлен (С/Т# = 1), сигнал на счетчик подается с внешнего вывода микросхемы Tx, если флаг сброшен (С/Т# = 0) – с внутреннего тактового генератора. Флаг TRx контролируется через регистр специальной функции TCON, флаги Gate и С/Т# – через TMOD.

Этот режим был введён для совместимости с устаревшим семейством микроконтроллеров MCS-48 для переноса уже разработанных программ на новые процессоры, и поэтому в настоящее время не используется.

Для выбора первого режима следует установить биты M1 = 0 и M0 = 1 регистра TMOD. В первом режиме работы таймер работает как шестнадцатиразрядный счётчик. Режим 1 похож на режим 0, за исключением того, что в регистрах таймера используются все 16 бит. В этом режиме регистры ТНх и TLx также включены друг за другом. Работе таймера 0 или таймера 1 в режиме 1 соответствует схема:

Структурная схема таймера в режиме 1. 15,7 КБ
Рисунок 4 – Структурная схема таймера в режиме 1 (для Таймера 0)

Нулевой и первый режимы работы Таймеров 0 и 1 предназначены для формирования одиночного интервала времени. Если возникает необходимость формировать последовательность интервалов времени для периодических процессов, то загрузка регистров THx и TLx для задания нужного интервала времени производится программно, что для коротких интервалов времени может привести к значительным затратам процессорного времени.

Для формирования последовательности одинаковых интервалов времени используется режим работы таймера с перезагрузкой – режим 2. Для выбора второго режима следует установить биты M1 = 1 и M0 = 0 регистра TMOD. В режиме 2 регистр таймера TLx работает как 8-битный счетчик с автоматической перезагрузкой начального значения из регистра ТНх в регистр TLx. Переполнение регистра TLx не только устанавливает флаг TFx, но и загружает регистр TLx содержимым регистра ТНх, который предварительно инициализируется программно. Перезагрузка не изменяет содержимое регистра ТНх. Работе таймера 0 или таймера 1 в режиме 2 соответствует схема:

Структурная схема таймера в режиме 2. 15,7 КБ
Рисунок 5 – Структурная схема таймера в режиме 2 (для Таймера 0)

Для таймеров 0 и 1 третий режим различается. Таймер 1 в режиме 3 просто хранит свое значение – такой же эффект как при TR1 = 0. Таймер 0 в режиме 3 работает как два независимых счетчика, это показано на рисунке 6. Регистр TL0 использует биты управления таймера 0: С/Т#, GATE, TR0 и TF0. Регистр ТН0 работает только в режиме таймера, и использует биты TR1 и TF1 таймера 1.

Структурная схема таймера в режиме 2. 22,9 КБ
Рисунок 6 – Структурная схема таймера в режиме 3 (для Таймера 0)

Работа таймера TL0. разрешается, если бит TR0 = 1, а таймера TH0 – если бит TR1 = 1. Таймер 1 при работе таймера 0 в режиме 3 постоянно включен.

Этот режим работы позволяет реализовать два независимых таймера, если таймер 1 используется для работы последовательного порта. В микроконтроллере ADuC842 для синхронизации последовательного порта принято использовать специально для этого выделенный четвертый таймер (Таймер 3), поэтому этот режим мало чем интересен.

3.4 Особенность работы тактового генератора ADuC842

Встроенный генератор микроконтроллера ADuC842 предназначен для работы с кварцевым резонатором 32.768 кГц. Для формирования тактов синхронизации процессора используется умножитель частоты: система фазовой автоподстройки частоты (ФАПЧ) и управляемый делитель. С помощью системы ФАПЧ частота тактового генератора умножается на 512, что соответствует 16,777216 МГц. Делитель же настраивается на фиксированные коэффициенты деления (1, 2, 4, 8, 16, 32, 64, 128). При включении микроконтроллера по умолчанию установлен делитель 8, что соответствует частоте 16,777216/8 = 2,097152(МГц). Изменить этот делитель можно через регистр PLLCON.

3.5 Способы программной реализации работы таймера

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

Допустим, тактовый генератор сконфигурирован для генерации с частотой 1МГц, а нам требуется сформировать временные интервалы 3500 мкс. В этом случае на вход таймера будут поступать импульсы с периодом 1мкс. Для 16-битного счетчика максимальное время переполнения составит 65536 мкс. Для формирования меньшего интервала времени в счетчики таймера следует загрузить начальное значение Code. Из формулы 1 выразим Code:

Code = 2n - TT/TG = 65536 -  3500/1 = 62036

Счетчик таймера состоит из двух отдельных 8-битных счетчиков THx и TLx, поэтому полученное значение Code следует расщепить на два отдельных байта. Сделать это можно разными способами. Можно с помощью калькулятора перевести число Code из десятеричной системы счисления в шестнадцатеричную: 6203610 = F2 5416. Тогда старший байт THx будет равен F216, а младший TLx равен 5416.

При расщеплении константы можно воспользоваться делением на 256, тогда:

THx = 62036/256; // заносим старший байт числа 62036
TLx = 62036;     // заносим младший байт числа 62036

Операция деления числа на 256 эквивалентна сдвигу этого числа на 8 разрядов вправо, тогда приведенный участок программы можно записать так:

<
THx = 62036 >> 8;// заносим старший байт числа 62036
TLx = 62036;     // заносим младший байт числа 62036 

Существует иной способ загрузки начального значения в таймер. Число, которое необходимо загружать в таймер, можно найти как отношение требуемого интервала времени, 3500мкс, и периода импульсов на входе таймера, 1мкс. Так как таймер суммирующий, то в регистры таймера будем загружать отрицательное число с абсолютным значением, равным требуемому отношению. Для выделения старшего байта из 16-разрядного числа используем функцию сдвига этого числа на 8 разрядов вправо, тогда соответствующий код программы будет выглядеть следующим образом:

THx = (-3500) >> 8;// заносим старший байт числа 62036
TLx = -3500;       // заносим младший байт числа 62036

После того как регистром TMOD установлен режим работы и загружены начальные значения счетчиков, можно запускать таймер. Для этого в бит запуска TRx следует записать логическую единицу. Теперь в тело основного цикла нужно включить участок программы, который будет ожидать окончания работы таймера и только после этого приступать к выполнению следующего прохода по циклу. Это можно сделать с помощью команды, которая будет проверять флаг переполнения таймера TFx. Затем необходимо снова задать следующий интервал времени. Следует помнить, что перед запуском таймера, следует обнулить флаг переполнения. Ниже приведен один из вариантов программы, реализующей задержку на 3,5 мс.

TH0 = 62036 >> 8; // заносим старший байт числа 62036
TL0 = 62036;      // заносим младший байт числа 62036
TR0 = 1;          // запускаем таймер
while (!TF0);     // ждем переполнения таймера
TF0 = 0;          // обнуляем флаг переполнения

Для формирования временных интервалов большей длительности данный участок программы можно запустить в цикле необходимое количество раз.

4 Задание к работе в лаборатории

  1. Разработайте алгоритм программы соответственно заданию: сформировать сигнал прямоугольной формы скважности 2 заданного периода, согласно варианту (таблица 3). Сигнал должен выводиться на светодиод.
  2. По принципиальной схеме установите, к каким портам микроконтроллера подключен светодиод.
  3. По таблице регистров специальных функций (SFR) определите адреса регистров управления таймерами.
  4. Рассчитайте значение регистров TLx и THx для формирования заданного времени работы таймера (таблица 3).
  5. Рассчитайте требуемое количество итераций цикла для формирования сигнала с периодом Т (таблица 3)
  6. Войдите в интегрированную среду программирования Keil-C. Создайте и настройте должным образом проект.
  7. Разработайте и введите текст программы в соответствии с созданным алгоритмом.
  8. Оттранслируйте программу, и исправьте синтаксические ошибки.
  9. Загрузите полученный *.hex файл в лабораторный стенд LESO1.
  10. Убедитесь, что программа функционирует должным образом. С помощью секундомера измерьте период сигнала.

Таблица 3 – Варианты заданий

номер варианта номер таймера время таймера период сигнала ТT
1 таймер 0 5 мс 2 с
2 таймер 1 15 мс 3 с
3 таймер 0 10 мс 4 с
4 таймер 1 25 мс 5 с
5 таймер 0 30 мс 6 с
6 таймер 1 14 мс 7 с
7 таймер 0 20 мс 8 с
8 таймер 1 12,5 мс 9 с
9 таймер 0 40 мс 10 с
10 таймер 1 4 мс 11 с
11 таймер 0 30 мс 12 с
12 таймер 1 32,5 мс 13 с
13 таймер 0 17.5 мс 14 с
14 таймер 1 7,5 мс 15 с
15 таймер 0 10 мс 16 с

5 Указания к составлению отчета

Отчет должен содержать:

  1. Цель работы.
  2. Структурную схему таймера микроконтроллера ADuC842 в выбранном режиме.
  3. Расчет начальных значений счетных регистров таймера.
  4. Обоснование выбора значения регистра TMOD.
  5. Графическую схему алгоритма работы программы.
  6. Исходный текст программы.
  7. Содержимое файла листинга программного проекта.
  8. Выводы по выполненной лабораторной работе.

Схемы, а также отчет в целом, выполняются согласно нормам ЕСКД.

Комментарии:



Аватар пользователя  Denzell

в формуле (Code = 2n - TT/TG = 65536 -  3500/1 = 62036) помоему опечатка. Вместо деления нужно умножить. Просто я подставлял свои значения и не понимал почему таймер не правильно считает. Умножил (TT на TG) и все заработало как положенно.

Приветствую. Эта формула следует непосредственно из формулы:

TT = (2n - Code)·TG .

Раскрываем скобки:

 TT =  2n ·TG -  Code·TG,

Переносим Code  влевую часть, а TT в правую часть.

  Code·TG = 2n ·TG - TT

Делим все на TG:

Code = 2n  - TT/T-- что и требовалось доказать.

Это касается математики. Теперь о физическом смысле. У нас есть таймер, он каждый такт увеличивает свое значение на единицу. Когда он дотикает до значения 2n=65536 он создаст событие, которое может быть использовано для генерации прерывания, либо просто считано при опросе флага TF.  Каждый такт имеет какое-то время, которое в нашем случаее определяется частотой работы ядра процессора. Если у адука не настраивать PLL, то частота его работы равна 2,097152 МГц. Это значит, что один так будет примерно равен 0.5 мкс.  Теперь смотрим, положим, нам нужно что бы таймер сработал через 1 мкс (на практике нереально малое значение), Сколько тактов должен работать таймер? Привильный ответ 2. То есть, через два тика он отсчитает нужные нам 1мкс.  Какое число мы должны установить в таймер для этого? Правильно, 65534. В этом случаее, через два такта будет переполнение.

Усложняем пример, допустим нам нужно отмерить 10мкс. В тактах (мы же помним, что такт это половина мкс) это будет 20. А это значит, что в таймер мы должны записать число 65536-20 = 65516. Теперь событие переполнения будет через 20 тактов. Логика понятна?

Еще пример посложнее. Нужно отмерить 3.5мс. Для того, что бы высчитать, сколько это будет в тактах, разделим 3.5мс на 0.5мкс, естественно, нужно привести к одинаковым единицам измерения: 3500мкс/0.5мкс =  7000 тактов. Получается, что в таймер мы должны положить число: 65536 - 7000 = 58536.

Теперь проанализируйте эти три примера. Случайно не напоминает приведенную формулу?

Орфографическая ошибка в тексте:
Чтобы сообщить об ошибке автору, нажмите кнопку "Отправить сообщение об ошибке". Вы также можете отправить свой комментарий.