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





Листинг 8.10
RESET:
ldi temp, (1« TICIE1) | (l«TOIEl) ;разр. прер. "захвата" и
/переполнения Timerl out TIMSK,temp clr temp out TCNT1H,temp
out TCNT1L,temp /очищаем Timerl
clr count0 /регистры для сохранения числа в счетчике clr count1
clr count2 /старший разряд счетчика
ldi temp, ОЬОЮОООЮ/ "захват" по фронту, частота 1/8
out TCCRlB,temp /запускаем Timerl
sei
Прерывание переполнения Timerl будет таким же простым (листинг 8.11).

TIM10VF: ■
inc count2 reti
И прерывание "захвата" также будет на первый взгляд выглядеть проще, чем в предыдущем случае (листинг 8.12).

Листинг 8.12
TIM1CAPT:
clr temp
out TCNT1H,temp
out TCNT1L,temp /первым делом очищаем Timerl
in countO,ICRlL /младший счетчика
in count1,ICR1H /старший счетчика
<что-то делаем с числом count2:countl:countO>
reti
Вся громоздкость будет заключаться в процедуре, обозначенной в листинге 8.12, комментарием "что-то делаем". Иногда и делать ничего не требуется — если стоит задача измерения периода или временного интервала, то по этому алгоритму мы сразу получим время в микросекундах (при частоте "кварца" 8 МГц), которое можно временно сохранить в SRAM, а в промежутках между прерываниями, например, посылать "наружу" по UART или записывать во внешнюю память.

Если же наша задача, как и ранее, измерение частоты, то нам придется делить некое заданное число (входную частоту счетчика) на измеренный период. В общем случае это выльется в одну из модификаций процедур деления многобайтовых чисел, описанных в главе 7. Но это еще не все. Если тактовая частота, как и ранее, 8 МГц, то на входе таймера будет 1 МГц, и для получения частоты в герцах на полученный интервал придется делить число 106. При измеряемой частоте порядка единиц герц в результате деления получатся числа около единицы с большим и очень информативным "хвостом" после запятой. Отбросить этот "хвост" нельзя — разрешающая способность метода будет такова, что не стоило и затевать все эти "захваты", а можно просто ограничиться обычным подсчетом частоты по способу частотомера.

Как же вывернуться? Для этого нужно сдвинуть запятую (десятичную! прием с манипулированием двоичными числами здесь не проходит) вправо, т. е. осуществить дополнительное умножение результата, например, на 1000, чтобы получить три дополнительных значащих цифры после запятой при дидпазоне в единицы герц (саму запятую на индикаторах придется поставить принудительно). Чтобы опять не возиться с "плавающей" арифметикой, следует, как мы и делали в главе 7, заранее умножить делимое на нужный коэффициент— т. е. мы будем делить на полученный период число 109, а не 106. В общем-то, это не так уж и страшно (109 займет четыре байта: $ЗВ9АСА00, это число нужно делить на трехбайтовый счетчик). При указанных параметрах, таким образом, минимальная измеряемая частота может составить одну тысячную герца. Закончим на этом с использованием таймеров по прямому назначению — т. е. для измерения времени, и немного остановимся на том, как осуществлять индикацию полученных чисел.

Управление динамической индикацией
Типов индикаторов существует великое множество (по сути компьютерный дисплей — тоже индикатор), но мы остановимся на самой простой их разновидности — семисегментных цифровых индикаторах. Мы не будем углубляться в тонкости управления ЖК-индикаторами — на рынке представлено много моделей ЖКИ (LCD) с самыми разнообразными интерфейсами и конфигурацией, и их разбор увел бы нас слишком далеко. В частности, в семействе AVR имеются контроллеры ATmega 169/329/649 со встроенным драйвером матричного или сегментного ЖК-дисплея 4x25 позиций. Обычно подключение самых простых семисегментных ЖК-индикаторов без встроенного контроллера и с параллельным управлением сегментами (например, отечественных ИЖЦ или ITS фирмы ПМТЕСН) так, как это делается в схемах на основе популярных АЦП 572ПВ5, к МК затруднено слишком большим количеством необходимых соединений, на которые просто не хватает портов (так, у упомянутых ATmegal69 корпус имеет 64 вывода). О том, как вывернуться из этой ситуации, мы здесь говорить не будем. Для тех, кто интересуется темой применения ЖК-индикаторов, отметим, что пример использования моделей AVR Mega с цифрой 9 в конце обозначения приведен в Application Notes AVR064 и AVR065.

LED-индикаторы и их подключение
Мы далее будем рассматривать обычные светодиодные (LED) семисегмент-ные индикаторы (рис. 8.2 и 8.3), в которых управление сегментами осуществляется напрямую, каждым по отдельности. Существуют разновидности с общим анодом (когда вывод положительного питания общий, а зажигаются сегменты коммутацией их к "земле" через резистор) и с общим катодом (общий — отрицательный вывод). Многоразрядные индикаторы можно собирать из отдельных разрядов, таких, как показаны на рис. 8.3, устанавливаемых на плате вплотную друг к другу. Также выпускают индикаторы с несколькими разрядами в сборе — сдвоенные, строенные и счетверенные, в которых отдельные разряды управляются по питанию независимо. Индикаторы с большим числом разрядов в сборе обычно содержат встроенные контроллеры, и мы на них останавливаться не будем.



     
 

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