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





Такой разброс может показаться небольшим, но, между прочим, его величина в 2-10"5 дает ошибку хода часов около 1 с в сутки или даже несколько больше (наверняка вам надоело корректировать свои часы, уходящие на минуту-другую каждые два-три месяца). Поэтому при необходимости частоту срабатывания таймера приходится подстраивать индивидуально. Как это можно сделать, мы поговорим далее, а сейчас остановимся на более "прогрессивном" способе формирования точных временных интервалов и частот с помощью 16-разрядного таймера.

Отсчет времени
Способ мы разберем на примере формирования частоты в 1 Гц для отсчета секунд— базовая функция для того, чтобы на основе МК построить часы. Идея состоит в том, чтобы использовать режим сравнения (compare) значения счетчика с наперед заданным числом. Такая возможность есть у всех 16-разрядных таймеров и у некоторых 8-разрядных в отдельных моделях (например, в TimerO модели ATtiny2313 в отличие от "классического" аналога AT90S2313).

Мы рассмотрим здесь универсальный 16-разрядный Timerl, который имеется во всех моделях Mega и Classic (кроме давно не выпускающегося первенца AT90S1200) и в некоторых Tiny. Посчитаем, какие параметры нам следует обеспечить. Как мы уже выяснили ранее, если тактовая частота контроллера равна-4 МГц, а коэффициент предделителя составляет 1/64, то частота на входе таймера будет 62 500 Гц. Если бы мы считали до переполнения счетчика, как ранее, при таких параметрах частота на выходе составила бы 62500/65536 = 0,9537 Гц. Для того чтобы получить 1 Гц, достаточно поделить частоту на входе на 62 500, что укладывается в 16 разрядов. Значит, если мы запишем в регистр сравнения число 62 500 и будем досчитывать до этой величины (обнуляя счетный регистр по ее достижении), то как раз получим нужную частоту. Чтобы такой режим работал, для таймера есть специальное прерывание по сравнению (если точнее, их обычно даже два — можно сравнивать с двумя разными числами А и В, но нам достаточно одного).

Листинг 8.3 иллюстрирует процесс инициализации Timerl для работы в таком режиме (пример годится для ATtiny2313 или AT90S2313).

Листинг 8.3
ldi temp,high(62500)
out OCR1AH,temp ;62500 значение для 1 сек при к. дел 1/64 ldi temp,low(62500)
out OCRlAL,temp ;62500 значение для 1 сек при к. дел 1/64 ldi temp, (1«СОМ1А0)
out TCCR1A,temp /переключающий режим для выхода ОС1А ldi temp, ОЬООООЮОО ;
вывод РВЗ (ОС1А) на выход out DDRB,temp
ldi temp,ObOOOOlOll /включить Timerl 1/64 out TCCRlB,temp

Бит 3 в регистре TCCRIB, называемый CTCI (В большинстве моделей Mega, как и в ATtiny2313, он носит другое название— WDM12), необходимо устанавливать в 1 — это означает, что по достижении записанного в регистрах сравнения числа таймер обнулится и начнет отсчет заново (в противном случае прерывание произойдет, но таймер будет считать до заполнения регистра и далее опять до заданного числа— фактически прерывания просто сдвинутся по фазе относительно прерываний по переполнению, но будут происходить с той же частотой).

Установка бита COMIAO В регистре TCCRIA требует пояснений. Для таймеров, способных работать в режиме сравнения, в МК AVR предусмотрен специальный вывод, носящий общее наименование ОСпх, где п— номер таймера, ад: может принимать значение А, В или, в некоторых случаях, С — в зависимости от того, какой регистр сравнения задействован. Для "классической" модели AT90S2313 регистр сравнения всего один (под названием OCRIA), поэтому для нее вывод носит название ОС1 без буквы, но подсоединен к тому же выводу порта РВЗ. Для разных моделей контроллеров выводы ОСпх могут соответствовать разным портам — например, для обоих вариантов модели 8515 (Classic и Mega) вывод ОС1А соответствует выводу порта PD5.

Этот вывод может переключаться в заданное состояние каждый раз, когда таймер достигает предустановленного значения в регистре сравнения OCRIAH : OCRIAL. Установка битов COMIAI : COMIAO (биты 7 и 6 в регистре TCCRIA) В состояние 01 означает, что этот вывод (если он сконфигурирован на выход) будет автоматически переключаться каждый период "туда-обратно", формируя меандр с половинной частотой. Тогда к этому выводу можно подключить, например, светодиод, который в данном случае будет загораться и гаснуть раз в секунду (обратите внимание, что в предыдущем случае с использованием простейшего TimerO нам приходилось вывод переключать "вручную"). Причем работа этого вывода не зависит от того, задействовано ли соответствующее прерывание для обработки таких событий или нет.



     
 

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