Микропроцессоры

Устройство таймеров микроконтроллеров MCS-51

В базовых моделях семейства имеются два программируемых 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:

TMOD.gif (3495 bytes)

Рисунок 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

M0 TMOD.4 для Т/С1 и TMOD.0 для Т/С0

Режим 0

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

mode0.gif (1742 bytes)

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

Этот режим был введЈн для совместимости с устаревшим семейством микроконтроллеров MCS-48 для облегчения переноса уже разработанных программ на новые процессоры и поэтому в настоящее время не используется. Тем не менее, в этом режиме можно обеспечить формирование интервала времени длительностью до 8096 мс при частоте задающего генератора 12 МГц.

Когда содержимое счетчика изменяется из состояния все "1" в состояние все "0" , то устанавливается (принимает значение "1") флаг прерывания таймера TF0 или TF1.

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

;Настроить режим работы таймера-------------------------------------------------------------------------------------------
  mov TMOD,#00000000b          ;настроить таймеры T0 и T1 на нулевой режим работы
           ;||||||||
           ;||||||++-------Перевести таймер T0 в тринадцатиразрядный режим работы
           ;|||||+---------Синхронизироваться от внутреннего генератора
           ;||||+----------Запретить управление таймером от ножки INT0
           ;||++-----------Перевести таймер T1 в тринадцатиразрядный режим работы
           ;|+-------------Синхронизироваться от внутреннего генератора
           ;+--------------Запретить управление таймером от ножки INT1
           
;Настроить таймер на генерацию 5-ти миллисекундного интервала времени--------------------------------------
    mov TH0, #HIGH(-5000)  ;Загрузить старший байт таймера
    mov TL0, #LOW(-5000)    ;Загрузить младший байт таймера

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

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

Режим 1

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

mode1.gif (1777 bytes)

В этом режиме можно обеспечить формирование интервала времени длительностью до 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 соответствует схема:

mode2.gif (1847 bytes)

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

    mov TMOD,#2                  ;перевести таймер T0 во второй режим работы, а T1 - в нулевой
    mov TH0, #-5000/256          ;Загрузить старший байт таймера
    mov TL0, #-(5000-5000/256)   ;Загрузить младший байт таймера

Режим 3

Таймер 1 при работе в режиме 3 просто хранит свое значение. Эффект такой же как при сбросе бита TR1.

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

mode3.gif (1824 bytes)

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

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

Управление таймерами-счЈтчиками.

Схема управления таймерами 0 и 1 идентична и приведена на рисунке:

Из схемы видно, что таймер может включаться и выключаться битами TRx. Есть возможность управлять работой таймера извне при помощи внешней ножки T0 для таймера T0 или T1 для таймера T1. Для этого необходимо записать в бит GATEx логическую единицу (не забыв при этом разрешить работу таймера при помощи бита TRx).

Кроме того таймер может синхронизироваться от внешнего генератора. Для этого в бит управления C/T нужно записать логическую единицу.

Биты включения таймеров TR0 и TR1 размещены в регистре TCON (control - управлять), а биты GATE и C/T в регистре TMOD. Формат регистра TCON приведЈн на следующем рисунке:

TCON.gif (2731 bytes)

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

Символ Позиция Имя и назначение
TF1 TCON.7

Флаг переполнения таймера 1. Устанавливается аппаратно при переполнении таймера/счетчика. Сбрасывается при обслуживании прерывания аппаратно

TR1 TCON.6

Бит управления таймера 1. Устанавливается/сбрасывается программой для пуска/останова

TF0 TCON.5

Флаг переполнения таймера 0. Устанавливается аппаратурно. Сбрасывается при обслуживании прерывания

TR0 TCON.4

Бит управления таймера 0. Устанавливается / сбрасывается программой для пуска/останова таймера/счетчика

IE1 TCON.3

Флаг фронта прерывания 1. Устанавливается аппаратно, когда детектируется срез внешнего сигнала INT1. Сбрасывается при обслуживании прерывания

IT1 TCON.2

Бит управления типом прерывания 1. Устанавливается / сбрасывается программно для определения типа запроса прерывания INT1 (срезу/низким уровнем).

IE0 TCON.1

Флаг фронта прерывания 0. Устанавливается по срезу сигнала INT0. Сбрасывается при обслуживании прерывания

IT1 TCON .0

Бит управления типом прерывания 0. Устанавливается / сбрасывается программно для определения типа  запроса прерывания INT0 (срез/низкий уровень)

Схема управления таймерами интересна тем, что позволяет использовать таймеры в качестве измерительных приборов.

Использование таймера в качестве измерителя ширины импульсов.

Известно, что измерение длительности импульса можно произвести, подсчитав импульсы эталонной частоты. Принцип измерения длительности импульсов иллюстрируется рисунком 8.

Для измерения длительности импульса измеряемый сигнал подаЈтся на вывод микроконтроллера INTx и в бит управления GATE записывается разрешающий сигнал логической единицы. Таймер/счЈтчик настраивается в режим таймера записью в бит C/Tx логического нуля. Содержимое таймера обнуляется.

Пример программы измерения длительности импульса приведЈн на рисунке 9.

Рисунок 8. Принцип измерения длительности импульсов

     mov TMOD,#00001001b
               ;||||||||
               ;||||||++--Перевести таймер T0 в шестнадцатиразрядный режим
               ;|||||+----Синхронизироваться от внутреннего генератора
               ;||||+-----Включать таймер от ножки микроконтроллера INT0
               ;||++------Перевести таймер T1 в тринадцатиразрядный режим
               ;|+--------Синхронизироваться от внутреннего генератора
               ;+---------Запретить управление таймером от ножки INT1
 
         mov TH0, #0         ;Обнулить старший байт таймера
         mov TL0, #0         ;Обнулить младший байт таймера

         setb TR0            ;Включить измеритель ширины импульса
 
TstLog0: jnb INT0, TstLog0   ;Подождать начало импульса
TstLog1: jnb INT0, TstLog1   ;Подождать конец импульса

         Clr TR0             ;Отключить измеритель ширины импульса

Рисунок 9. Программа измерения длительности импульсов

Если теперь на вход микроконтроллера INT0 подать импульс с неизвестной длительностью, то в регистрах TH0 и TL0 будет записана его длительность в микросекундах.

Использование таймера в качестве частотомера.

Известно, что измерение частоты можно произвести, подсчитав количество периодов неизвестной частоты за единицу времени. Принцип измерения частоты иллюстрируется рисунком 10.

Рисунок 10. Принцип измерения частоты

Для измерения частоты измеряемый сигнал подаЈтся на вывод микроконтроллера Tx. Таймер/счЈтчик настраивается в режим счЈтчика записью в бит C/Tx логической единицы. Содержимое таймера обнуляется. Таймер включается на строго определЈнный интервал времени. Этот интервал задаЈтся оставшимся таймером.

Пример программы измерения частоты сигнала на ножке микроконтроллера T0 приведЈн на рисунке 11.

     mov TMOD,#00010101b
              ;||||||||
              ;||||||++-------Перевести таймер T0 в шестнадцатиразрядный режим 
              ;|||||+---------Работать от сигнала на ножке T0
              ;||||+----------Запретить управление таймером от ножки INT0
              ;||++-----------Перевести таймер T1 в шестнадцатиразрядный режим
              ;|+-------------Синхронизироваться от внутреннего генератора
              ;+--------------Запретить управление таймером от ножки INT1


     mov TH0, #0          ;Обнулить старший байт счЈтчика
     mov TL0, #0          ;Обнулить младший байт счЈтчика
;---измерение вести 1 мс---------------------------------------------------------
     mov TH1, #HIGH(-1000) ;Загрузить старший байт таймера
     mov TL1, #LOW(-1000)  ;Загрузить младший байт таймера

     mov TCON,#01010000b ;Включить частотомер
              ;||||||||
              ;|||||||+-------Прерывание от ножки INT1возникает по фронту
              ;||||||+--------Сбросить запрос прерывания от ножки INT1
              ;|||||+---------Прерывание от ножки INT1возникает по фронту
              ;||||+----------Сбросить запрос прерывания от ножки INT1
              ;|||+-----------Включить таймер T0
              ;||+------------Обнулить флаг таймера T0
              ;|+-------------Включить таймер T1
              ;+--------------Обнулить флаг таймера T1

TstTimeOut:
     jnb TF1, TstTimeOut     ;Если 1 мс прошла
          mov TCON, #00000000b    ;то отключить частотомер
                    ;||||||||
                    ;|||||||+-------Прерывание от ножки INT1 возникает по фронту
                    ;||||||+--------Сбросить запрос прерывания от ножки INT1
                    ;|||||+---------Прерывание от ножки INT1возникает по фронту
                    ;||||+----------Сбросить запрос прерывания от ножки INT1
                    ;|||+-----------Отключить таймер T0
                    ;||+------------Обнулить флаг таймера T0
                    ;|+-------------Отключить таймер T1
                    ;+--------------Обнулить флаг таймера T1

Рисунок 11. Программа измерения частоты

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


[Назад] [Содержание] [Вперёд]