Лабораторная работа № 4
Цель работы: изучение организации службы времени микроконтроллера КМ1816ВЕ51, а также приобретение навыков программирования временных задержек в кодах микроконтроллера с использованием службы времени.
1. ОРГАНИЗАЦИЯ ТАЙМЕРОВ
В состав ВЕ51 входит два 16-разрядных таймера/счетчика (рис.6.1),каждый из которых состоит из двух программно-доступных регистров ТНО,ТLО (таймер О), ТН1, TL1 (таймер 1).
Рисунок 6.1 – Регистры таймеров/счетчиков
Каждый таймер/счетчик может быть запрограммирован на работу в режиме таймера - подсчета числа машинных циклов, следующих с частотой OSC/12 (обычно 1 Мгц), либо счетчика - подсчета числа переходов из Н и L на соответствующих входах Т0 и Т1. Функцией таймера/счетчика и выбором режима его работы управляет регистр TMOD (Timer/Counter Mode), формат которого приведен на рис. 6.2.
Регистр TMOD (адрес 89 в пространстве DSEG)
T1 MOD | T0 MOD | |||||||
Мнемоническое обозначение разрядов регистра | GATE | C/T | M1 | M0 | GATE | C/T | M1 | M0 |
CT0 CT1
TMOD.0 TMOD.4 M0 - младший бит поля режима
TMOD.1 TMOD.5 M1 - старший бит поля режима
TMOD.2 TMOD.6 C/T - Выбор функции: 0-таймер / 1-счетчик
TMOD.3 TMOD.7 GATE - Управление работой CT0 / CT1
Рис. 6.2. Формат регистра режимов таймеров/счетчиков
Разряд С/Т задает функцию таймера\счетчика. При С/Т = 0 таймер/счетчик работает в режиме таймера. При С/Т = 1 - в режиме счетчика. Разряды М0,М1 определяют режим работы таймера - счетчика. Каждый таймер/счетчик может работать в 4-х режимах.
В режиме 0 счетный регистр имеет длину 13 бит (см. рис.6.3.а), причем 5 младших разрядов расположены в TL, а 8 старших - в ТН. Сигнал переполнения фиксируется соответствующим флажком TF.
В режиме 1 счетный регистр иммет длину 16 разрядов. В остальном, режим не отличается от режима 0.
В режиме 2 (рис. 6.3.б) задается 8-разрядный регистр таймера/счетчика (TL), с автоматической загрузкой начального кода из ТН. Сигнал переполнения таймера/счетчика не только взводит флажок TF, но и перегружает TL содержимым ТН.
В режиме 3 работает только таймер/счетчик 0. В этом режиме два регистра СТО рассматриваются как два независимых 8-разрядных таймера/счетчика. Переполнение TLO вызывает взведение флага TFO, переполнение ТНО устанавливает флаг TFI.
Независимо от режима работы имеется возможность программного и аппаратного управления пуском/остановом счета импульса. Логика пуска/останова анализирует состояние разряда GATE в регистре ТМОD и разряда TR в регистре TCON (Timer/Counter ContrI), формат которого приведен на рис. 6.4.
Рис.6.3. Режимы работы счетчиков/таймеров
Регистр TCON (адрес 88 в пространстве DSEG)
Адрес бита в пространстве BSEG | 8F | 8E | 8D | 8C | 8B | 8A | ||
Назначение разрядов регистра | TF1 | TR1 | TF0 | TR0 |
TCON. 4 TRO - флаг программного запуска/останова СТ0
TCON. 5 TFO - флаг запроса прерывания по переполнению СТ0
TCON. 6 TRI - флаг программного запускап/останова СТ1
TCON. 7 TFI - флаг запроса прерывания по переполнению СТ1
Рис. 6.4. Формат регистра управления таймерами/счетчиками
Работа таймера/счетчика разрешается только, если взведен соответствующий разряд TR. При этом разряд GATE должен быть нулевым или на входе ~INT~ - низкий уровень. Для подачи внешних сигналов на таймеры/счетчики и логику их управления используются разряды порта 3 (см. рис.6.5).
P3 (адрес B0 в пространстве DSEG)
Адрес бита в пространстве BSEG | B7 | B6 | 8D | 8C | 8B | 8A | ||
Спец. назначение контактов порта | TF1 | TR1 | TF0 | TR0 | IE1 | IT1 | IE0 | IT0 |
Р3.2 INTO - вход запроса на прерывание О
Р3.3 INTI - вход запроса на прерывание 1
Р3.4. ТО - счетный вход таймера/счетчика О
Р3.5. Т1 - счетный вход таймера/счетчика 1
Рис. 6.5. Использование порта РЗ для подключения внешних сигналов
ЗАМЕЧАНИЕ!
Эмулятор FD51 с ошибками моделирует работу таймеров/счетчиков микроконтроллера. Для отладки программ рекомендуется использовать таймеры/счетчики в режиме 2 с программной загрузкой начального содержимого таймера в обработчике прерывания.
2. ЗАДАНИЕ ПО ЛАБОРАТОРНОЙ РАБОТЕ
Написать систему программ, которая выполняет следующие функции.
Обработчик прерывания от таймера 0 инкрементирует содержимое ячейки ADRT и загружает начальное состояние в регистр TLO.
Первая программа выполняет циклический анализ содержимого ADRT и вызывает подпрограмму вывода массива кодов в порт. Программа располагается в CSEG, начиная с адреса ADR0. Программа должна состоять из двух частей. Первая часть - инициализация системы, вторая - анализ содержимого ADRT и вызов подпрограммы.
Вторая программа - должна располагаться в памяти CSEG, начиная с адреса ADR1. Она должна при каждом обращении передавать в порт Р1 массив кодов длиной N, расположенный в CSEG, начиная с адреса ADR2.
Начальный код в таймере и константа сравнения должны быть выбраны так,чтобы вызов подпрограммы выполнялся каждые 1 мкс. Считаем, что частота OSC/12 = 1 Мгц.
Вход в систему программ по команде LCALL ADRO, расположенной в CSEG по адресу ОООН.
Варианты заданий приведены в табл.6.1.
Массив кодов должен соответствовать массиву программы 2 из лабораторной работы номер 5.
3. СОДЕРЖАНИЕ ОТЧЕТА:
- краткое описание организации службы времени;
- задание по лабораторной работе;
- текст программы с пояснениями;
- черновик выполнения работы.
4. ПРИМЕР ВЫПОЛНЕНИЯ РАБОТЫ
Написать программную систему, в которой подпрограмма вывода массива кодов вызывается каждые 1000 мкс.
Обработчик прерывания от таймера 0 инкрементирует содержимое ячейки ADRT= 50.
Первая программа выполняет циклический анализ содержимого ADRT и вызывает подпрограмму вывода массива кодов в порт. Программа располагается в CSEG, начиная с адреса О1ООН. Программа должна состоять из двух частей. Первая часть - инициализация системы, вторая - анализ содержимого ADRT и вызов подпрограммы.
Вторая программа - должна располагаться в памяти CSEG, начиная с адреса О2ООН. Она должна при каждом обращении передавать в порт Р1 массив кодов длиной 6, расположенный в CSEG, начиная с адреса О3ООН.
Вход в систему программ по команде LCALL ADRO, расположенной в CSEG по адресу ООООН.
Таблица 6.1. Варианты заданий.
Номер | ADRT | ADR0 | ADR1 | ADR2 | N | T |
1. | E | |||||
2. | 52F | 62F | F | |||
3. | 43E | 53E | D | |||
4. | 34A | 44A | C | |||
5. | B | |||||
6. | A | |||||
7. | ||||||
8. | 68A | 78A | ||||
9. | 79D | 69D | F | |||
10. | 2A | 3AF | 5AF | E | ||
11. | 2B | 5BA | 4BA | |||
12. | 2C | 4C9 | 3C9 | |||
13. | 2D | 1D8 | 2D8 | 3A1 | ||
14. | 2E | 2E4 | 1E4 | 4B2 | ||
15. | 2F | 3F5 | 7F5 | 5C2 | ||
16. | 5E6 | 6E6 | 6D2 | |||
17. | 6A1 | 5A1 | 7E2 | F | ||
18. | 7D3 | 4D3 | 1F2 | A | ||
19. | 4C8 | 3C8 | 2E2 | B | ||
20. | 36F | 26F | 3D2 | C | ||
21. | 2BE | 4BE | D | |||
22. | 1CA | 3CA | E | |||
23. | 4D3 | 2D3 | 3A2 | F | ||
24. | 3E7 | 1E7 | 4B2 | |||
25. | 6F3 | 7F3 | 5C2 | |||
26. | 3A | 4E5 | 6E5 | 6D2 | ||
27. | 3B | 6AD | 5AD | 7E4 | C |
Выберем начальную константу для таймера таким образом, чтобы прерывание от него поступало каждые 100 мкс. Так как максимальное число число в таймере 255, следовательно начальное его значение должно быть 255 - 100 = 155 = 9ВН. Для задания интервала 100 мкс. в ячейке ADRT должен декрементироваться код 10 = 0АН.
LJMP | ; Переход по включению питания | |||
NOP | ||||
NOP | ||||
NOP | ||||
NOP | ||||
NOP | ||||
NOP | ||||
NOP | ||||
000A | NOP | ; Обработчик прерывания | ||
000B | 758A9B | MOV | TL0, #9B | ; Восстановление TL0 |
000E | INC | ; Инкремент ADRT | ||
RET | I | ; Возврат из прерывания |
Основная программа
MOV | DPTR, #0300 | ; Инициализация DPTR | ||
758A9B | MOV | TL0, #9B | ; Константу в TL0 | |
MOV | TMOD, #02 | ; Режим 2 | ||
75A882 | MOV | IE, #82 | ; Разрешение прерывания | |
010C | MOV | TCON, #10 | ; Разрешение счета | |
010F | NOP | ; | ||
E550 | MOV | A,50 | ; | |
B40AFB | CJNE | A, #0A, 0110 | ; Прошло 1000 мкс? | |
MOV | 50, #00 | ; Обнуление ADRT | ||
LCALL | ; Вызов подпрограммы | |||
011B | 80F3 | SJMP | ; На проверку | |
011D | NOP |
Подпограмма пересылки кодов в Р1
LJMP | ||||
D2D3 | SETB | PSW.3 | ||
D2D4 | SETB | PSW.4 | ||
A800 | MOV | R0, #00 | ||
E8 | MOV | A, R0 | ||
MOVC | A,@A+DPTR | |||
020A | INC | R0 | ||
020B | B806F8 | CJNE | R0, #06, 0206 | |
020E | RET |