Добавил:
Upload Опубликованный материал нарушает ваши авторские права? Сообщите нам.
Вуз: Предмет: Файл:
Кофанов_ЦП, ч. 2 (КЛ_ел.варіант).docx
Скачиваний:
2
Добавлен:
01.07.2025
Размер:
4 Мб
Скачать
☆

7.4. Блоки лічильників

Основу цих блоків складають програмовні реверсивні лічильники TCNT0 та TCNT1 (рис. 3). Крім більших меж змінювання вихідного коду N та модуля лічби М 16-розрядні лічильники мають також ширший набір функцій. Залежно від стану лічильників до блоків керування надходять сигнали bottom (низ, тобто вихідний код N = 0) та top (верх, тобто код N досягає максимального для даного режиму значення). У свою чергу вихідними сигналами з блоків керування count, direction, clear лічильники можуть переводитися до режиму лічби з кожним синхроімпульсом clkT0, clkT1, змінювати напрямок лічби (працювати з інкрементом або декрементом) та очищуватися. Під час переходу коду лічильника з максимального значення до нуля генерується запит на переривання за переповненням TOVn (n = 0 або 1).

Рис. 3. Блоки лічильників Т/Л0 (а) і Т/Л1 (б)

Лічильники приступні для обміну інформацією, тобто в будь-який момент часу дані до них можна записати або зчитати з них. З огляду на те, що 16-розрядний лічильник складається з двох 8-розрядних РВВ: старшого (Н) та молодшого (L) байтів TCNT1 = TCNT1H:TCNT1L (див. рис. 3,б), для обміну даними через 8-розрядну шину доводиться записувати або зчитувати байти по черзі. Ніяких проблем при цьому не виникає, коли 16-розрядний пристрій перебуває в статичному стані, але в динаміці внаслідок безперервної зміни коду обмін у два заходи спричиняє помилки. Наприклад, якщо код Т/Л1 змінюється з $01FF на $0200, зчитуючи спочатку старший байт 01, а в наступному такті молодший 00, отримаємо $0100 або, зчитуючи у зворотному порядку спочатку молодший байт FF, а в наступному такті старший 02, дістаємо $02FF, отже, помилка може бути величезною.

Ця проблема розв'язується шляхом буферизації, як на рис. 3,б показано на прикладі Т/Л1 з 8-розрядним буферним регістром ТЕМР, призначеним для зберігання старшого байта даних. Для запису даних до Т/Л1 спочатку старший байт даних має бути приміщений до регістра ТЕМР, а в наступному такті, коли на шину даних надходить молодший байт, обидва байти мають одночасно записуватися до 16-бітного лічильника. Під час зчитування, навпаки, коли з Т/Л1 молодший байт потрапляє в шину даних, старший одночасно записується до регістра ТЕМР, з якого він зчитується в наступному такті. Такий порядок обміну даними програмістом має бути передбачений у програмі мовою асемблера, а в програмі мовою Сі цей алгоритм виконується автоматично (приклад на рис. 4). Єдиною умовою залишається заборона переривання під час запису або зчитування, щоб між двома кроками обміну зміст регістра ТЕМР відповідав даним.

Рис. 4. Приклад обміну даними з 16-розрядним пристроєм

На рис. 5. наведено формат лічильників та їх регістрів керування, а призначення бітів регістрів подано в табл. 7.2. Докладніше застосування цих бітів обговорюється під час розгляду режимів роботи Т/Л.

Рис. 5. Формат лічильників та їх РВВ керування: Т/Л0 (а) і Т/Л1 (б)

Таблиця 7.2 – Біти регістрів керування TCCR0, TCCR1A та TCCR1B

7.5. Блоки порівняння

Основу блока порівняння (БП) Т/Л0 (рис. 6,а) становить 8-розрядний компаратор СОМР0, в якому з кожним тактом імпульсів clkT0 відбувається безперервне порівняння змісту лічильника TCNT0 з кодом, записаним до регістра порівняння OCR0, формат якого подано на рис. 6,в. У момент збігу генерується переривання, що фіксується прапором OCF0, який скидається після переходу МК до його обробки, якщо це переривання дозволене.

Рис. 6. Блоки порівняння Т/Л (а,б), формат РВВ порівняння (в) та приклад (г)

Блок порівняння Т/Л1 (рис. 6,б) відрізняється тим, що порівняння змісту лічильника TCNT1 відбувається з кожним тактом імпульсів clkT1 одночасно у двох 16-розрядних каналах А і В, що складаються з компараторів СОМР1А, СОМР1В та регістрів порівняння OCR1А, OCR1В, формат яких подано на рис. 6,в. При цьому момент збігу фіксується прапорами переривання OCF1А та OCF1В відповідно. Другою відмінністю є подвійна буферизація: обмін між шиною даних і регістрами OCR1А, OCR1В здійснюється через той самий тимчасовий регістр ТЕМР у складі лічильника TCNT1 і додатковий 16-розрядний буферний регістр кожного з регістрів порівняння (на рис. 6,б не показано).

Крім того, в окремих режимах модуль лічби Т/Л1 може задаватися також регістром ICR1, код якого порівнюється зі станом Т/Л1 в компараторі СОМРІС. Слід відзначити, що запис коду до регістра ICR1 є приступний лише в тих режимах, в яких цей регістр визначає модуль лічби. Якщо до регістрів порівняння OCR0, OCR1А записати максимальне значення ТОР = М – 1 ($FF для Т/Л0 і $FFFF для Т/Л1), то одночасно генерується також прапор переривання TOVn. Таким чином, записом потрібного коду до регістрів порівняння OCR0, OCR1А або ICR1 можна змінювати модуль лічби лічильника (приклад на рис. 6,г).

7.6. Блоки виведення сигналів збігу

Блок виведення сигналів збігу поєднує формувач імпульсів і один розряд порту з альтернативною функцією виводу МК, як спрощено подано на рис. 7 на прикладі виводу МК PD.5/ОС1А. З появою запиту на переривання за збігом OCF1А у формувачі імпульсів утворюється сигнал, що надходить до виходу OC1А (див. рис. 1).

Рис. 7. Блок виведення сигналів збігу

Керування формувачами імпульсів і одночасно налаштування виводів портів на виконання альтернативної функції здійснюється бітами COMх[1:0] регістрів TCCR0 для Т/Л0 та TCCR1A для Т/Л1. Функція цих бітів залежить від режиму роботи Т/Л (табл. 7.5 … 7.7), але у всіх режимах кодом COMх[1:0] = 00 формувач імпульсів від'єднується від виводу ОСх. Так, у нашій схемі бітами COM1А[1:0] = 00 мультиплексор D5 від'єднує формувач імпульсів від виводу МК, який виконує при цьому основну функцію – вхід або вихід порту PD.5 (див. рис. Х.Х). За встановлення хоча б одного з бітів COM1А[1:0] в одиницю, мультиплексор приєднує формувач імпульсів до виводу МК, який виконує при цьому альтернативну функцію – вихід ОС1А, природно, якщо цей вивід порту налаштований як вихід записом DDRD.5 = 1.