VEND movwf _work; Сохраняем W в памяти данных
swapf STATUS,w; Читаем STATUS, не изменяя флагов,
movwf _status; и сохраняем его в памяти данных
; -------------------------
CHECK bcf INTCON,INTF; Сбрасываем флаг внешнего прерывания
movf MONEY,w; Берем текущее значение MONEY
btfss PORTB,7; Проверяем $2
addlw d’200’; ЕСЛИ 0, ТО прибавляем 200
btfss PORTB,6; Проверяем $1
addlw d’100’; ЕСЛИ 0, ТО прибавляем 100
btfss PORTB,5; Проверяем 25с
addlw d’25’; ЕСЛИ 0, ТО прибавляем 25
btfss PORTB,4; Проверяем 10с
addlw d’10’; ЕСЛИ 0, ТО прибавляем 10
btfss PORTB,3; Проверяем 5с
addlw 5; ЕСЛИ 0 ТО прибавляем 5
btfss PORTB,2; Проверяем 1с
addlw 1; ЕСЛИ 0, ТО прибавляем 1
movwf MONEY; Сохраняем новую сумму
; ---------------------------
; Точка выхода
swapf _status,w; Восстанавливаем исходное значение
movwf STATUS; регистра STATUS
swapf _work,f; Восстанавливаем исходное значение W,
swapf _work,w; не воздействуя на флаги,
retfie; и возвращаемся в фоновую программу
7.1. Перепишите Программу 7.2 так, чтобы она подсчитывала число банок, равное одному гроссу (144). Это значение следует хранить в упакованном BCD-формате (СОТНИ и ДЕСЯТКИ: ЕДИНИЦЫ), и оно может использоваться фоновой подпрограммой для отображения общего числа банок.
7.2. Какие изменения следует внести в Программу 7.2, чтобы максимальное число банок в печи могло быть равным 1000?
7.3. Взяв в качестве образца Рис. 7.1, напишите процедуру обработки прерывания, выполняющую следующие операции:
• Копирование 16-битного числа в два регистра общего назначения — ТЕМР_Н и TEMP_L.
• Вычитание его из предыдущего значения, хранящегося в регистрах LAST_COUNT_H и LAST_COUNT_L, и запись разницы в регистры DIFFERENCE Н и DIFFERNCE L.
• Замещение предыдущего значения новым.
• Запись в РОН с именем NEW ненулевого значения для передачи в фоновую программу информации о том, что доступно новое значение. Фоновая процедура обнулит регистр NEW после обработки данных.
7.4. Скорость вращения вала можно измерить с использованием кодирующего диска, который генерирует импульс при повороте вала на каждые 10°. Этот импульс может использоваться в качестве сигнала внешнего прерывания микроконтроллера. Учитывая, что максимальная скорость вращения составляет 20 000 оборотов в минуту, какое наибольшее время выполнения может иметь процедура обработки прерывания, позволяющее избежать пропуска импульсов? Предполагается, что частота кварцевого резонатора равна 4 МГц.
7.5. Электронная рулетка определяет расстояние путем излучения ультразвуковых импульсов и контролируя время прихода отраженного сигнала. Схема такого ультразвукового дальномера приведена на Рис. 7.9 (за его основу взята схема с Рис. 7.7).
Наибольшее измеряемое расстояние составляет 2.5 м при разрешении 1 см. Скорость звука в воздухе при температуре 20 °C равна 344 м/с, т. е. время, за которое сигнал пройдет расстояние 1 см и вернется обратно, равно 58 мкс.
Рис. 7.9.
Используя в качестве задающего генератор с частотой 17.2 кГц, получим одно прерывание каждые 58 мкс.
Учитывая схему, программа должна выполнять следующие операции:
• Фоновая программа
1) Обнулить счетчик JIFFY и флаг NEW
2) Подать импульс на излучатель.
3) Ждать установления ненулевого значения флага NEW
4) Отобразить подсчитанное значение.
5) Перейти к п. 1.
• Процедура обработки прерывания
1) При каждом импульсе генератора инкрементировать счетчик JIFFY.
2) При обнаружении сигнала от приемника записать в флаг NEW ненулевое значение, извещающее фоновую программу о том, что в переменной JIFFY находится конечное число.
3) Повторять, пока активен хотя бы один сигнал.
4) Выйти из прерывания.
Напишите код процедуры обработки прерывания, которая использует регистр NEW для извещения фоновой программы о приходе отраженного сигнала. За основу можно взять Программу 7.3.
7.6. Предполагается увеличить диапазон цифрового ультразвукового дальномера до 10 м и разрешение до 1 мм. Какие изменения необходимо внести в аппаратную и программную части?