Листинг 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, а управление переключением семи и даже восьми разрядов можно тогда осуществить через полностью свободный порт В). Можно, конечно, выбрать другой контроллер. Динамическая индикация практически никак не помешает счету, так как таймер считает абсолютно независимо от остальных схем.
Частотомер получится довольно низкочастотный (если только не использовать внешние счетчики-делители с ущербом для разрешающей способности измерений). Но самой сложной проблемой для построения настоящего частотомера будет формирование из исходного сигнала произвольной формы последовательности «чистых» импульсов нужной формы и амплитуды.
Читать дальше
Конец ознакомительного отрывка
Купить книгу