- •Лабораторная работа ¹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.3. Реализация функции выходного сравнения (oci).
Рассмотрим третий тип прерываний от таймера - прерывание OCI, генерируемое функцией Output Compare.Напомним, что эта функция срабатывает при совпадении содержимого счетчика таймера со значением в регистре OCR. При этом устанавливается флаг OCF, значение бита OLVL регистра TCR выводится на выход TCMP и, кроме того, если установлен флаг OCIE в регистре TCR, то генерируется прерывание OCI. Для отображения состояния вывода TCMP на плате имитатора внешних устройств установлен светодиод OC.
В качестве примера использования прерывания OC рассмотрим программу, которая управляет яркостью светодиода OC в зависимости от состояния переключателей порта A. Изменение яркости основано на регулировании скважности сигнала, подаваемого на светодиод. Напомним, что скважностью называется отношение периода сигнала к длительности импульса. Регулирование скважности производится с переключателей.
Основная программа :
300 CLR $04 Программируем порт А на ввод.
302 LDA #$40 Разрешаем прерывания
304 STA $12 ïî ÎÑ.
306 WAIT Ожидаем
307 BRA $306 прерывания.
Подпрограмма обработки прерывания :
800 LDA $0 Читаем информацию с переключателей.
802 AND #$1F Маскируем три старших бита.
804 BRCLR #0,*$12,$80AЕсли OLVL=0, то переход на $80A.
807 NEGA Вычисляем дополнение
808 ADD #$1F содержимого порта А до $1F.
80A INCA
80B ADD $16 Добавляем
80D STA $16 приращение в
80F LDA $13 регистр ОСR
811 LDA $17 и сбрасываем
813 STA $17 ôëàã OCF.
815 LDA $12 Инвертируем
817 EOR #$01 OLVL
819 STA $12 â TCR.
81B RTI Возврат из подпрограммы.
Как видно, действия по регулированию яркости заключаются, в основном, в подпрограмме обработки прерывания OC. Разберем их более подробно.
- из порта А читается число N<32 (выполняется командами по адресам $800 и $802);
- светодиод зажигается на (N+1)*256 и гасится на (32-N)*256 тактов таймера (командами с адресами $804-$813).
Чтобы отличить, какое из двух чисел N*256 èëè (32-N)*256 использовать в качестве приращения в регистре ОСR, предусмотрены команды с адресами $804-$808. Команды по адресам $815-$819 инвертируют состояние бита OLVL и, тем самым, задают состояние светодиода (светится или не светится ) при следующем вызове подпрограммы. Следует отметить необходимость команды INCA по адресу $80A. Если бы ее не было, то для вычисления приращения OCR использовалось бы число в диапазоне 0-31 ( а не 1-32 ). В случае, когда на переключателях установлен 0, приращение OCR также равно 0, и за время выполнения команд $80F-$81B таймер успеет превысить значение, хранящееся в регистре данных ОС. Это приведет к тому, что следующее прерывание наступит более, чем через 60000 тактов, что составляет около 0,1 с., в то время, как необходимо было получить задержку, близкую к 0.
Теперь запишите адрес подпрограммы обработки прерывания ($0800) по адресу $1FF8 и запустите программу с адреса $300. Убедитесь в том, что программа работает правильно. Затем замените команду $80A INCA на NOP и проверьте справедливость сказанного выше об этой команде.