ПРОГРАММИРУЕМ МИКРОКОНТРОЛЛЕРЫ 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мкс11 I 1мкс64256 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.
Все ссылки на книги и журналы, представлены на этом сайте, исключительно для ознакомления, авторские права на эти публикации принадлежат авторам книг и издательствам журналов!
Подробно тут!