Однокристальные PIC-микроконтроллеры. Технология разработки и отладки программ для микроконтроллеров PIC16, страница 12

Команды  retlw   k    и  retfie.

Эти команды предназначены для возврата из подпрограмм. Команда  retlw  возвращает в рабочий регистр  W константу, заданную в этой команде, а команда  retfie  разрешает прерывания. Команда  retlw  часто используется для чтения таблиц, находящихся в памяти программ.

Пусть, например, в рабочем регистре  W содержится смещение от начала таблицы. Тогда получить нужный элемент можно следующей процедурой:

movlw   0x02          ; Задать смещение

call  showsym         ; Вызов подпрограммы

movwf   PORTB     ; Вывести элемент таблицы в порт B

goto   $                    ; Зацикливание программы

showsym

addwf  PCL, F         ; Сложение   регистра W  с  PCL и пересылка

;  результата в PCL

retlw   0xAA          ; 0-й элемент таблицы

retlw   0xBB          ; 1-й элемент

retlw   0xCC          ; 2-й элемент

retlw   0xDD          ; 3-й элемент

retlw   0xEE           ; 4-й элемент

Программа начинает свою работу с пересылки константы 02h в рабочий регистр  W. Затем производится вызов подпрограммы  showsym. Ее работа начинается с добавления содержимого регистра W к текущему состоянию младшего байта счетчика команд PCL, и результат помещается в PCL. Таким образом, производится дополнительное смещение счетчика команд на величину, которая  была передана в рабочем регистре. Например, если было  W=0, то счетчик команд не изменится, и будет выполнена следующая команда  retlw  0xAA,  которая вызовет возврат из подпрограммы с записью числа AAh в регистр W. Если, как было в приведенной программе, W=02h, то к содержимому PCL  будет добавлено число 02h, и произойдет дополнительное смещение на 2 шага. В результате будет выполнена команда  retlw  0xCC, которая вызовет возврат из подпрограммы с записью CCh в регистр W.

После возврата из подпрограммы производится пересылка содержимого W в порт B, т.е. вывод в порт. В результате на выводах порта должно быть 11001100.

     Задание 2.  Занесите пример  в базовую программу, выполните ее компилирование и проверьте работу с помощью симулятора в пошаговом режиме. Исследуйте ее работу при различных значениях смещения, например, 0, 1, 3.

3.13. Исследование команд с косвенной адресацией

При просмотре таблиц с перечнем команд МК PIC16F84A вы не увидите специальных мнемоник команд, использующих косвенную адресацию. Дело в том, что любая команда, которая использует прямую адресацию, может также использовать и косвенную. Для обозначения перехода от прямой адресации к косвенной при записи мнемоники команды используется имя регистра INDF. Этот регистр реально не существует, но при его указании в поле прямого адреса операнда центральный процессор использует содержимое регистра  FSR в качестве адреса операнда. Поэтому регистр FSR называют регистром косвенной адресации. Например:

addwf  INDF,W   ; сложить содержимое рабочего регистра W с

; содержимым ячейки памяти, адрес которой находится

; в регистре FSR, результат поместить в регистр W

addwf  INDF,F    ; сложить содержимое рабочего регистра W c

; содержимым ячейки памяти, адрес которой находится

; в регистре FSR, результат поместить в ту же

; ячейку памяти

Рассмотрим программу, которая заполняет содержимое ячеек памяти данных (регистров МК) константами. В этой программе используется косвенная адресация ячеек памяти данных с помощью регистра FSR. Процесс заполнения выполняется подпрограммой с именем fill_reg. Подпрограмма выполняется в цикле. При каждом проходе цикла выполняется пересылка в ячейку ПД, адрес которой находится в регистре FSR, содержимого рабочего регистра W. Затем содержимое регистра FSR, т.е. адрес ячейки, инкрементируется, а счетчик количества ячеек декрементируется. Перед каждым вызовом подпрограммы в нее передаются входные параметры: в регистре Count содержится количество ячеек, в регистре FSR – начальный адрес массива ячеек, в рабочем регистре W – значение константы. Основная программа производит вызов подпрограммы fill_reg три раза. При первом вызове в ячейки ПД записывается константа Const1, равная  0x01, при втором вызове – константа Const2, равная  0x08, и при третьем вызове – константа  Const3, равная 0x0A. Затем процесс заполнения повторяется, так как основная программа зацикливается.