Данный фрагмент кода можно легко доработать для вычисления 2-байтного смещения, выполняя при обновлении PCL 2-байтное сложение. Как и прежде, в подпрограмму будет передаваться только младший байт смещения. Используя эту методику, можно реализовать таблицы любого размера, располагающиеся в любом месте памяти программ (эти параметры ограничены только размером памяти программ). Более подробно обо всем этом можно прочитать в фирменном руководстве по применению AN556 «
6.1. Один студент написал подпрограмму формирования 1-мс задержки следующим образом:
DELAY_1MS movlw d’249’; Инициализируем счетчик цикла
D_LOOP addlw -1; Декрементируем счетчик
btfss STATUS,Z; Проверяем: равен нулю?
goto D_LOOP; ЕСЛИ нет, ТО повторяем
return
Что получится в результате?
6.2. Напишите подпрограмму, которая будет считывать значение порта В каждый час. Вы можете воспользоваться модифицированным для 60-минутного интервала вариантом Программы 6.10. Подумайте, почему данное решение является не слишком хорошим примером использования ресурсов микроконтроллера.
6.3.Напишите подпрограмму по следующим исходным данным:
• Разделить 2-байтное число на 1 — байтное.
• Делимое передается в подпрограмму в регистрах h’2E’:h’2F’
(DIVIDEND_H:DIVIDEND_L).
• Делитель передается в подпрограмму в рабочем регистре.
• Частное от деления возвращается в регистрах h’29’:h’2A’
(QUOTIENT_H:QUOTIENT_L).
• Остаток отделения возвращается в рабочем регистре.
Реализуйте деление методом вычитания до возникновения потери значимости (underflow). Похожую задачу выполняет Программа 5.10 на стр. 164. Прокомментируйте проблему, возникающую при выполнении деления указанным способом.
6.4. Доработайте Программу 6.6 таким образом, чтобы она могла отображать символы ’A’…’F’. Необходимо предусмотреть обработку как заглавных, так и строчных букв. Также ваша программа должна быть надежной.
6.5. Программа 6.15 предназначена для формирования 30-секундной задержки. Подсчитайте время выполнения подпрограммы и, таким образом, реальную длительность формируемой задержки.
; *********************************
; * ФУНКЦИЯ: Формирует задержку длительностью 1 мин при частоте резонатора 4 МГц *
; * ВХОД: Нет *
; * ВЫХОД: W и STATUS изменяются *
; * Регистры h’34:35:36’ обнуляются *
; **********************************
;Локальные объявления
COUNT0 equ h’34’; 3-байтный счетчик в регистрах h’34’
COUNT1 equ h’35’; и h’35’
COUNT2 equ h’36’; и h’36’
H equ d’153’; Параметр задержки
DELAY_30S
movlw H; Заносим 153 в старший байт счетчика
movwf COUNT2;
clrf COUNT1;
clrf COUNT0;
D_LOOP
decfsz COUNT0,f; Декрементируем младший байт
goto D_LOOP; до нуля
decfsz COUNT1,f; Затем декрементируем средний байт
goto D_LOOP; до нуля и повторяем
decfsz COUNT2,f; Затем декрементируем старший байт
goto D_LOOP; до нуля и повторяем
return
6.6. Результат считывания состояния механического переключателя может быть неверным, поскольку при замыкании контактов происходит их «дребезг» в течение нескольких миллисекунд, проявляющийся в формировании последовательности нулей и единиц. Аналогично ведут себя и некоторые электронные устройства, например фототранзистор при попадании в зону с пониженной освещенностью и выходе из нее. Хотя данная проблема может быть решена аппаратно, более экономичным решением будет использование программных методов.
Напишите подпрограмму, которая будет возвращать в 7-м бите рабочего регистра установившееся состояние переключателя, подключенного к выводу RB7 порта В. Состояние будет считаться установившимся, если при 5000 (h’1388’) последовательных операциях считывания возвращается одно и то же значение. Состояние остальных битов рабочего регистра при возврате из подпрограммы не имеет значения.