Юрий Ревич - Занимательная микроэлектроника
- Название:Занимательная микроэлектроника
- Автор:
- Жанр:
- Издательство:БХВ-Петербург
- Год:2007
- Город:Санкт-Петербург
- ISBN:978-5-9775-0080-7
- Рейтинг:
- Избранное:Добавить в избранное
-
Отзывы:
-
Ваша оценка:
Юрий Ревич - Занимательная микроэлектроника краткое содержание
Для широкого круга радиолюбителей
Занимательная микроэлектроника - читать онлайн бесплатно ознакомительный отрывок
Интервал:
Закладка:
Для измерения нам потребуется ввести прерывание Timer 1 по переполнению, в котором третий регистр (назовем его count3) будет всякий раз увеличиваться на единицу. Входной сигнал подадим на вход Т1 (вывод 9 для 2313), с которого внешние импульсы поступают прямо на счетчик таймера, если ему задать соответствующий режим.
Теперь разберемся с формированием измерительного интервала. При 8 МГц тактовой частоты и коэффициенте предделителя для Timer 0, равном 1/256, прерывания будут происходить с частотой 122,07 Гц. Нам же требуется 1 с (1 Гц), потому мы введем счетчик ( count_sek) и будем его с каждым прерыванием увеличивать, пока он не отсчитает ровно 122 таких прерывания. После этого можно фиксировать число импульсов, сосчитанное к тому времени в регистрах Timer 1. Но если кварцевый резонатор идеально точный, то секунда получится чуть меньше настоящей (неучтенные 0,07 Гц дадут ошибку 576 мкс со знаком «минус»), и перед чтением значений мы введем задержку для компенсации этой недостачи, с помощью которой наш частотомер можно еще дополнительно калибровать (т. е. учесть исходную неточность кварца). В начале и в конце интервала будем переключать разряд 6 порта D (вывод 11 ), чтобы контролировать измерительный интервал в процессе калибровки. На рис. 19.5 представлен МК AT90S2313 с обозначением выводов для нашей цели.
Рис. 19.5. Подключение AT90S2313для измерения частоты
Программа частотомера приведена в листинге 19.5 (определение регистров я опускаю, в данном случае их потребуется всего три — temp, count3и count_sek). В секции прерываний введем прерывания Timer 0 и Timer 1 по переполнению (по меткам TIM0и TIM1). Инициализация таймеров в секции начальной загрузки сводится к разрешению прерываний, но обязательно здесь же нужно очистить счетные регистры таймеров и все дополнительные
Листинг 19.5
ldi temp,(1<<<���ТO1Е1) ;разр. прер. Timer0 и Timerl
out TIMSK,temp
clr temp
out TCNT1H,temp
out TCNT1L,temp ;очищаем Timer1
out TCNT0,temp ;очищаем Timer0
clr count3
clr count_sek ;очищаем счетчик прерываний
ldi temp,0b00000100;
out TCCR0,temp ;запускаем Timer0 div 1:256
Прерывание Timer 1 будет очень простое (листинг 19.6).
Листинг 19.6
TIM1:
inc count3
reti
Теперь рассмотрим самое главное прерывание, Timer 0 (листинг 19.7).
Листинг 19.7
TIM0: ;таймер 122,07 Гц
inc count_sek
cpi count_sek,122 ;получаем 0.999424 с
breq corr_1 ;если секунда прошла, то на коррекцию счета
cpi count_sek,1
brne corr_1 ;в самом первом цикле запускаем Timer 1:
ldi temp,0b00000111 ;внешний сигнал Т1 (выв. 9) по фронту
out TCCR1B,temp ;запускаем Timer1
corr_1: ;1 сек + коррекция
clr temp
out TCCR0,temp ;останавливаем Timer0
;задержка на -600 мкс для коррекции интервала
ldi ZH,high(1200) ;8 МГц, цикл 4 такта
ldi ZL,low(1200)
loop:
sbiw ZL,1
brne loop
;переключение контр. выв 11 PinD6 период 1 с
sbis PinD,6
rjmp set_1
cbi PortD,6
rjmp Set_0
Set_1:
sbi PortD,6
Set_0:
clr temp
out TCCR1B,temp ;останавливаем Timer1
;читаем данные
in temp,TCNT1L
<���пишем младший байт в память>
in temp,TCNT1H
<���пишем второй байт в память>
<���пишем старший байт count3 в память>
;очищаем все регистры
clr temp out TCNT1H,temp
out TCNT1L,temp ;очищаем Timer1
out TCNT0,temp ;очищаем Timer0
clr count3
clr count_sek ;очищаем счетчик прерываний
;запускаем таймер 0 опять
ldi temp,0Ь00000100;
out TCCR0,temp ;запускаем Timer0 div 1:256
reti
Обратите внимание, что читать данные из регистров таймера нужно в указанном порядке: сначала старший, потом младший, а записывать в обратном порядке. Это сделано специально: при чтении из старшего регистра TCNT1Hданные из младшего TCNT1Lодновременно переписываются в специальный регистр временного хранения, и ситуации, когда в промежутке между командами чтения младший разряд может измениться (при запущенном таймере), не возникает. То же самое, только в обратном порядке, происходит и при записи. Запись данных я не расшифровывал, потому что это может быть и запись в SRAM с последующим выводом на индикацию, и запись во внешнюю энергонезависимую память для последующего чтения из компьютера (или одновременно и то и другое). Простейший частотомер можно сделать, если организовать автоматическую передачу данных через UART в компьютер, который и занимается отображением и записью информации.
Из-за инструкции sbiw, которая занимает два такта (а не один, как инструкция dec, которую мы использовали в процедуре delay для интерфейса I 2С, см. главу 16 ), здесь один цикл задержки равен четырем тактам, или 0,5 мкс при тактовой частоте 8 МГц. Меняя число циклов задержки, можно подстроить длительность секундного интервала в интервале от 576 мкс в сторону уменьшения (задержка равна нулю) до целых 131 мс в сторону увеличения. 576 мкс может показаться слишком маленьким значением, но этого достаточно для подстройки стандартного кварца, в крайнем случае, можно отобрать экземпляр из нескольких. Калибровка осуществляется измерением длительности импульса на контрольном вводе 11 МК с помощью точного частотомера (профессионального лабораторного прибора, а не любительского, который имеет недостаточную точность).
У AT90S2313 недостаточно выводов, чтобы напрямую обеспечить динамическую индикацию для нашей цели (7 десятичных разрядов), поэтому можно либо только использовать данные непосредственно, либо управлять разрядами через внешние дешифраторы (скажем, 561ИД5 позволяет управлять семисегментным индикатором четырехразрядным двоичным кодом с выводов PD0—PD3, а управление переключением семи и даже восьми разрядов можно тогда осуществить через полностью свободный порт В). Можно, конечно, выбрать другой контроллер. Динамическая индикация практически никак не помешает счету, так как таймер считает абсолютно независимо от остальных схем.
Частотомер получится довольно низкочастотный (если только не использовать внешние счетчики-делители с ущербом для разрешающей способности измерений). Но самой сложной проблемой для построения настоящего частотомера будет формирование из исходного сигнала произвольной формы последовательности «чистых» импульсов нужной формы и амплитуды.
Без подробного обсуждения привожу одну из возможных схем такого формирователя импульсов (рис. 19.6), работающего на частотах до 4 МГц. 554САЗ заменяется на 521САЗ (импортный аналог — LM311). Конденсатор 100 пФ служит для фильтрации высокочастотных помех и его емкость подбирается при регулировке. Предпочтителен более современный (и несколько более быстродействующий) LM6511, совпадающий с указанными по выводам. Переключатель полярности сигнала в принципе не требуется (его можно реализовать программно простым переключением режимов Timer 1), но таким образом можно сэкономить вывод МК, который пришлось бы подсоединять к переключателю.
Читать дальшеИнтервал:
Закладка: