Пример 8:Программа очистки группы регистров с использованием косвенной адресации
В программе очистки регистров памяти данных микроконтроллера PIC 1684 стр. 71 было задействовано 68 команд с прямой регистровой адресацией. Теперь посмотрим, как эту же процедуру выполнить с помощью косвенной регистровой адресации.
В микроконтроллерах PIC имеется регистр косвенного адреса INDF, при обращении к которому на шину адреса памяти данных выставляется содержимое индексного регистра FSR. Регистр INDF виртуальный и используется для выставления на шину данных содержимого регистра FSR.
Виртуально этот процесс представлен на Рис. 8.7.Алгоритм работы программы следующий:
1. Установить индекс FSR на начало массива
2. Очистить адресуемый регистр данных, указав в качестве адресата регистр данных Н’00’
3. Инкрементировать FSR
4. Проверить, не достиг ли индекс конца массива (адрес 4F).Продолжить выполнение программы. Если нет, то перейти к п.2.
5. Продолжить выполнение программы.
Часть 1 – ARRAY: Индексный регистр FSR инициализируется адресом первого очищаемого регистра памяти 0CH путем записи его адреса в рабочий W (MOVLW H’0C’) с последующим копированием в индексный регистрFSR (MOVWF FSR)
Часть 2 – LOOP: Основная команда очистки массива использует косвенную адресацию, указывая в качестве адресата виртуальный регистр косвенного адреса INDF (CLRF INDF).
Часть 3 При каждом проходе цикла индекс увеличивается на единицу (INCF FSR,f)
Часть 4 Выход из цикла организован путем сравнения индекса (MOVFW FSR) с адресом первого регистра, находящегося за пределом заданного диапазона. Сравнение осуществляется путем вычитания содержимого рабочего регистра из индексного (SUBLW H’50’). Если числа равны, то флаг Z установится, в результате чего команда BTFSS STATUS,Z пропустит следующую за ней команду GOTO LOOP. До наступления этого события команда GOTO будет передавать управление на начало цикла и процесс будет повторяться.
Рис. 8.7. Проход массива
В итоге вариант программы состоит из 8 команд против 68 в линейном варианте, т.е. размер программы уменьшился в 8 раз!!! Однако и время выполнения нашей программы увеличилось в 7 раз из-за различных команд, необходимых для организации цикла.
CLRF INDF ; очищаем регистр на который указывает FSR
INCF FSR,f ; адрес следующего регистра
MOVFW FSR ; копируем в W
SUBLW H’50’ ; сравниваем с адресом последнего регистра
BTFSS STATUS,Z ; ЕСЛИ не достиг последнего
GOTO LOOP ; ТО продолжаем
; ИНАЧЕ следующая часть программы
MOTOR_2 Программа управления ротором шагового двигателя с помощью косвенной адресации
В программе управления ротором шагового двигателя стр. 63 было задействовано 37 команд с прямой регистровой адресацией. Теперь посмотрим, как эту же процедуру можно выполнить с помощью косвенной регистровой адресации.
; подача сигналов в обмотки двигателя-----------------------
LOOP
MOVF INDF,w ; элемент массива в W
MOVWF PORTB ; вывести в порт В
INCF FSR,f ; следующий адрес
DECFSZ COUNT,f ; ЕСЛИ (COUNT-1) не=0
GOTO LOOP ; ТО продолжить
GOTO START ; ИНАЧЕ начать сначала
;==============================================
END
Код программы состоит из 6 частей:
1. MOTOR - инициализация порта В – младшая тетрада порта настраивается на выход
2. S_COD – в памяти данных формируется массив кодов для управления вращением ротора двигателя (MOVLW B'00000001'; север, MOVWF 10H ; записать в 10Н)
3. START – загружаются параметры массива – его начальный адрес (MOVLW 10H ; MOVWF FSR) и количество элементов (MOVLW STEP; MOVWF COUNT).
4. LOOP - подача сигналов в обмотки двигателя. Код управления из массива копируется в рабочий регистр W (MOVWF INDF,w) и подается на обмотки шагового двигателя (MOVWF PORTB).
5. Их последовательная выборка осуществляется инкрементом индексного регистра FSR.
6. Цикл работы организован командой DECFSZ. ЕСЛИ число шагов в счетчике COUNT не достигло заданного, ТО подача кодов управления на обмотки шагового двигателя продолжается. ИНАЧЕ возврат к п.3 программы.
В итоге вариант программы состоит из 30 команд против 37 в линейном варианте, т.е. размер программы уменьшился незначительно. Выигрыш получился лишь в части подачи кодов в обмотки двигателя, что сделало программу более удобной для чтения.
ОСНОВНЫЕ ПОЛОЖЕНИЯ НА ПАМЯТЬ
· Программа любой сложности на любом языке программирования может быть написана при помощи всего трех управляющих структур: линейной, условия и цикла.
· В языке ассемблера механизм выбора реализован командами сравнения, условного и безусловного переходов.
· Одной из наиболее важных операций является операция сравнения двух чисел. С математической точки зрения это можно сделать при помощи вычитания рабочего регистра w из регистра f.
· Команды BTFSS и BTFSC используются для организации операции выбора следующей команды на основе анализа состояний любых битов любом регистров данных, образующих конструкцию ЕСЛИ – ТО.
ВОПРОСЫ ДЛЯ САМОПРОВЕРКИ
1. Напишите программу вычисления 12 чисел Фибоначчи: 1, 1, 2, 3, 5, 8, 13,... (каждое число в последовательности представляет собой сумму двух предыдущих чисел). Для организации цикла используйте команду DECFSZ.
2. Напишите программу сложения массива из 10 чисел. Массив начинается с адреса 20Н.
3. Как можно с помощью одной команды поменять значение 0 бита любого регистра данных?
4. Как доработать программу BIN_BCD стр.76 , чтобы результат ее выполнения представлял собой однобайтное значение в формате TENS:UNITS, сохраняемое в регистре 21Н?
Подсказка: используйте команду SWAPF
5. Доработайте программу BIN_BCD стр.76 для получения трехразрядного BCD числа. Результат сохранить в регистрах 21Н, 22Н, 23Н (сотни, десятки, единицы соответственно).
6. В качестве фрагмента процедуры тестирования памяти данных в каждый регистр диапазона 0CН…..3FH необходимо занести значение b’01010101’(55H).
7. В памяти данных, начиная с адреса 20Н, расположен массив из 10 чисел. Проанализировать числа на четность/нечетность и очистить все ячейки, содержащие нечетные числа. Содержимое остальных ячеек оставить без изменений.
8. Напишите программу определения количества нечетных чисел в массиве TITLEX.
9.В памяти данных, начиная с адреса 10Н, расположен массив из 15-ти чисел. Напишите программу для определения чисел равных Х.
10.В телевизионном шоу имеется 8 участников, разделенных на две команды: А и В. У каждого участника есть кнопка, формирующая при нажатии сигнал лог. 1. Состояние эитх кнопок можно одновременно считать с порта В микроконтроллера. Кнопки команды А подключены к младшим разрядам порта.
Напишите процедуру, которая будет:
· oпределять момент ответа на вопрос (нажата любая из кнопок);
· oпределять ответившую команду (если команда А, то регистр 20Н сбрасывается, если команда В, то устанавливается);
· oпределять, кто из членов команды нажал на кнопку (номер участника записывается в регистр 21Н).
11.Какую операцию выполняют следующие команды над байтом данных, находящимся в рабочем регистре?
ADDWF FILE,W; SUBWF FILE,W
12.Одним из простейших методов шифрования данных является изменение порядка битов. Например, b’10111100’ →b’00111101’. Написать программу, выполняющую эту операцию над сообщением ‘Hello friends!’, находящееся в памяти данных микроконтроллера.
Подсказка: для шифрования используйте команды сдвига