Добавил:
Опубликованный материал нарушает ваши авторские права? Сообщите нам.
Вуз: Предмет: Файл:
LAB5_W95.DOC
Скачиваний:
19
Добавлен:
16.04.2013
Размер:
102.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 и убедитесь в правильности ее работы.

Соседние файлы в предмете Отладка микроконтроллеров ЭВМ