Выбери формат для чтения
Загружаем конспект в формате pdf
Это займет всего пару минут! А пока ты можешь прочитать работу в формате Word 👇
3. ПЕРИФЕРИЙНЫЕ УСТРОЙСТВА МИКРОКОНТРОЛЛЕРОВ
СЕМЕЙСТВА MCS -51
3.1. Таймеры-счетчики
Микроконтроллер 8051 содержит два таймера/счетчика (ТС): ТС0 и ТС1.
Микроконтроллер 8052 дополнительно к этим двум ТС содержит еще один, ТС2. Все ТС
могут быть запрограммированы для работы либо в качестве таймера, либо в качестве
счетчика.
Таймеры/счетчики построены на основе инкрементируемых 16-битовых регистров,
каждый из которых состоит из пары программно-доступных РСФ, соответственно: TH0,
TL0; TH1, TL1 и TH2, TL2 (8052). Причем регистры TL0-TL2 содержат младшие 8
разрядов ТС.
В режиме таймера содержимое регистра таймера/счетчика инкрементируется каждый
машинный цикл. Поскольку машинный цикл состоит из 12 периодов тактового
генератора, то скорость счета – fBQ/12, где fBQ — частота тактового генератора. В
классическом варианте счетчик работает только на суммирование, однако в современных
моделях микроконтроллерах режим счета у таймеров/счетчиков можно выбирать.
В режиме счетчика внешних событий содержимое регистра таймера/счетчика
инкрементируется при переходе из «1» в «0» сигнала на соответствующем внешнем
выводе: T0, T1 или T2 (8052). Выборка внешнего входного сигнала выполняется в фазе
S5P2 каждого машинного цикла. Переход этого сигнала из “1” в “0” фиксируется в случае,
когда выборки показывают высокий уровень сигнала в одном цикле и низкий уровень в
следующем цикле. Новое значение заносится в регистр в фазе S3P1 машинного цикла,
следующего за циклом, в котором был зафиксирован переход сигнала из «1» в «0» (т.е.
считает по отрицательным перепадам на входе). Поскольку для обнаружения этого
перехода требуется, как минимум, 2 машинных цикла, то максимальная частота счета —
fBQ/24. На коэффициент заполнения (отношение длительности импульса к его периоду)
внешнего входного сигнала ограничений нет. Однако, чтобы уровень сигнала был
гарантированно зафиксирован, он должен оставаться неизменным в течение как минимум
одного машинного цикла.
3.1.1. Таймер 0 и таймер 1
Эти таймеры/счетчики присутствуют в обоих типах микроконтроллеров, 8051 и 8052.
Функционирование в качестве таймера или счетчика выбирается управляющими битами
C/T в регистре специальных функций TMOD (рис. 1). Оба этих TC имеют четыре
рабочих режима, которые выбираются парой битов (M1, M0) в регистре TMOD. Режимы
0, 1 и 2 одинаковы для обоих TC. Режим 3 различен; причем установка режима 3 в TC0
влияет на режимы работы TC1. Наиболее часто используемые режимы — 1 и 2.
3.1.2. Режим 0 ТС
В режиме 0 любой TCx подобен таймеру микроконтроллера 8048 (8-битовый счетчик с
предделителем на 32). На рис. 2 представлена функциональная схема ТСx, поясняющая
его работу в режиме 0. В этом режиме 13-битовый регистр ТСx включает 8-битовый
регистр THx и 5 младших битов регистра TLx. Старшие 3 бита последнего не определены
и должны игнорироваться. Счет разрешен, когда бит TRx регистра TCON (см. рис. 3)
установлен в «1» и либо GATE = 0, либо INTx = 1. Установка бита GATE в «1» позволяет
использовать TC для измерения длительности импульса, поданного на внешний вывод
INTx. При переполнении TCx устанавливается флаг прерывания TFx.
3.1.3. Режим 1 ТС
Этот режим работы TC подобен режиму 0, за исключением того, что регистр
таймера/счетчика имеет разрядность 16 бит (см. рис. 4).
3.1.4. Режим 2 ТС
В этом режиме младший регистр TLx выполняет функции 8-битового счетчика с
автоматической перезагрузкой. При каждом переполнении TLx не только устанавливается
флаг TFx в регистре TCON, но и загружается содержимое THx в TLx; при этом
содержимое THx не изменяется. Логику работы TC в режиме 2 иллюстрирует рис. 5.
Назначение управляющих битов полностью соответствует режиму 0.
Временная диаграмма работы TCx в режиме 2:
где NTL — значение содержимого регистра TLx, NTH — значение содержимого регистра
THx, T и f — период и частота входных счетных импульсов соотв., TOV и fOV — период и
частота переполнения счетчика соотв., fBQ — тактовая частота кварцевого генератора.
В режиме таймера: T = Tц f = fBQ/12.
Пример:
Fosc
EQU 12000; частота генератора, кГц
Fov
EQU 1200;
TH_1
EQU (Fosc/Fov)*1000/12
частота переполнения, Гц
; Подпрограмма InitTC1
;
инициализация TC1 в режиме 2
InitTC1: MOV
MOV
MOV
SETB
RET
TMOD,#0010$0000B
TH,#TH_1
TL,#TH_1
TR1
3.1.5. Режим 3 ТС
TC1 в режиме 3 счет не производит, а просто сохраняет свое содержимое. Эффект такой
же, как при установке бита TR1 = 0. В этом режиме регистры TL0 и TH0 работают как два
независимых 8-битовых счетчика. Работа TL0 и ассоциированные с ним флаги и
управляющие биты такие же, как и при работе TC0 в режиме 0, за исключением того, что
разрядность счетчика в данном случае – 8 бит. TH0 может выполнять только функцию
таймера и использует управляющий бит TR1 и флаг TF1 таймера TC1. Логику работы TC0
в режиме 3 иллюстрирует рис. 6.
Режим 3 может использоваться в приложениях, требующих дополнительный 8-битовый
таймер или счетчик. Если TC0 используется в режиме 3, TC1 может быть
включен/выключен переводом из/в свой собственный режим 3; или может быть
использован последовательным портом в качестве генератора, задающего скорость
передачи; или — в любом приложении, не требующем прерывания.
3.2. Последовательный порт
Последовательный порт является дуплексным, что означает возможность одновременной
передачи и приема. Программный доступ к приемнику и передатчику — это
соответственно считывание из РСФ SBUF и запись в SBUF, т.е. с идентификатором SBUF
физически ассоциированы два буферных регистра: один буферный регистр приемника,
другой – передатчика. С каждым буферным регистром, в свою очередь, ассоциируется
сдвиговый регистр (программно недоступный), преобразующий последовательный код в
параллельный и наоборот. Прием и передача осуществляется «младшими разрядами
вперед» (сначала передаются младшие).
Последовательный порт может функционировать в 4-х режимах. В режиме 0
последовательный порт работает как восьмибитовый сдвиговый регистр. В режимах 1, 2 и
3 – как UART — универсальный асинхронный приемопередатчик (USART — -//-, но
может работать и в синхронном режиме). Последние режимы разнятся форматом
передаваемых/принимаемых и способом задания частоты приема/передачи.
Во всех 4-х режимах передача инициируется любой командой записи в РСФ SBUF. Прием
в режиме 0 инициируется условием: биты RI = 0 и REN = 1, где RI и REN — биты
управляющего регистра последовательного порта SCON. В остальных режимах прием
инициируется приходом старт-бита, если REN = 1.
TxD
1
RxD
RxD
RxD
TxD
2
TxD
3.2.1. Инициализация (установка параметров) последовательного
порта
Параметры последовательного порта определяются, главным образом, бит-адресуемым
РСФ SCON и частично РСФ PCON. Описание назначения битов этих регистров
представлено на соответствующих рисунках.
3.2.2. Описание режимов работы последовательного порта
Режим 0. В этом режиме последовательный порт работает как сдвиговый регистр.
Последовательные данные принимаются или передаются через вывод RXD (P3.0), а на
выводе TXD (P3.1) микроконтроллер формирует синхросигнал. Скорость приема/
передачи постоянна и составляет 1/12 частоты кварцевого резонатора МК: BR0 = FBQ/12.
Здесь на рис. 3 для вывода RXD последовательного порта в режиме передачи будут
справедливы следующие времена — Tн’ ≈ (2TBQ – 117) нс, Tsu’ ≈ (10TBQ – 133) нс, а в
режиме приема — T” = 0, Tsu” ≈ (2TBQ + 133) нс.
Режим 1. В этом режиме последовательный порт работает в формате 8-битового UART.
Через TXD передаются, а через RXD принимаются 10 бит: старт-бит (0), 8 бит данных и
стоп-бит. При приеме стоп-бит поступает в RB8 регистра SCON. Скорость
приема/передачи определяется частотой переполнения TC1 и значением бита SMOD
регистра PCON:
Максимальная скорость при FBQ = 11059,2 кГц составляет 57,6 кбит/с.
Примечание. Единицей измерения величины BR1 является бит/с или бод — количество изменений
состояния одной логической ячейки в единицу времени.
Временная диаграмма, поясняющая передачу байта в режиме UART:
Исходное состояние на линии — логическая «1» (асинхронный способ передачи). Чтобы
защититься от помех, счетчик отсчитывает половину периода и делает выборку, проверяя,
пришел ли старт-бит. Далее выборки делаются посередине битов. Стоп-бит гарантирует
последовательную передачу байтов.
Режим 2. В этом режиме последовательный порт работает в формате 9-битового UART с
постоянной скоростью. Через TXD передаются, а через RXD принимаются 11 бит: стартбит (0), 8 бит данных, программируемый 9-й бит данных и стоп-бит. Девятый бит данных
при передаче определяется битом TB8 (например, для установки паритета [четности]).
При приеме 9-ый бит поступает в RB8. Скорость приема/передачи программируется как
1/32 или 1/64 FBQ:
Режим 3. Этот режим аналогичен предыдущему за исключением скорости передачи и
отсутствию стоп-бита. Скорость приема/передачи определяется частотой переполнения
TC1 и значением бита SMOD регистра PCON: BR3 = BR1.
3.2.3. Мультипроцессорная связь
Режимы 2 и 3 имеют специальное обеспечение для мультипроцессорной связи. В этих
режимах принимается и передается 9 битов данных. При приеме девятый бит поступает в
RB8. Затем приходит стоп-бит. Порт может быть запрограммирован так, что когда
получен стоп-бит, то прерывание последовательного порта будет активизироваться только
при RB8 = «1». Эта особенность разрешается установкой бита SM2 в регистре SCON.
Использование этой особенности в МП-системах заключается в следующем. Когда
ведущий процессор хочет передать блок данных к одному из ведомых процессоров, то он,
во-первых, посылает адресный байт, который идентифицирует ведомого адресата.
Адресный байт отличается от байта данных тем, что 9-й бит = «1» в байте адреса и «0»
при байте данных. При SM2 = «1» ни один ведомый не будет прерываться байтом данных.
Адресный байт, однако, прервет все ведомые, так что каждый из них может проверить
полученный байт и увидеть: является ли он адресуемым. Адресованный подчиненный
сбросит свой SM2-бит и приготовится к приему байтов данных. Не адресованные
подчиненные устройства оставляют в том же состоянии биты SM2 и переходят к
выполнению своих задач, игнорируя поступающие байты данных.
Бит SM2 не оказывает никакого влияния в режиме 0, а в режиме 1 может быть
использован для проверки получения стоп-бита. При приеме в режиме 1, если SM2 = «1»,
прерывание приемника не будет активизировано, пока не получен действительный стопбит.
3.3. Система прерываний микроконтроллера 80C51
Микроконтроллер 80C51 имеет пять источников прерываний с двумя уровнями
приоритета. На рис. 1 представлены все источники прерываний и соответствующие им
вектора (адреса подпрограмм обработки прерываний), флаги запросов прерываний и
управляющие флаги. Порядок расположения источников прерываний на рис. 1
соответствует приоритетам прерываний внутри данного уровня; источники внешних
прерываний заключены в двойную рамку.
Вектор прерывания — одна или несколько ячеек памяти, содержащие адрес программы обработки
прерывания. Адрес вектора прерывания определяется по номеру прерывания.
INT0
P3.2
1
IT0
TCON.0
ПЕРЕПОЛНЕНИЕ
ТАЙМЕРА 0
INT1
P3.3
1
IT1
TCON.2
ПЕРЕПОЛНЕНИЕ
ТАЙМЕРА 1
Адрес
подпрограммы
Регистры
Разрешение
Общее
обработки
источника разрешение прерывания приоритета
IE0
0003H
TCON.1
EX0
PX0
IE.0
IP.0
000BH
TF0
TCON.5
ET0
PT0
IE.1
IP.1
0013H
IE1
TCON.3
EX1
PX1
IE.2
IP.2
001BH
TF1
TCON.7
RI
SCON.0
UART
TI
SCON.1
ET1
IE.3
0023H
1
ES
IE.4
EA
IE.7
Рис.1. Схема системы прерываний 80С51
PT1
IP.3
PS
IP.4
ВЫСОКИЙ
УРОВЕНЬ
ПРИОРИТЕТА
НИЗКИЙ
УРОВЕНЬ
ПРИОРИТЕТА
Последовательность
опроса флагов
3.3.1. Источники прерываний
Каждое из внешних прерываний INT0 и INT1 может быть активизировано по нулевому
уровню или по срезу. Это определяется битами IT0 и IT1 регистра TCON. Распознавание
среза имеет место, если последовательные выборки входного сигнала показывают «1» в
одном машинном цикле и «0» – в следующем цикле (т.е. определение происходит как
перепад по срезу). Флаги, которые действительно генерируют эти прерывания, – биты IE0
и IE1 регистра TCON. Если внешние прерывания активизированы по срезу, то флаги
запроса прерываний IE0 и IE1 сбрасываются аппаратно при вызове соответствующей
подпрограммы обработки прерывания. В противном случае, когда прерывание
активизировано по уровню, запрос прерывания должен деактивизироваться до окончания
подпрограммы обработки прерывания. Отметим, что внешние сигналы INT0 и INT1
имеют отношение как к таймерам, так и к запросам прерываний.
Прерывания от TC0 и TC1 генерируются единичными битами TF0 и TF1 регистра TCON,
которые устанавливаются при переполнении соответствующих таймеров/счетчиков. Флаг,
вызвавший прерывание, сбрасывается аппаратно при вызове подпрограммы обработки
прерывания.
Прерывание последовательного порта генерируется по схеме ИЛИ флагов RI и TI. При
вызове подпрограммы обработки прерывания ни один из флагов не сбрасывается
аппаратно. Обычно подпрограмма, обслуживающая прерывание, должна определить
каким флагом вызвано прерывание, и сбросить этот флаг. Т.е. в данном случае флаги
запроса прерывания должны сбрасываться программно.
ПДП (DMA — Direct Memory Access) — прямой доступ к памяти.
Исходно, после сброса микроконтроллера, все прерывания запрещены. Все биты,
генерирующие прерывания, могут быть сброшены или установлены программно с тем же
результатом, как если бы они были установлены или сброшены аппаратно. Т.е.
программно можно сгенерировать прерывание или отменить отложенное прерывание.
основная программа
(бесконечный цикл)
возвращение в
основную программу
ISR
точки вызова
подпрограммобработчиков
прерывания
подпрограмма обработки
прерывания
запрос
прерывания
ISR
вложенные прерывания
(по приоритету)
Рис. 2. Иллюстрация работы системы прерываний микроконтроллера
Каждый из источников прерываний можно индивидуально разрешить или запретить
установкой или сбросом соответствующего бита в РСФ IE, допускающего побитовую
адресацию. Этот регистр (см. рис. 3) также содержит бит глобального запрета прерываний
EA, который запрещает все прерывания сразу, если EA = «0». Обработчики прерываний
не могут находиться на произвольном месте.
3.3.2. Структура приоритетов прерываний
Каждому источнику прерывания индивидуально может быть назначен один из двух
уровней приоритета. Уровни приоритета прерываний определяются регистром
специальных функций с побитовой адресацией IP, назначение разрядов которого
описывается на рис. 4. Нулевое значение бита – это низкий приоритет, а единичное
значение – высокий приоритет соответствующего прерывания. Стартовавшее
низкоуровневое прерывание может быть прервано только высокоуровневым
прерыванием, но не другим низкоуровневым прерыванием. Стартовавшее
высокоуровневое прерывание не может быть прервано никаким другим источником
прерывания. Если одновременно поступают два запроса прерываний с разным
приоритетом, обслуживаться будет запрос прерывания более высокого уровня. Когда
одновременно поступают запросы с одинаковым приоритетом, то внутренняя
последовательность опроса определяет обслуживаемый запрос. Следовательно, внутри
каждого уровня приоритета имеется вторая структура приоритета, определяемая
последовательностью опроса. Последняя отображена на рис. 1 соответствующим
порядком расположения источников прерываний. Структура приоритета внутри уровня
используется только при одновременном поступлении запросов прерываний с
одинаковым уровнем приоритета.
3.3.3. Как обрабатываются прерывания
Флаги запросов прерываний выбираются в фазе S5P2 каждого машинного цикла. Выборки
опрашиваются в следующем машинном цикле. Система прерываний, обнаружив при
очередном опросе какой-либо установленный флаг прерывания, аппаратно сформирует
выполнение команды LCALL для вызова соответствующей подпрограммы обработки
прерывания. Выполнение блокируется (задерживается) одним из следующих условий:
o стартовало прерывание равного или более высокого уровня приоритета;
o текущий машинный цикл не является последним циклом выполняемой команды;
o текущая команда — это RETI или любая команда доступа к регистру IP или IE.
Второе условие гарантирует, что никакой запрос прерывания не будет обслуживаться,
пока не завершится выполнение текущей команды. Последнее условие обеспечивает
выполнение после окончания одной из вышеуказанных команд, по крайней мере, еще
одной команды перед вызовом подпрограммы обработки прерывания. Отметим, что флаг
прерывания, установленный во время блокировки LCALL и сброшенный до ее снятия, не
вызовет прерывания (Факт, что флаг прерывания был однажды активен, но не обслужен
не запоминается. Каждый цикл опроса новый).
При выполнении команды LCALL содержимое программного счетчика сохраняется в
стеке (сначала младший байт), а затем в программный счетчик загружается адрес
подпрограммы обработки прерывания, зависящий от источника прерывания (см. рис. 1).
Заметим, что если высокоуровневый запрос прерывания становится активным во время аппаратного вызова
подпрограммы обслуживания, а именно в фазе S5P2 1-го цикла аппаратной команды LCALL, то по
окончании процедуры текущего вызова сразу же начнет выполняться процедура аппаратного вызова
поступившего высокоуровневого запроса. Аппаратный вызов LCALL также может сбрасывать флаги
запроса прерывания (см. выше).
Подпрограмма обслуживания прерывания обязательно должна завершаться командой
RETI. Эта команда извлекает из верхушки стека два байта и загружает их в программный
счетчик – выполнение программы продолжается с места, где она была прервана. Кроме
того, RETI снимает запрет на прерывания с уровнем приоритета, равным уровню
приоритета обслуживаемого прерывания. Этот запрет устанавливается аппаратно при
переходе по вектору на подпрограмму обслуживания прерывания.
Диаграмма временной реакции прерывания:
C0/S5P2
Выборка запроса
прерывания
C1
Опрос флага
прерывания
C2 C3
LCALL
C4
Старт подпрограммы обработки
прерывания
3.3.4. Пошаговое выполнение
Структура прерывания 80C51 допускает пошаговое выполнение с очень небольшими
программными затратами. На запрос прерывания реакции не будет, пока прерывание
равного приоритета находится в обработке, или не будет выполнена хотя бы одна команда
после RETI. Таким образом, если подпрограмма обработки прерывания стартовала, она не
может быть перезапущена до тех пор, пока не выполнится одна команда прерванной
программы после выполнения RETI. Один из путей использования этой особенности —
организация пошагового режима.
Например, можно запрограммировать одно из внешних прерываний, скажем INT0, на
активизацию по уровню:
JNB P3.2,$
; Ожидание, когда INT0 станет высоким
JB
; Ожидание, когда INT0 станет низким
p3.2,$
RETI
P3.2
3.3.5. Написание подпрограмм обработки прерываний
Обобщенная схема подпрограмм обработки прерываний:
Такие подпрограммы называются ISR (interrupt service routine) — стандартная
подпрограмма обслуживания прерываний или interrupt handler подпрограмма обработки
(обработчик) прерываний.
Vector: LJMP SubrVector
Запоминание регистров в стеке
Тело
Восстановление регистров из стека
RETI
; дополнительно восстанавливает
; логику приоритетов прерываний
Здесь Vector — адрес, соответствующий запросу прерывания, но непосредственно данной
метки в явном виде не существует; SubVector — подпрограмма обработчика прерывания
на новом адресе.
Поскольку с каждым источником прерывания связан конкретный вектор (адрес)
прерывания, то обработчик прерывания необходимо расположить, начиная с этого адреса.
Как это сделать? Вариантов есть несколько. Рассмотрим два основных.
Во-первых, в главном модуле можно зафиксировать вектора обработчиков прерываний
следующим образом:
extrn code (ISR_INT0, ISR_TC0)
cseg at 0
ljmp startup
; переход к инициализации
org 0003h
ljmp ISR_INT0
org
ljmp
...
...
; Сами обработчики находятся в другом
; модуле
000Bh
ISR_TC0
startup:
Второй способ предполагает использование директивы задания абсолютного сегмента в
кодовой памяти CSEG:
?PR?INT0
CSEG
AT
0003h
LJMP
ISR_INT0
segment code
rseg ?PR?INT0
using 1
; необязательный элемент (переключает
;
ISR_INT0:
...
банки)
; начало обработчика прерывания
...
...
RETI
; конец обработчика прерывания
Последний вариант представляется предпочтительным, т.к. объявление как абсолютного
сегмента, так и перемещаемого находятся в одном модуле-файле, предназначенным для
описания обработчика прерывания. Там же могут размещаться все другие необходимые
декларации, имеющие отношение к выполняемой модулем функции. То есть, это
соответствует концепции модульного программирования.
3.3.6. Взаимодействие программ
Подпрограммы обработки прерываний обычно не являются полностью независимыми от
основной программы, т.е. между ними имеет место взаимодействие. Примером такого
взаимодействия является обращение к общим ресурсам (памяти, периферийным
устройствам). Пример другого типа взаимодействия — задержка на запрос прерывания изза временного запрета прерывания или выполнения прерывания такого же или более
высокого уровня приоритета.
Пример:
Допустим, что реализованы «часы» с использованием прерывания таймера. В переменных
Hi и Lo храниться текущее время в единицах переполнения таймера. Пусть основная
(фоновая программа) считывает Hi = 0. Сразу после этого
Hi Lo
считывания генерируется прерывание, которое добавляет 1
00 ffh до прерывания
к шестнадцатиразрядной переменной Hi-Lo. После
01 00 после прерывания окончания прерывания основная программа продолжит
считывание второго байта, в результате считает Lo = 00. Общий результат считывания
составит 00 00. Заметим, что проблема отсутствует, если выполняется одна команда
чтения, т.е. считываемая переменная однобайтовая.
Для решения отмеченной проблемы следует до окончания обращения одной
подпрограммы к общим переменным исключить возможность обращения к ним другой
подпрограммы. Этот подход называется принципом взаимного исключения. Область
программы, в которой должен соблюдаться этот принцип, называется критической
областью [Морисита].
Наиболее простая реализация этого принципа — запрещение прерываний перед входом в
критическую область и разрешение его сразу после выхода из этой области.
Отрицательное действие — увеличение времени реакции на прерывание.
Второй способ реализации принципа взаимного исключения основан на применении
специального флага (переменной), называемого «семафором». Для каждого взаимного
исключения используется свой «семафор». Часто между выполняемыми действиями
подпрограмм (программ) требуется установить определенную связь. Этот процесс
называется синхронизацией, которую можно реализовать с помощью «семафора».
А
Нет
Данные
готовы?
Нет
Да
Данные
считаны?
Да
Запись в буфер
Взвести
флаг
Считать данные
Взвести флаг «данные
считаны»
B