Пристрій таймерів мікроконтролерів mcs-51

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

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

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

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

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

Малюнок 1. Формат регістра керування режимами роботи таймерів TMOD.

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

Ім'я та призначення

TMOD.7 для таймера 1 і TMOD.3 для таймера 0

Управління блокуванням таймера від ніжки INTx. Якщо біт встановлено у 1, то таймер / лічильник "x" дозволений доти, поки на вході "lNTx" високий рівень і біт управління "TRx" встановлено. Якщо біт скинутий в 0, то Т / З дозволяється, як тільки біт керування "TRx" встановлюється в 1.

TMOD.6 для таймера 1 і TMOD.2 для таймера 0

Біт вибору режиму таймера або лічильника подій. Якщо біт скинутий в 0, то таймер працює від внутрішнього генератора, якщо встановлений в 1, то працює від зовнішніх сигналів на вході "Tx"

TMOD.5 для таймера 1 і TMOD.1 для таймера 0

Вибір режиму роботи таймера

TMOD.4 для Т / С1 і TMOD.0 для Т / С0

У нульовому режимі таймер працює як 13-бітний суммирующий лічильник. Цей лічильник складається з 8 біт регістра ТНХ і молодших 5 біт регістра TLx, де x в позначенні регістра замінюється на 0 або 1 в залежності від того таймера, яким ми управляємо. Старші 3 біта регістрів TLx не визначені і ігноруються. Установка запускає таймер прапора TR0 або TR1 не очищати ці регістри. Схема таймера 0 або таймера 1, що працюють в режимі 0, наведена на малюнку 2.


Малюнок 2. Схема таймерів 0 або 1 в режимі 0

На даній схемі не показані ланцюга управління таймером. Ми обговоримо особливості управління таймерами 0 і 1 і їх схему управління пізніше.

Режим 0 був введений для сумісності з застарілими сімейством мікроконтролерів MCS-48 для полегшення перенесення вже розроблених програм на нові процесори і тому в даний час не використовується. Проте, в цьому режимі можна забезпечити формування інтервалу часу тривалістю до 8096 мс при частоті генератора, що задає 12 МГц.

Коли вміст лічильника змінюється зі стану все "1" в стан все "0". то встановлюється (приймає значення "1") прапор переривання таймера TF0 або TF1.

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

У розглянутому прикладі для розщеплення 16-ти бітної константи на два окремих байта були використані функції виділення старшого і молодшого байта. Ці функції присутні в більшості ассемблеров для мікроконтролерів MCS-51. Якщо ж мова програмування не містить в своєму складі подібні функції, то можна для виділення байтів скористатися операцією ділення на 256.

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

Малюнок 3. Схема таймерів 0 або 1 в режимі 1.

У цьому режимі можна забезпечити формування інтервалу часу тривалістю до 65536 мкс при частоті генератора, що задає 12 МГц.

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

У розглянутому прикладі переповнення таймера відбудеться через 15000 циклів процесора, тобто через 15 мс. Програма буде постійно перевіряти стан прапора переповнення таймера і як тільки він встановиться в одиницю перейде до виконання наступної команди.

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

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

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

Малюнок 4. Схема таймерів 0 або 1 в режимі 2.

Таймер 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.

Біт управління типом переривання 0. Встановлюється / скидається програмно для визначення типу запиту переривання INT0 (зріз / низький рівень)

Крім того, схема управління таймерами цікава тим, що дозволяє використовувати таймери в якості вимірювальних приладів. Розглянемо цю можливість докладніше.

Використання таймера в якості вимірювача ширини імпульсів

Відомо, що вимірювання тривалості імпульсу можна зробити, підрахувавши імпульси еталонної частоти. Принцип вимірювання тривалості імпульсів ілюструється малюнком 8.

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

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

Малюнок 8. Принцип вимірювання тривалості імпульсів

Малюнок 9. Програма вимірювання тривалості імпульсів

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

Використання таймера в якості частотоміра.

Відомо, що вимірювання частоти можна зробити, підрахувавши кількість періодів невідомої частоти за одиницю часу. Принцип вимірювання частоти ілюструється малюнком 10.

Малюнок 10. Принцип вимірювання частоти

Для вимірювання частоти вимірюваний сигнал подається на висновок мікроконтролера Tx. Таймер / лічильник налаштовується в режим лічильника записом в біт C / Tx логічної одиниці. Вміст таймера обнуляється. Таймер включається на строго певний інтервал часу. Цей інтервал задається залишилися таймером.

Приклад програми вимірювання частоти сигналу на ніжці мікроконтролера T0 наведено на малюнку 11.

Малюнок 11. Програма вимірювання частоти

Якщо тепер на вхід мікроконтролера T0 подати сигнал з невідомої частотою, то в регістрах TH0 і TL0 буде записана його частота в кілогерцах.

Разом зі статтею "Архітектура мікроконтролерів MCS-51" Новомосковскют: