Каталог файлов

Главная » Все файлы » Книги по электронике (Электронная библиотека)

Выберите файл!!!


ПРОГРАММИРУЕМ МИКРОКОНТРОЛЛЕРЫ Z8 М.Гладштейн г.Рыбинск Часть 7. Программирование функций таймеров/счетчиков
17.12.2009, 01:29
загрузка...
ПРОГРАММИРУЕМ МИКРОКОНТРОЛЛЕРЫ Z8
М.Гладштейн г.Рыбинск
Часть 7. Программирование функций таймеров/счетчиков
Микроконтроллеры (МК) Z8 располагают одним или двумя тайме¬рами/счетчиками T0 и T1, которые приспособлены для различных при¬менений и позволяют разгрузить программное обеспечение от решения целого ряда задач, включающих:
- отсчет времени задержки;
- обслуживание часов и календаря;
- сторожевой таймер;
- счет внешних событий;
- генерирование импульсных последовательностей;
- измерение продолжительности внешних событий;
- автоматическая задержка после обнаружения внешнего собы¬тия.
Каждый таймер/счетчик управляется отдельным 6-битным предде¬лителем, который синхронизируется частотой внутренней синхрониза¬ции, деленной на 4 [1]. Для таймера/счетчика T1, кроме того, внутренняя синхронизация может стробироваться или запускаться внешним событием или может быть заменена синхронизацией с внешне¬го входа. Каждый таймер/счетчик может работать как в однопроход¬ном, так и в циклическом режимах, где, соответственно, счет либо останавливается по достижению таймером/счетчиком конца счета, ли¬бо таймер/счетчик перезагружается, и счет продолжается. Регистры таймера/счетчика и предделителя могут изменяться отдельно в про¬цессе счета, при этом программно управляется момент загрузки но-вого значения: немедленно или по достижению таймером/счетчиком конца отсчета.
Несмотря на то, что регистры предделителей предназначены только для записи, существует технология, с помощью которой тай¬мер/счетчик может моделировать чтение предделителя. Это свойство требуется для высокоточных измерений длительности внешних собы¬тий. Такой подход к использованию таймеров/счетчиков требует, чтобы один таймер/счетчик был бы инициализирован желаемыми значе¬ниями для счетчика и предделителя. Второй таймер/счетчик должен быть запрограммирован для работы в циклическом режиме. Оба тайме¬ра/счетчика управляются от внутренней синхронизации, запускаются
и останавливаются одновременно. Поскольку они при этом работают
синхронно, то значение, считываемое со второго счетчика, всегда
будет эквивалентно значению предделителя первого.
7.1. Вычисление интервала времени таймера
Для определения временного интервала I до конца отсчета используется равенство:
I = T x P x V ,
характеризующее соотношение между начальными значениями преддели¬теля P, счетчика V и периодом синхронизации T, равным 1/(XTAL/8). Здесь учитывается наличие в схеме таймера/счетчика делителя на 4 и деление на 2 частоты задающего генератора XTAL схемой синхронизации в стандартном режиме.
Значение P может быть в диапазоне 1...64, а значение V - в диапазоне 1...256. Когда программируются регистры предделителя и счетчика, максимальное загружаемое значение ограничивается их разрядностью в 6 и 8 бит соответственно, причем максимальные зна¬чения (64 и 256) соответствуют нулевым кодам. На входной частоте синхронизации 8 МГц, допустимый диапазон отсчета интервала време¬ни составит:
1мкс11  I  1мкс64256
1мкс  I  16,384мс
Для определения размера отсчета N до переполнения T1 при внешней синхронизации можно использовать выражение
N = P x V,
где: P - начальное значение предделителя PRE1,
V - начальное значение счетчика T1.
Диапазон отсчета составит
1  N  16384.
7.2. Режимы выхода TOUT
Вывод P36 может быть запрограммирован как выход TOUT, на ко¬торый выводится выход таймера T0, таймера T1 или внутренняя синх¬ронизация TCLK. Когда выход TOUT управляется с выходов T0 или T1, они подключаются к нему через триггер, работающий в счетном режи¬ме [1], что приводит к делению выходной частоты таймера на 2. Кроме того, когда программируется соответствующий бит в регистре TMR, выход TOUT всегда устанавливается в 1. Когда выход TOUT уп¬равляется сигналами внутренней синхронизации TCLK, то они посту¬пают прямо на выход P36.
Когда P36 запрограммирован как выход TOUT, запись в бит 6 регистра P3 (03Н) не изменяет состояние вывода, однако его теку¬щее значение может быть проверено МК путем чтения регистра порта P3.
7.3. Режимы входа TIN
Вывод Р31 может быть запрограммирован как вход TIN, который используется таймером T1 в следующих четырех режимах:
- режим внешней синхронизации;
- режим стробирования внутренней синхронизации;
- режим однократного запуска внутренней синхронизации;
- режим перезапуска внутренней синхронизации.
Для последних двух режимов необходимо отметить, что наличие синхронизирующей схемы в МК приводит к задержке на 2-3 периода внутренней синхронизации между фронтом запускающего сигнала и действительным началом счета таймера/счетчика.
Каждый переход уровня сигнала на входе TIN из 1 в 0 (от вы¬сокого уровня к низкому) будет генерировать запрос прерывания IRQ2, независимо от выбранного режима или разрешения/запрещения счета T1. В соответствии с требованиями прикладной задачи это прерывание должно быть разрешено или замаскировано.
Режим внешней синхронизации поддерживает счет числа внешних событий, где под событием подразумевается переход сигнала от вы¬сокого уровня к низкому на входе TIN. Запрос прерывания IRQ5 бу¬дет генерироваться после появления N событий (однопроходный ре¬жим) или на каждые N событий (циклический режим).
Режим стробирования внутренней синхронизации обеспечивает измерение длительности внешнего события. В этом режиме тай¬мер/счетчик T1 управляется частотой внутренней синхронизации, де¬ленной на 4. Частота стробируется высоким уровнем на входе TIN. Иначе говоря, T1 считает импульсы внутренней синхронизации, пока вход TIN имеет высокий уровень сигнала, и прекращает счет, когда уровень сигнала становится низким. Запрос прерывания IRQ2 генери¬руется при изменении сигнала TIN от высокого уровня к низкому. Если T1 достигает конца отсчета , генерируется запрос прерывания IRQ5. Если IRQ5 генерируется в этом режиме раньше IRQ2, то это будет свидетельствовать о том, что длина входного импульса слиш¬ком велика для измерения в однопроходном режиме.
Режим однократного запуска по сигналу TIN обеспечивает авто¬матическую задержку после наступления внешнего события. В этом режиме T1 загружается и начинает отсчет внутренних синхросигналов после первого перехода сигнала от высокого уровня к низкому на входе TIN после разрешения работы T1. Последующие переходы на входе TIN не влияют на работу T1. В однопроходном режиме, после достижения T1 конца отсчета бит разрешения счета T1 сбрасывается. Последующие переходы на входе TIN не будут оказывать на тай¬мер/счетчик никакого влияния, пока программно не будет вновь ус¬тановлен бит разрешения счета T1. В циклическом режиме, при достижении таймером/счетчиком конца отсчета, бит разрешения счета не сбрасывается, T1 автоматически перезагружается и счет продол¬жается. Каждый раз, как T1 достигает конца отсчета, будет генери¬роваться запрос прерывания IRQ5, пока программа на сбросит бит разрешения счета T1. Такой режим может быть использован, напри¬мер, для задержки на время перевода строки в принтере, после об¬наружения конца строки, или для задержки выборки данных на опре¬деленное время после строба выборки.
Режим перезапуска по сигналу TIN будет обеспечивать загрузку и запуск счета T1 всякий раз при обнаружении перехода уровня сиг¬нала с высокого на низкий. T1 переполнится и сгенерирует запрос
прерывания IRQ5, когда запрограммированный в нем интервал времени
(определяется начальными значениями предделителя и счетчика) ис¬течет после последнего перехода из 1 в 0 на входе TIN. В однопро¬ходном режиме, бит разрешения счета при этом будет сброшен и дальнейшие изменения на входе TIN не будут влиять на состояние таймера/счетчика T1 до тех пор, пока бит разрешения счета не бу¬дет программно установлен. В циклическом режиме, достижение T1 конца отсчета не сбрасывает бит разрешения счета, поэтому тай¬мер/счетчик перезагружается и счет продолжается. Запрос прерыва¬ния IRQ5 будет генерироваться всякий раз, как T1 достигает конца отсчета, пока программа не сбросит бит разрешения счета. Этот ре¬жим может использоваться как сторожевой таймер внешних событий, например, можно фиксировать останов ленты конвейера, пропадание импульсов синхронизации, превышение интервала времени ввода с клавиатуры и т.п.
7.4. Примеры использования таймеров
В последующих примерах дано несколько возможных применений таймеров/счетчиков.
Синхронизация часов
Этот пример иллюстрирует обслуживание часов, которые поддер¬живают двоичный формат часов, минут, секунд и сотых долей секунд. Необходимо обновлять содержимое часов каждую сотую долю секунды, поэтому T1 программируется в циклический режим для формирования прерывания 100 раз в секунду. В этом примере использован тай¬мер/счетчик T1, однако T0 также подходит для решения этой задачи.
Ниже приведен фрагмент программы, который содержит определе¬ние вектора прерывания IRQ5 (IRQ_5), подпрограмму инициализации таймера/счетчика T1 (TOD_INT) и подпрограмму обслуживания преры¬вания (TOD), которая обновляет содержимое часов. При этом полага¬ется, что частота XTAL=7.3728 МГц и включен режим деления на 2 частоты генератора.
; Пример обслуживания часов
; Размещение элементов времени в регистрах
HOUR .EQU R12 ; часы
MINUTE .EQU R13 ; минуты
SECOND .EQU R14 ; секунды
HUND .EQU R15 ; десятые доли секунд
; Определение вектора прерывания
.ORG 10
IRQ_5: .WORD TOD
.ORG 000CH
; Подпрограмма инициализации таймера
TOD_INT:
LD PRE1, #10010011 B
; Биты D7-D2 PRE1=36
; Бит D1 - внутренняя синхронизация
; Бит D0 - циклический режим T1
LD T1, #00H ; Пересчет на 256 - период 1/100 сек
OR TMR, #0CH ; Загрузить и разрешить счет T1
DI
OR IMR, #20H ; Разрешить прерывание IRQ5
EI
; Подпрограмма обслуживания прерывания
TOD:
PUSH RP
SRP #10H ; Рабочая группа 1 содержит
; регистры времени
INC HUND ; Инкремент сотых долей секунды
CP HUND, #64H ; Есть уже целая секунда ?
JR NE, TOD_EXIT ; Если нет, то закончить
CLR HUND ; Обнулить сотые доли секунды
INC SECOND ; Инкрементировать секунды
CP SECOND, #3CH ; Есть уже целая минута ?
JR NE, TOD_EXIT ; Если нет, то закончить
CLR SECOND ; Обнулить секунды
INC MINUTE ; Инкрементировать минуты
CP MINUTE, #3CH ; Есть уже целый час ?
JR NE, TOD_EXIT ; Если нет, то закончить
CLR MINUTE ; Обнулить минуты
INC HOUR ; Инкрементировать часы
CP HOUR, #18H ; Есть уже сутки ?
JR NE, TOD_EXIT ; Если нет, то закончить
CLR HOUR ; Обнулить часы
TOD_EXIT:
POP RP ; Восстановить RP
IRET
.END
Выход импульсов переменной частоты и переменной длины
Следующий пример иллюстрирует использование выхода TOUT. Пусть необходимо сгенерировать импульсную последовательность с коэффициентом заполнения 10%, где положительный импульс имеет длительность 1.6 мс, а пауза - 14.4 мс. Для выполнения этого, вы¬ход TOUT должен управляться таймером/счетчиком T1, хотя с таким же успехом можно использовать T0. Этот пример основан на исполь¬зовании свойства МК, допускающего изменение содержимого регистров счетчиков без нарушения процесса счета. В циклическом режиме но¬вое значение загружается, когда таймер/счетчик достигает конца счета. Сначала T1 загружается и счет разрешается со значением, формирующим короткий интервал. Затем регистр счетчика модифициру-ется значением для генерации длинного интервала. Это значение загрузится в счетчик автоматически, когда T1 достигнет конца сче¬та. Выбранное значение предделителя должно должно быть одинаковым для обоих интервалов. Необходимо отметить, что начальная загрузка счетчика T1 вызывается установкой загрузочного бита T1 в управля¬ющем регистре TMR (F1H) и это действие приводит к выставлению уровня логической единицы на выходе TOUT. Каждое последующее из¬менение регистра счетчика T1 не влияет на текущий уровень на вы-
ходе TOUT, до тех пор, пока загрузочный бит T1 не будет изменен
программой. Новое значение загружается по концу отсчета и выход
TOUT переключится в этот момент. Подпрограмма обслуживания преры¬вания таймера T1 просто изменяет значение в регистре счетчика на новое, заменяя значение короткого или длинного интервала на про¬тивоположное.
В нижеприведенном примере, бит D0 в регистре 04Н использован как флаг программы, показывающий, какое из значений было загруже¬но последним. В эту программу включены: подпрограмма инициализа¬ции (PULSE_INT), подпрограмма обслуживания прерывания (PULSE) и определение вектора прерывания от T1 (IRQ_5). При этом полагает¬ся, что частота генератора XTAL=8 МГц и использован режим деления частоты генератора на 2.
; Пример генерирования импульсной последовательности
.ORG 000AH
IRQ_5: .WORD PULSE
.ORG 000CH
; Подпрограмма инициализации
PULSE_INT:
LD PRE1,#00000011B ; Модуль деления предделителя 64,
; синхронизация внутренняя, режим
; таймера T1 - циклический,
LD P3M,#01H ; P36 - выход TOUT
LD T1,#19H ; Для короткого интервала
DI
OR IMR,#00100000B ; Разрешить прерывание от T1
LD TMR,#10001100B ; TOUT управляется с выхода T1,
; загрузить и разрешить T1
LD T1,#0E1H ; Установить значение для
; длинного интервала, которое
; загрузится в конце счета T1
CLR 04H ; Сбросить флаг: загружен
; короткий интервал
EI
RET
; Подпрограмма обслуживания прерывания
PULSE:
LD T1,#0E1H ; Загрузить значение для
; длинного интервала
XOR 04H,#01H ; Изменить флаг
JR Z,PULSE_EXIT ; Если правильно загружено,
; то закончить
LD T1,#19H ; Иначе, загрузить значение
; для короткого интервала PULSE_EXIT:
IRET
.END
Каскадирование таймеров/счетчиков
Для некоторых применений может быть необходимо измерение временного интервала гораздо большего, чем это может измерить от¬дельный таймер/счетчик (16,384 мс на частоте 8 МГц). В этом слу¬чае выводы TIN и TOUT могут быть использованы для каскадного сое¬динения T0 и T1 в единый модуль. TOUT при этом программируется для управления с выхода T0 и должен быть соединен проводником со входом TIN, который должен быть выбран как источник внешней синхронизации для T1. Когда T0 будет запрограммирован в цикличес¬кий режим, сигнал на выходе TOUT (и соответственно на входе TIN) будет изменяться от высокого уровня к низкому (заставляя T1 счи¬тать) на каждый второй конец счета T0. Запрос прерывания IRQ5 ге¬нерируется по истечении запрограммированного интервала. Запрос прерывания IRQ2 (генерируется на каждый переход сигнала от высо¬кого уровня к низкому на входе TIN) и IRQ4 ( генерируется на каждый конец счета T0 ) не важны для этого применения и должны быть поэтому запрещены (рис.1).
Значение временного интервала I можно определить из выраже¬ния

I = 2 x 4 x T x P0 x V0 x ( 2 x P1 x V1 - 1 ),
где: P0 и P1 - начальные значения предделителей;
V0 и V1 - начальные значения счетчиков;
T - период частоты генератора XTAL.
Минимальный интервал на частоте 8 МГц составит
Imin = 2 x 4 x 1/8 x 1 x 1 x ( 2 x 1 x 1 - 1 ) = 1 мкс,
а максимальный
Imax = 2 x 4 x 1/8 x 64 x 256 x ( 2 x 64 x 256 - 1) = 536,854528 с.

Ниже приведен текст подпрограммы инициализации каскадирован¬ных таймеров для обеспечения задержки в 1.998 с.
;Подпрограмма задержки 1.998 с.
TIMER: LD PRE1,#00101000B ; Модуль пересчета предделителя
; T1=10, синхронизация - внешняя,
; режим - однопроходный
LD P3M,#01H ; P36 - выход TOUT
LD T1,#64H ; Начальное значение T1=100
LD PRE0,#00101001B ; Модуль пересчета предделителя
; T0=10, режим циклический
LD T0,#64H ; Начальное значение T0=100
DI
AND IMR,#00101011B ; Запретить IRQ2 и IRQ4,
OR IMR,#00100000B ; Разрешить IRQ5
EI
LD TMR,#01001111B ; Выход TOUT управляется с
; выхода T0, синхронизация T1 со
; входа TIN, загрузка и разрешение
; счета T0 и T1
RET
.END
Контроль синхронизации
Таймер/счетчик T1 и вход TIN могут быть использованы для контроля за линией синхронизации (например, в контроллере диско¬вода гибкого диска) путем генерирования запроса на прерывание, если синхроимпульс пропадает. Для выполнения этого, контролируе¬мая линия синхронизации подсоединяется проводником к выводу Р31
(TIN). Вход TIN должен быть запрограммирован как вход перезапуска
T1, т.е. так, чтобы каждый падающий фронт сигнала на TIN застав¬лял бы T1 перезагрузиться и продолжать счет. Если T1 запрограмми¬рован на переполнение по истечении интервала времени в 1.5 перио¬да контролируемой последовательности синхроимпульсов, то он дос¬тигнет конца счета и сгенерирует запрос прерывания IRQ5 только при попадании импульса синхронизации.
Приведенная ниже программа включает подпрограмму инициализа¬ции T1 и TIN (MONITOR_INT) для контроля за синхронизацией с пери¬одом в 2 мкс. Предполагается, что частота генератора XTAL=8 МГц. Следует отметить, что в этом случае лучше выбрать однопроходный, чем циклический режим для таймера T1. Это предотвратит непрерыв¬ный поток запросов прерывания IRQ5 в случае, когда контролируемая синхронизация полностью выключится. Лучше, если подпрограмма об¬работки прерывания (CLK_ERR) сделает выбор, когда следует, а ког¬да не следует возобновить контроль. В программе показан также вектор прерывания от таймера/счетчика T1 (IRQ_5).
; Программа контроля синхронизации
.ORG 0010
IRQ_5: .WORD CLK_ERR
.ORG 000CH
; Подпрограмма инициализации таймера
MONITOR_INT:
LD PRE1,#00000100B ; Модуль предделителя T1=1,
; синхронизация внешняя,
; режим - однопроходный
LD P3M,#01H ; Р36 - выход TUOT
LD T1,#03H ; Начальное значение
; таймера T1=1,5.2 мкс
DI
AND IMR,#00111011B ; Запретить IRQ2
OR IMR,#00100000B ; Разрешить IRQ5
EI
LD TMR,#00111000B ; Режим перезапуска
; от TIN, разрешить T1
RET
; Подпрограмма обслуживания прерывания IRQ5
CLK_ERR:
...................... ; Обработать ситуацию
...................... ; пропадания импульса
; если контроль нужно продолжить ...
OR TMR,#00001000B ; Разрешить T1
IRET
.END
ЛИТЕРАТУРА
1. Гладштейн М.А. Изучаем микроконтроллеры Z8. Часть 4. Таймеры/счетчики.- Радио, 1998, N 10.

Категория: Книги по электронике (Электронная библиотека) | Добавил: Администратор
Просмотров: 1110 | Загрузок: 15 | Рейтинг: 0.0/0

Пожалуйста оставьте свои комментарии !!!!

Имя *:
Email:
Все смайлы
Код *:

Все ссылки на книги и журналы, представлены на этом сайте, исключительно для ознакомления, авторские права на эти публикации принадлежат авторам книг и издательствам журналов! Подробно тут!


Copyright Zloy Soft (Company) © 2008 - 2020