Главная страница
Библиотека (скачать книги)
Скачать софт
Введение в программирование
Стандарты для C++
Уроки по C#
Уроки по Python
HTML
Веб-дизайн
Ассемблер в среде Windows
ActiveX
Javascript
Общее о Линукс
Линукс - подробно
Линукс - новое
Delphi
Паскаль для начинающих
Турбопаскаль
Новости
Партнеры
Наши предложения
Архив новостей





Регистры управления (TCCRX для 8-разрядных таймеров и TCCRXA И TCCRXB для 16-разрядных) используются, как ясно из их названия, для установки нужного режима таймера. В простейшем случае для 8-разрядного TimerO регистр управления TCCRO только запускает таймер и устанавливает тактовую частоту счета. Все нули в разрядах этого регистра (по умолчанию) означают остановленный таймер, а комбинация трех младших битов cs02-csoo от 001 до 111 запускает таймер, одновременно задавая источник тактового сигнала. Значения от 1 до 5 этого регистра означают, что таймер будет работать от тактовой частоты МК с учетом предделителя (коэффициент деления которого может принимать величину 1, 1/8, 1/64, 1/256 и 1/1024, в зависимости от значения cso2-csoo). Значения TCCRO, равные 6 и 7 (ПО и 111 в младших разрядах), означают работу TimerO от внешнего источника импульсов, подаваемых на вывод ТО МК— от падающего или нарастающего фронта этих импульсов соответственно.

Таким простейшим режимом ограничивается только TimerO в некоторых моделях семейства Classic и Tiny. Во всех остальных моделях AVR, как и в дополнительных 8- и 16-разрядных таймерах, режимов значительно больше. Среди них возможность работы в режиме "захвата" внешнего события (удобная для построения периодомеров или подсчета редких событий), счета до определенного значения (или даже нескольких таких значений) с возникновением прерывания по достижению определенного числа, несколько режимов широтно-импульсной модуляции (PWM), возможность функционирования в асинхронном режиме от отдельного тактового генератора и т. п.

Все варианты мы тут разбирать не будем, чтобы не переписывать "инструкцию" — подробное описание всех функций таймеров-счетчиков AVR займет много места, к тому же большинство этих возможностей довольно редко требуются на практике. Остановимся лишь на некоторых практических аспектах использования таймеров.

Формирование заданного значения частоты
В примере в главе 5 мы рассматривали функционирование 8-разрядного таймера в самом простом режиме — непрерывного счета тактовых импульсов с подсчетом числа переполнений его счетного регистра для формирования нужной задержки. При этом выбор значений частоты следования прерываний (а значит, и значения задержки) ограничен комбинациями тактовой частоты на входе таймера с допустимыми коэффициентами предделителя, да еще полученная величина оказывается поделенной на "некруглое" число 256, соответствующее объему счетного регистра TimerO (для 16-разрядного Timerl это число, соответственно, будет равно 65 536). А как быть, если нам требуется получить точную частоту, например, 1 кГц, 100 Гц или 1 Гц? Есть два способа достижения такого результата. Первый способ применим ко всем таймерам, независимо от их разрядности и особенностей, и мы его сейчас рассмотрим.
Способ заключается в том, что каждый цикл счета мы начинаем не с нуля, а с определенного заранее рассчитанного числа. Обратим внимание, что счетчики-таймеры AVR, вообще говоря, могут только суммировать (реверсирование счета также может производиться, но только в режимах PWM, к которым мы сейчас обращаться не будем). Исходя из этого, нам и нужно рассчитать предварительно записываемое число. Опять будем ориентироваться на простейший TimerO (в 16-разрядных таймерах целесообразнее выбрать другой способ, о котором далее) и предположим, нам требуется сформировать частоту 1 кГц. Рассмотрим типовой порядок рассуждений в подобном случае. Частоту тактовых импульсов необходимо выбирать так, чтобы она была больше 1 кГц, но не превышала значение 1 кГцх256 = 256 кГц. Если, как и ранее, тактовая частота контроллера равна 4 МГц, то можно выбрать коэффициент предделителя, равный 1/64, тогда частота на входе таймера будет 62 500 Гц.

В этом случае для того, чтобы получить частоту ровно 1 кГц, это число нужно поделить на 62,5. Нецелое число отсчетов в таймере организовать сложно, но теоретически возможно. Для этого можно, например, начинать с числа 194, что до переполнения (значения 256, т. е. 0 в счетном регистре) даст 62 отсчета. Еще пол-отсчета можно сделать, если сменить частоту на входе таймера на более высокую — например, при частоте предделителя 1/8 вместо 1/64 каждый "старый" отсчет будет соответствовать по длительности 8 "новым", и нам нужно будет отсчитать 4 "новых" интервала (для чего придется предварительно записать в счетный регистр число 252). При этом следует еще учесть количество тактов, необходимое для перестройки таймера.

Другой способ точной подгонки частоты — организовать простую задержку, и мы его разберем далее. А пока зададимся вопросом: нельзя ли избежать всех этих сложностей? Для этого можно, например, выбрать подходящее значение тактовой частоты МК: так, "кварц" с частотой 4096 кГц даст при делении на 64 ровно 64 кГц, и делить придется уже на целое число. Более общий способ — применить тот же метод, что и в примере из главы 5 — с дополнительным счетчиком переполнений (переменная Counttime в листинге 5.13). Тогда мы не ограничены частотой 256 кГц, а можем выбрать более высокую частоту на входе счетчика. Например, если установить коэффициент предделителя 1/8, то мы из 4 МГц получим 500 кГц, которые поделим на 250 описанным ранее методом и отсчитаем два таких цикла переполнения.



     
 

Библиотека программиста. 2009.
Администратор: admin@programmer-lib.ru