Добавил:
Опубликованный материал нарушает ваши авторские права? Сообщите нам.
Вуз: Предмет: Файл:

Дмитриев Универсалный лабораторный стенд. Аппаратные средства проектирования встраиваемых систем 2009

.pdf
Скачиваний:
62
Добавлен:
17.08.2013
Размер:
10.11 Mб
Скачать

ратора. При работе в качестве счетчика внешних событий на входах Т0 и Т1 по спаду 1/0 максимальная частота таких изменений не должна превышать 1/24 частоты внешнего генератора. Для гарантированного прочтения сигналов «0» и «1» на входах Т0 и Т1 время их удержания должно быть не меньше одного машинного цикла.

Таймеры Т0 и Т1 могут работать в одном из следующих четырех режимов: 0, 1, 2 и 3. В режимах 0, 1 и 2 таймеры Т0 и Т1 полностью идентичны. В режиме 3 таймер Т1 хранит свое состояние, а таймер Т0 работает как два независимых таймера. Выбор функции таймера (таймер или счетчик событий) и режима его работы определяется программно при помощи регистра TMOD (см. гл. 2).

Режимы 0 и 1. Структурная схема таймеров Т0 и Т1 для данных режимов приведена на рис. 3.15.

Рис. 3.15. Структурная схема таймера Т0 для режимов 0 и 1

В режиме 0 регистр TL0 используется как 5-разрядный предделитель (используются 5 младших разрядов, 3 старших игнорируются). В этом случае таймер конфигурируется как 13-разрядный двоичный счетчик. При переполнении этого счетчика устанавливается

81

флаг TF0 и вырабатывается прерывание, если оно разрешено. Из структурной схемы видно, что разрешение выполнения функции таймера обеспечивается следующими установками: С/Т = 0 и Gate = 0 (регистр TMOD) и TR=1 (регистр TCON). Для измерения временного интервала (длительности единичного значения сигнала) по входу INT0 необходимо установить С/Т = 0 и Gate = 1 (регистр TMOD) и TR = 1 (регистр TCON). Для подсчета числа внешних событий по входу Т0 необходимо установить С/Т = 1 и Gate = 0 (регистр TMOD) и TR = 1 (регистр TCON).

Режим 1 идентичен режиму 0, а единственным отличием является использование всех 8 бит регистра TL0. В этом режиме таймер конфигурируется как 16-разрядный счетчик.

В режиме 2 таймер конфигурируется как 8-разрядный счетчик на основе регистра TL0 (рис. 3.16). При переполнении TL0 происходит не только установка флага TF0, но и автоматическая перезагрузка TL0 содержимым регистра TH0. При перезаписи в TL0 значение TH0 не изменяется. Данный режим используется при необходимости формирования периодических сигналов требуемой

Рис. 3.16. Структурная схема таймера Т0 для режима 2

82

частоты, например, для управления скоростью передачи UART микроконтроллера.

В режиме 3 таймер Т1 отключен и регистры TL1 и TH1 сохраняют свое состояние. На рис. 3.17 представлена структурная схема таймера Т0 в режиме 3. Таймер Т0 представляет совокупность двух устройств: таймера/счетчика событий на основе регистра TL0 и таймера на основе регистра TH0, причем последний использует биты TR1 для разрешения работы и TF1 в качестве флага переполнения. Таймер Т1 при этом может использоваться для применений, не требующих использования прерываний. Примером такого использования является управление скоростью обмена передачей последовательного порта (UART) микроконтроллера. Таким образом, режим 3 выбирается при необходимости использования в составе МК третьего дополнительного 8-разрядного таймера.

Рис. 3.17. Структурная схема таймера Т0 для режима 3

83

Рассмотрим некоторые примеры использования таймеров Т0 и Т1. Одной из задач контроля состояния внешнего объекта может является подсчет происходящих в нем событий. Допустим, что требуется при помощи таймера Т0 осуществлять подсчет событий, которые фиксируются на входе Т0 микроконтроллера по следующему правилу: после фиксации 10 событий на указанном входе инкрементируется внутренний программный счетчик, содержимое которого выводится через порт Р4 на светодиодные шкалы А и В для индикации. Так как в УЛС вход Т0 микроконтроллера подключен к ПЛИС, то в ней и должно быть реализовано устройство для генерации внешних событий. На рис. 3.18 приведен пример такого устройства. При нажатии кнопки ГОИ2 устройство вырабатывает импульсный единичный сигнал длительностью 16 периодов тактового генератора. ГОИ1 в этой схеме работает в непрерывном режиме.

Рис. 3.18. Схема устройства для генерации внешнего сигнала таймера Т0

84

Ниже приведен текст программы для реализации подсчета внешних событий и выдачи его результата на индикацию.

ORG8000h

 

LJMPSTART

 

;---------------------------

обработчик прерывания при переполнении таймера Т0

ORG800Bh

 

INC R0

;увеличение программного счетчика

MOV A,R0

 

SWAP A

 

MOV 0C0h,A

;вывод программного счетчика в порт Р4

CLR TF0

;сброс флага переполнения таймера Т0

RETI

 

START: MOV R0,#00h ;сброс программного счетчика

CLR TF0

;сброс флага переполнения таймера Т0

CLR TR0

;сброс бита разрешения работы таймера Т0

MOV IE,#82h

;разрешение прерывания при переполнении

 

;таймера Т0

MOV TMOD,#06

;Т0 счетчик внешних событий, режим 2

MOV TL0,#0FВh

 

MOV TH0,#0FВh

 

SETB TR0

;установка бита разрешения таймера Т0

LJMP $

 

END

 

Из текста программы видно, что таймер Т0 конфигурируется для работы в качестве счетчика событий в режиме 2. При работе в этом режиме при смене в TL0 значения с FFh на 00h и выработке флага переполнения TF0, происходит автоматическая перезапись в TL0 значения F6h из регистра TH0. Таким образом, значения в регистре TL0 изменяются в следующем порядке: F6 – F7 – F8 – F9 – FA – FB – FC – FD – FE – FF – F6 – … . Очевидно, что переполне-

ние таймера, а следовательно, и разрешенное от него прерывание, возникают каждый раз после фиксирования группы из 10 событий на входе Т0. Таким образом, количество событий в группе определяется значением константы, записанной регистр TH0. При осуществлении контроля внешних событий путем их подсчета по какомулибо сложному закону, требуется реализовать в программе соответствующий порядок изменения значения TH0.

Следующий пример демонстрирует использование таймера Т0 для измерения длительности сигнала единичного уровня на входе

85

INT0 микроконтроллера. Данный вход подключен к ПЛИС. На рис. 3.19 приведена схема устройства для формирования сигнала единичного уровня на этом входе.

Рис. 3.19. Схема формирования сигнала единичного уровня на входе INT0

Единичный уровень формируется установкой тумблера «0» клавишного регистра Р1. Состояние линии INT0 контролируется светодиодным индикатором «0» шкалы Е. Ниже приведен текст программы для измерения временных интервалов длительностью до 78 минут. Для подсчета длительности используется программный счетчик на основе регистра-указателя DPTR с выводом на индикацию регистра DPH. При выбранных настройках таймера Т0 единица младшего разряда этого регистра соответствует временному интервалу 18,2 с.

86

ORG8000h

 

LJMPSTART

 

;-------------------------------------

обработчик прерывания при переполнении

таймера Т0

 

ORG800Bh

 

CLR TF0

;сброс флага переполнения таймера Т0

INC DPTR

;увеличение программного счетчика

MOV A,DPH

 

SWAP A

 

MOV 0C0h,A

;вывод старшего байта программного счетчика

RETI

;на индикацию

 

START:

 

MOV IE,#82h

;разрешение прерывания при переполнении

 

;таймера Т0

MOV DPTR,#0000h

;сброс программного счетчика

CLR TR0

;сброс бита разрешения таймера Т0

CLR TF0

;сброс флага переполнения таймера Т0

MOV TL0, #00h

 

MOV TH0, #00h

;Т0 таймер в режиме 1 с запуском по

MOV TMOD,#09h

 

;единичному значению на входе INT0

SETB TR0

;разрешение работы таймера Т0

LJMP $

 

END

 

При решении задач контроля и управления при помощи МК возникает необходимость измерения временных интервалов между внешними событиями, например, фиксируемыми по входам внешних прерываний INT0 и INT1, или отсчета времени между программными событиями, например при достижении определенного значения в регистре или формировании истинного значения заданного логического условия. В этом случае каждому рассматриваемому событию должна быть сопоставлена метка времени. Метки времени событий могут формироваться как результат чтения таймера Т0 двумя способами. Первый из них реализуется временным отключением таймера или его приостановом для последующего чтения и повторного разрешения счета. Второй способ не предусматривает приостанова таймера и его опрос осуществляется «на лету». В первом случае из-за приостанова может накапливаться ошибка, если событиям требуется сопоставлять абсолютные значения, измеренные в единицах времени. При измерении относитель-

87

ных значений может быть введена поправка с учетом времени выполнения команд приостанова, чтения регистров таймера Т0 и его повторного запуска.

При выполнении чтения «на лету» проявляется специфика организации счетчика таймера Т0 в режимах 0 и 1 (13или 16-разрядного счетчика на основе двух последовательно соединенных регистров TL0 и TН0). Пусть опрос таймера Т0 выполняется путем двух последовательных пересылок значений регистров TL0 и TH0 в регистры общего назначения, например в R0 и R1 соответственно. Метка времени события в этом случае должна формироваться как совокупность значений регистров TL0 и TH0 во втором машинном цикле выполнения команды пересылки значения регистра TL0 в регистр R0. Так как таймер Т0 работает без приостанова, то есть «на лету», то после чтения TL0 и перед чтением регистра TH0 может возникнуть переполнение TL0. В результате переполнения значение, считанное в R1, не будет соответствовать значению TH0 во втором машинном цикле выполнения команды пересылки значения регистра TL0 в регистр R0, как требует условие формирования метки времени события. Поэтому будет получен неправильный результат. Следовательно, необходимо предусмотреть меры по обнаружению таких ситуаций и коррекции значения регистра R1. Этого можно добиться путем выполнения программы, в которой регистры таймера Т0 читаются в таком порядке: TL0, TН0 и снова TL0. В качестве примера рассмотрим следующую последовательность команд:

MOVR0,TL0;команда 1

MOVR1,TH0;команда 2

MOVR2,TL0;команда 3

На рис. 3.20 представлена временная диаграмма выполнения этой последовательности команд с точностью до машинного цикла для 6 различных ситуаций, связанных с возникновением переполнений TL0 во время выполнения данной последовательности команд.

В таблице 3.1 приведены значения регистров TL0 и TН0 в машинных циклах (i-1) и (i+1), а также значения регистров R0, R1 и R2 после выполнения последовательности команд чтения для всех возможных ситуаций, приведенных на рис. 3.20.

88

Рис. 3.20. Временная диаграмма различных вариантов переполнения регистра TL0 при выполнении последовательности команд чтения

Таблица 3.1

Значения регистров TL0 и TН0 и результатов их пересылки

в регистры R0, R1 и R2

TH0 (i-1)

TL0(i-1)

TH0(i+1)

R0

R1

R2

п/п

1

XYh

FFh

(XY+1)mod256h

01

(XY+1)mod256h

05

2

XYh

FEh

(XY+1)mod256h

00

(XY+1)mod256h

04

3

XYh

FDh

XYh

FFh

(XY+1)mod256h

03

4

XYh

FCh

XYh

FEh

(XY+1)mod256h

02

5

XYh

FBh

XYh

FDh

XYh

01

6

XYh

FAh

XYh

FCh

XYh

00

Примечание: X и Y – произвольные символы шестнадцатеричного алфавита.

Момент времени опроса таймера Т0 при формировании метки времени соответствует машинному циклу (i+1). Значение TL0 в этом цикле соответствует значению регистра R0 после выполнения команды 1. В столбце TH0(i+1) приведены значения этого регистра

89

в данном машинном цикле. Из таблицы видно, что только в случаях 3 и 4 результат чтения регистра TH0, определяемый значением R1, отличается от истинного значения TH0 в машинном цикле (i+1). Это связано с тем, что переполнение TL0 возникло после окончания цикла команды 1, но до окончания цикла команды 2. Как видно из таблицы, для выявления ситуаций 3 и 4 необходимо просто анализировать значение регистра R2. Коррекция R1 путем его уменьшения на 1 выполняется только в том случае, если значение R2 составляет 2 или 3.

Рис. 3.21. Блок схема алгоритма обнаружения переполнения таймера Т0 и коррекции результата формирования метки времени события

На рис. 3.21 приведен алгоритм коррекции значения регистра R1 для получения правильного результата формирования метки времени события. Ниже приведена программа выполнения данного алгоритма.

90

Соседние файлы в предмете Интегрированные системы управления и проектирования