В базовых моделях семейства имеются
Дата последнего обновления файла 07.06.2005 Устройство таймеров микроконтроллеров MCS-51
В базовых моделях семейства имеются два программируемых 16-битных таймера/счетчика (T/C0 и T/C1), которые могут быть использованы как в качестве таймеров, так и в качестве счетчиков внешних событий. Каждый из них состоит из двух 8-битных регистров TH0 (старший байт) и TH0 (младший байт) для таймера 0 или TH1 (старший байт) и TH1 (младший байт) для таймера 1.
В режиме таймера содержимое соответствующего таймера/счетчика инкрементируется в каждом машинном цикле, т.е. через каждые 12 периодов колебаний кварцевого резонатора.
В режиме счетчика содержимое соответствующего таймера/счетчика инкрементируется под воздействием перехода из 1 в 0 внешнего входного сигнала, подаваемого на вывод микроконтроллера T0 или T1. Так как на распознавание периода требуются два машинных цикла, максимальная частота подсчета входных сигналов равна 1/24 частоты резонатора. На длительность периода входных сигналов ограничений сверху нет. Для гарантированного прочтения входной сигнал должен удерживать значение 1, как минимум, в течение одного машинного цикла микро-ЭВМ.
Схемы управления таймерами идентичны. Таймер 0 и Таймер 1 могут работать в четырех режимах работы:
- режим 0: 13-битный таймер
- режим 1: 16-битный таймер
- режим 2: 8-битный автоперезагружаемый таймер
-
режим 3: Таймер 0 как 2 раздельных 8-битных таймера.
Для переключения режимов работы таймеров используются биты M0 и M1 регистра специальной функции TMOD. Название образовано от сокращения двух английских слов: T(timer)- таймер и mode - режим. Имена и расположение битов приведено на рисунке 1:
Рисунок 1. Формат регистра управления режимами работы таймеров TMOD.
Так как управление таймерами 0 и 1 полностью идентично, то приведём назначение битов по именам:
Символ | Позиция бита | Имя и назначение | |||||||||||||||||||||||||||
GATE | TMOD.7 для таймера 1 и TMOD.3 для таймера 0 |
Управление блокировкой таймера от ножки INTx. Если бит установлен в 1, то таймер/счетчик "x" разрешен до тех пор, пока на входе "lNTx" высокий уровень и бит управления "TRx" установлен.
Обычно пользователя интересует не максимальный интервал времени, а свой конкретный интервал времени. Для уменьшения интервала времени в регистры таймера можно предварительно занести число и тем самым сформировать произвольный интервал времени. Рассмотрим пример подготовки таймера 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 соответствует схема: Рисунок 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 мало интересен. Управление таймерами-счётчиками. Схема управления таймерами 0 и 1 идентична и для таймера T0 приведена на рисунке 6. Для схемы управления таймером T1 изменятся только номера управляющих бит (нули будут заменены на 1). В приведенной схеме заштрихованным прямоугольником обозначены внешние ножки микросхемы микроконтроллера. Рисунок 6. Схема управления таймерами 0 или 1. Из схемы видно, что таймер может включаться и выключаться битами TRx. Таким образом можно уменьшать потребление микросхемы и уровень помех, создаваемый ею. Учитывая, что счетчики таймеров переключаются на высокой частоте, то они могут потреблять до половины тока потребления микроконтроллера. Следует отметить, что при включении и после сброса микроконтроллера работа таймеров запрещена. Есть возможность управлять работой таймера извне при помощи внешней ножки T0 для таймера T0 или T1 для таймера T1. Для этого необходимо записать в бит GATEx логическую единицу (не забыв при этом разрешить работу таймера при помощи бита TRx). Кроме того, таймер может синхронизироваться от внешнего генератора. Для этого в бит управления C/T нужно записать логическую единицу. Биты включения таймеров TR0 и TR1 размещены в регистре TCON (control - управлять), а биты GATE и C/T в регистре TMOD. Формат регистра TCON приведён на следующем рисунке: Рисунок 7. Формат регистра управления режимами работы таймеров TCON.
Кроме того, схема управления таймерами интересна тем, что позволяет использовать таймеры в качестве измерительных приборов. Рассмотрим эту возможность подробнее. Использование таймера в качестве измерителя ширины импульсов. Известно, что измерение длительности импульса можно произвести, подсчитав импульсы эталонной частоты. Принцип измерения длительности импульсов иллюстрируется рисунком 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 будет записана его частота в килогерцах. [ Главная ] |