- •Лабораторная работа ¹5. Блок таймера.
- •5.1. Теоретическая часть.
- •5.1.1. Таймер и связанные с ним устройства.
- •5.1.2. Счетчики и регистры таймера. Cчетчик и альтернативный счетчик.
- •Регистр входной фиксации (icr).
- •Регистр выходного сравнения (ocr).
- •Управляющий регистр таймера (tcr).
- •Регистр статуса таймера (tsr).
- •5.2. Практическая часть.
- •5.2.1. Прерывание по переполнению таймера (toi).
- •5.2.2. Реализация функции входной фиксации (ici).
- •5.2.3. Реализация функции выходного сравнения (oci).
- •5.2.4. Контроль за правильностью работы программы с помощью cop-таймера.
- •5.3. Контрольные вопросы.
- •5.4. Задания.
5.2.2. Реализация функции входной фиксации (ici).
Рассмотрим следующий тип прерываний от таймера - прерывание ICI, генерируемое функцией Input Capture.Работа функции основана на обработке сигнала, поступающего на вход TCAP микроконтроллера. Фиксация срабатывает при обнаружении на входе фронта или спада сигнала, в зависимости от состояния бита IEDG в управляющем регистре таймера TCR. При IЕDG=1 прерывания происходят по переднему фронту сигнала (переход с уровня логического "0" на уровень логической "1" ). При IEDG=0, прерывания обнаруживаются по заднему фронту сигнала на входе TCAP микроконтроллера. В момент срабатывания Input Capture устанавливается флаг ICF, содержимое счетчика таймера переписывается в регистр ICR и, кроме того, если установлен флаг ICIE в регистре TCR, то генерируется прерывание ICI, Такой механизм позволяет измерять временные параметры сигнала на входе TCAP. Для формирования этого сигнала к входу TCAP подключена кнопка IC, установленная на плате имитатора внешних устройств.
В качестве иллюстрации вышесказанного, приведем пример программы, измеряющей длительность нажатия на кнопку IC. Время нажатия определяется путем подсчета переполнений таймера.
Основная программа :
300 LDA #$FF Переключаем порт В
302 STA $05 на вывод.
304 CLR $01 Гасим светодиоды.
306 LDA #$82 Разрешаем прерывания IC по
308 STA $12 переднему фронту сигнала.
30A WAIT Ожидание нажатия на кнопку IC.
30B LDA #$A0 Разрешаем прерывания TOI и IC
30D STA $12 по заднему фронту сигнала.
30F CLRAОчистка счетчика переполнений.
310 WAIT Ожидание переполнения или отжатия IC.
311 BRCLR #7,*$1,$317 Если поступило прерывание IC, то переход,
314 INCA иначе увеличение счетчика переполнений.
315 BRA $310 Возврат к ожиданию.
317 STA $1 Вывод результата на светодиоды.
319 BRA $319 Бесконечный цикл.
Подпрограмма обработки прерывания :
800 BRSET #5,*$13,$805Если прерывание по переполнению, то переход
803 COM $01 иначе инвертирование светодиодов.
805 LDA $13 Очистка
807 LDA $15 флагов
809 LDA $19 TOF è ICF.
80B RTI Возврат из подпрограммы.
По адресам $300-$308 находятся команды, производящие начальную установку, после чего программа переходит в режим ожидания нажатия на IC. После нажатия на кнопку IC, запускается счетчик переполнения таймера (команды по адресам $30F-$315) Работа счетчика прекращается в момент отпускания кнопки IC ( команда $311 ), после чего значение счетчика (регистр А) выводится на светодиоды. При любом из двух прерываний от таймера ( по IC и по переполнению ), вызывается подпрограмма обработки прерывания по адресу $800, которая очищает флаги прерываний в регистре статуса таймера и, в случае обработки прерывания IC, инвертирует содержимое светодиодов.
Поставьте точку останова по адресу $319, запишите адрес подпрограммы обработки прерывания ( $0800 ) по адресу $1FF8 и запустите программу. Светодиоды должны погаснуть . После этого нажмите на кнопку IC и удерживайте ее несколько секунд. При этом светодиоды должны гореть. После отпускания кнопки на светодиодах появится результат-содержимое регистра А.
Как уже было сказано выше, время нажатия на кнопку IC измеряется в переполнениях таймера. Так как период тактовых импульсов таймера 2 мкс. (частота тактирования 500 кГц), то переполнения таймера происходят каждые 2*65536=131072 мкс, то есть, чтобы полученный вами результат перевести в реальное время, нужно содержимое регистра А умножить на 0,131 с. Однако при таком методе измерения длительности возникает погрешность измерения, не превышающая ±0,131 с, что вполне приемлемо для измерения интервалов времени порядка нескольких секунд. Если же измеряемое время невелико (сравнимо с 0,1 с.), то требуется более точный метод измерения времени, в котором необходимо учитывать не только количество переполнений, но и содержимое таймера в момент начала и окончания измерения временного интервала. При этом удобно использовать то, что при нажатии на кнопку IC содержимое счетчика таймера переписывается в регистр ICR. В качестве примера приведена программа, которая позволяет измерить быстроту реакции человека.
Правила работы с программой следующие: после запуска программы необходимо дождаться зажигания светодиодов и затем, как можно быстрее нажать на кнопку IC. После этого на светодиодах и в регистре А появится время реакции примерно в сотых долях секунды.
Основная программа :
300 LDA #$FF Переключаем порт В
302 STA $05 на вывод.
304 CLR $01Гасим светодиоды.
306 LDA #$A2 Разрешаем прерывания по переполнению
308 STA $12 таймера и нажатию на кнопку IC.
30A LDA $13Сбрасываем
30C LDA $19 ôëàã TOF.
30E AND #$1F Формируем случайное число
310 ADD #$10 в диапазоне $10..$2F.
312 WAIT Случайная задержка на время от 2 до 3 секунд
313 BRSET #7,*$1,$326с проверкой на ошибочный старт.
316 DECA
317 BNE $312
319 COM $01 Зажигаем светодиоды.
31B CLRA Очищаем счетчик количества переполнений.
31C WAIT Ждем прерывания от таймера.
31D SEI Запрещаем прерывания.
31E BRCLR #7,*$1,$32A Если светодиоды не горят, то переходим к
преобразованию результатов.
321 INCA Иначе увеличиваем счетчик переполнений таймера.
322 CMP #$F Если этот счетчик не переполнился,
324 BNE $31C òî возврат на WAIT.
326 LDA #$FF Иначе выход по
328 BRA $338переполнению счетчика.
32A LSLA Сдвиг содержимого
32B LSLA аккумулятора
32C LSLA на четыре
32D LSLA разряда влево.
32E LDX $14 Загрузка старшего байта регистраICR в регистр X для обработки.
330 LSRX Сдвиг содержимого
331 LSRX регистра X
332 LSRX на четыре
333 LSRX разряда вправо.
334 STX $01 Сложение содержимого
336 ADD $01 регистров A и X и запись
338 STA $01 результата в порт B.
33A BRA $33A Бесконечный цикл.
Подпрограмма обработки прерывания :
800 BRCLR #7,*$13,$805Если поступило прерывание от кнопки IC,
803 COM $01 то инвертировать состояние светодиодов.
805 LDA $13 Сбрасываем
807 LDA $15 флаги
809 LDA $19 TOF è ICF.
80B RTI Возврат из подпрограммы.
Пояснения к программе:
1. Случайное число, которое было сформировано командами, стоящими по адресам $30C-$310, используется далее для организации случайной задержки командами с адресам $312-$317
2. В программе предусмотрена обработка ситуации, когда кнопка IC была нажата раньше времени (команда по адресу $313). В этом случае в аккумулятор командами с адресами $326 и $328 заносится число #$FF, что символизирует ошибочный старт.
3. Частота тактирования таймера - 500 кГц (тактовая частота ОЭВМ, деленная на 4), т.е. период тактовых импульсов таймера составляет 2 мкс. Так как сигнал готовности к старту (зажигание светодиодов) подается сразу после переполнения таймера, то при нажатии на кнопку IC в регистрах $14 и $15 будет содержаться время реакции. Однако, такой способ пригоден лишь для измерения интервалов времени, не превышающих времени переполнения таймера (0,131 с.). Для измерения более длинных интервалов времени в программе предусмотрен счетчик переполнений таймера в регистре А, от которого используется только младшая тетрада. Это дает возможность увеличить максимальное время ожидания до 0,131*16=2,097 с. Таким образом, младшая тетрада регистра А и два байта регистра данных IC образуют 20-ти битный счетчик, от которого используются только старшие 8 бит.
4. Команды, расположенные по адресам $32А-$336, предназначены для преобразования двухбайтного кода, хранящегося в регистрах А и Х, в однобайтовый так, чтобы старшая тетрада регистра Х стала младшей тетрадой результата, а младшая тетрада регистра А стала старшей тетрадой результата.
5. Подпрограмма обработки прерывания, расположенная с адреса $800, проверяет тип вызвавшего ее прерывания. Если была нажата кнопка IC, то информация на светодиодах инвертируется. Помимо этого сбрасываются флаги TOF и ICF.
Установите точку останова по адресу $33A и запишите адрес подпрограммы обработки прерывания в ячейки $1FF8 и $1FF9. Запустите программу с адреса $300 и убедитесь в правильности ее работы.