Курс лекций - Микропроцессоры

В базовых моделях семейства имеются


В базовых моделях семейства имеются два программируемых 16-битных таймера/счетчика (T/C0 и T/C1), которые могут быть использованы как в качестве таймеров, так и в качестве счетчиков внешних событий. Каждый из них состоит из двух 8-битных регистров TH0 (старший байт) и TH0 (младший байт) для таймера 0 или TH1 (старший байт) и TH1 (младший байт) для таймера 1.

В содержимое соответствующего таймера/счетчика инкрементируется в каждом машинном цикле, т.е. через каждые 12 периодов колебаний кварцевого резонатора.

В содержимое соответствующего таймера/счетчика инкрементируется под воздействием перехода из 1 в 0 внешнего входного сигнала, подаваемого на T0 или T1. Так как на распознавание периода требуются два машинных цикла, максимальная частота подсчета входных сигналов равна 1/24 частоты резонатора. На длительность периода входных сигналов ограничений сверху нет. Для гарантированного прочтения входной сигнал должен удерживать значение 1, как минимум, в течение одного машинного цикла микро-ЭВМ.

идентичны. Таймер 0 и Таймер 1 могут работать в четырех режимах работы:


Кроме того, Таймер 1 можно использовать для задания скорости передачи (baud rate) последовательного порта.

Для переключения режимов работы таймеров используются биты M0 и M1 регистра специальной функции TMOD. Название образовано от сокращения двух английских слов: T(timer)- таймер и mode - режим. Имена и расположение битов приведено на рисунке 1:



Рисунок 1. Формат регистра управления режимами работы таймеров TMOD.

Так как управление таймерами 0 и 1 полностью идентично, то приведём назначение битов по именам:

Символ Позиция бита Имя и назначение
GATE TMOD.7 для таймера 1 и TMOD.3 для таймера 0 Управление блокировкой таймера от ножки INTx. Если бит установлен в 1, то таймер/счетчик "x" разрешен до тех пор, пока на входе "lNTx" высокий уровень и бит управления "TRx" установлен. Если бит сброшен в 0, то Т/С разрешается, как только бит управления "TRx" устанавливается в 1.
С/Т TMOD.6 для таймера 1 и TMOD.2 для таймера 0 Бит выбора режима таймера или счетчика событий. Если бит сброшен в 0, то таймер работает от внутреннего генератора, если установлен в 1, то работает от внешних сигналов на входе "Tx"
M1 TMOD.5 для таймера 1 и TMOD.1 для таймера 0 Выбор режима работы таймера
M1 M0
0 0 13 битный таймер/счетчик "TLx" работает как 5-битный предварительный делитель
0 1 16 битный таймер/счетчик. "THx" и "TLx" включены последовательно
1 0 8-битный автоперезагружаемый таймер/счетчик. "THx" хранит значение, которое должно быть перезагружено в "TLx" каждый раз по переполнению
1 1 Таймер/счетчик 1 останавливается. Таймер/счетчик 0: TL0 работает как 8-битный таймер/счетчик, и его режим определяется управляющими битами таймера 0. TH0 работает только как 8 битный таймер, и его режим определяется управляющими битами таймера 1

Эти функции присутствуют в большинстве ассемблеров для микроконтроллеров MCS-51. Если же язык программирования не содержит в своём составе подобные функции, то можно для выделения байтов воспользоваться операцией деления на 256.

mov TH0, #-5000/256 ;Загрузить старший байт таймера mov TL0, #-(5000-5000/256) ;Загрузить младший байт таймера Режим 1

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



Рисунок 3. Схема таймеров 0 или 1 в режиме 1.

В этом режиме можно обеспечить формирование интервала времени длительностью до 65536 мкс при частоте задающего генератора 12 МГц.

Рассмотрим пример использования таймера T0 для формирования временного интервала 15мс.

;Настроить режим работы таймера------------------------------------------------------------------------------------------- mov TMOD,#00000001b ;перевести таймер T0 в первый режим работы, а T1 - в нулевой ; ;++-------Перевести таймер T0 в шестнадцатиразрядный режим работы ;|+-----------Синхронизироваться от внутреннего генератора ;+------------Запретить управление таймером от ножки INT0 ;++-------------Перевести таймер T1 в тринадцатиразрядный режим ;|+----------------Синхронизироваться от внутреннего генератора ;+-----------------Запретить управление таймером от ножки INT1 ;Настроить таймер на генерацию 15-ти миллисекундного интервала времени------------------------------------ mov TH0, #HIGH(-15000) ;Загрузить старший байт таймера mov TL0, #LOW(-15000) ;Загрузить младший байт таймера OjidanTimer: jnb TF0, OjidanTimer ;Подождать пока не переполнится таймер В рассмотренном примере переполнение таймера произойдёт через 15000 циклов процессора, то есть через 15 мс. Программа будет постоянно проверять состояние флага переполнения таймера и как только он установится в единицу перейдёт к выполнению следующей команды.



Нулевой и первый режимы работы таймеров T0 и T1 предназначены для формирования одиночного интервала времени. Если возникает необходимость формировать последовательность интервалов времени для периодических процессов, то загрузка регистров TH0 и TL0 для задания нужного интервала времени производится программно, что для коротких интервалов времени может привести к значительным затратам процессорного времени.

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

Режим 2

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



Рисунок 4. Схема таймеров 0 или 1 в режиме 2.

Работа с таймерами во втором режиме не отличается от рассмотренных ранее примеров, поэтому следующий пример инициализации таймера на генерацию частоты с периодом сто микросекунд (10кГц) приводится без комментария.

;Настроить режим работы таймера------------------------------------------------------------------------------------------- mov TMOD, #00000010b ;перевести таймер T0 во второй режим работы, а T1 - в нулевой ; ;++---Перевести таймер T0 в режим 8-ми разр. таймера с автозагрузкой ;|+-----Синхронизироваться от внутреннего генератора ;|+-------Запретить управление таймером от ножки INT0 ;++-------Перевести таймер T1 в тринадцатиразрядный режим ;|+---------Синхронизироваться от внутреннего генератора ;+----------Запретить управление таймером от ножки INT1 mov TMOD,#2 ;перевести таймер T0 во второй режим работы, а T1 - в нулевой mov TH0, #-50 ;Загрузить старший байт таймера mov TL0, #-50 ;Загрузить младший байт таймера OjidanTimer: jnb TF0, OjidanTimer ;Подождать пока не переполнится таймер cpl P2.6 ;Проинвертировать сигнал на шестой ножке второго порта и sjmp OjidanTimer ;снова перейти к ожиданию окончания временного интервала Режим 3 Таймер 1 при работе в режиме 3 просто хранит свое значение.Эффект такой же как при сбросе бита TR1.

Таймер 0 в режиме 3 представляет собой два раздельных 8 битных счетчика (регистры TL0 и ТН0), Регистр TL0 использует биты управления таймера 0: С/Т0. GATE0, TR0 и TF0. Регистр ТН0 работает только в режиме таймера и использует биты TR1 и TF1 таймера 1. Таким образом, регистр ТН0 управляет прерыванием таймера 1. Логика работы таймера 0 в режиме 3 показана на схеме:



Рисунок 5. Схема таймерa 0 в режиме 3.

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

Этот режим работы позволяет реализовать два независимых таймера, если таймер 1 используется для работы последовательного порта, но надо сказать, что на практике режим 2 мало интересен.


Содержание раздела