- •Программирование цифровой техники и микроконтроллеров управления
- •Алматы 2012
- •1 Микроконтроллеры в современном мире
- •1.1 Краткая история развития микроконтроллеров
- •1.2 Задачи и роль микроконтроллеров
- •2 Выполнение арифметических операций в мп
- •2.1 Системы счислений
- •2.2 Двоичная арифметика
- •2.3 Дополнительный код
- •2.4 Знаковый разряд
- •3 Регистры общего и специального назначения
- •3.1 Регистры portc и trisc
- •3.2 Регистр Status
- •3.3 Фиксированная (абсолютная) адресация
- •4 Косвенная адресация. Логика
- •4.1 Косвенная адресация
- •4.2 Логические функции
- •5 Маскирование. Стек
- •5.1 Маскирование
- •5.2 Счетчик команд
- •5.3 Стек
- •6 Конвейер и подпрограмма задержки
- •6.1 Конвейер
- •6.2 Программа задержки
- •6.3 Расчет времени задержки
- •7 Выполнение умножения и деления
- •7.1 Умножение и деление при помощи сдвига
- •7.2 Инструкции условных переходов
- •7.3 Целочисленное умножение
- •7.4 Целочисленное деление
- •7.5 Умножение на дробное число
- •8 Программирование клавиатуры. Дешифратор
- •8.1 Клавиатура
- •8.2 Фрагменты программы
- •8.3 Дешифратор
- •8.4 Компаратор
- •9 Основные элементы цифровой техники
- •9.1 Сумматор
- •9.2 Арифметико-логическое устройство
- •9.3 Бистабильные схемы
- •9.4 Триггеры и регистры
- •10 Структура микроконтроллера. Индикатор
- •10.1 Применение операций сдвига
- •10.2 Цифровой индикатор
- •10.2 Структурная схема мк
- •11 Прерывания и сторожевой таймер
- •11.1 Прерывания
- •11.2 Подсчет посетителей с помощью прерываний
- •11.3 Сторожевой таймер
- •12 Фактор времени и аналоговый мир
- •12.1 Модуль таймера tmr1
- •12.2 Применение таймера tmr1
- •12.3 Аналоговый мир
- •Приложение а Список некоторых сокращений
- •Список литературы
- •Содержание
- •050013, Алматы, Байтурсынова, 126
3.3 Фиксированная (абсолютная) адресация
Чтобы выполнить какие-либо действия с информацией в регистре, его имя или адрес должны быть указаны в команде. Будучи составной частью кода команды, 7-битный адрес операнда (регистра) является «фиксированным и, поэтому не может быть изменен во время выполнения программы.
Хотя явное задание этих адресов может показаться очевидным способом для указания местоположения объекта в памяти данных, существует ряд ситуаций, в которых такое указание неудобно.
В качестве примера, иллюстрирующего эту недостаточную гибкость, предложим, что мы хотим очистить содержимое всех регистров данных 0-го банка, т.е. регистров h'20'…h'7F'. Очевидным решением этой задачи будет многократное (96 раз) использование команды clrf (очистка регистра), как показано ниже в программе:
Clrf h’20’; очищаем регистр по адресу h’20’.
Clrf h’21’; очищаем регистр по адресу h’21’.
. . . .
Clrf h’7E’; очищаем регистр по адресу h’7E’.
Clrf h’7F’; очищаем регистр по адресу h’7F’.
Несмотря
на то, что этот код вполне работоспособен,
он чрезвычайно неэффективен. Каждая
из 96 команд выполняет одну и ту же
операцию, хотя и для другого адреса.
4 Косвенная адресация. Логика
Цель лекции: познакомить с применением косвенной адресации, логическими функциями и маскированием.
Краткое содержание лекции. Косвенная адресация и её применение. Логические функции NOT, OR, AND, XOR их применение. Таблицы истинности логических функций.
4.1 Косвенная адресация
В любом микропроцессоре имеется одна из разновидностей косвенной адресации, при которой один или более внутренних регистров используются для хранения адреса операнда в памяти данных. Такие адресные или индексные регистры используются в качестве указателя на данные. Основное отличие от прямой адресации заключается в том, что содержимое регистра-указателя может изменяться в процессе выполнения программы. То есть искомый адрес является переменной величиной. Например, для очистки массива данных можно использовать цикл, инкрементируя в каждом проходе цикла регистр, указывающий на адрес очищаемого регистра.
В микроконтроллерах РIС реализован достаточно простой вариант такого типа адресации. Имеется отдельный элемент ИЛИ-НЕ, который детектирует обращение по прямому 7-битному адресу b'0000000' и, просто передает на шину адреса памяти данных содержимое регистра h'04', называемого индексным регистром (FSR). Это происходит, если в качестве адресата команды используется нулевой адрес, по которому располагается регистр косвенной адресации INDF. Этот регистр является виртуальным, т.е. физически не существует. Он используется исключительно для передачи содержимого регистра FSR на шину.
В качестве простого примера предположим, что содержимое регистра FSR равно h'66',тогда команда clrf h’00’ (или clrf INDF) очистит регистр, расположенный по адресу h'66’ а не по адресу h'00’. Содержимое регистра FSR можно изменить в любой момент времени, например, его можно инкрементировать в каждом проходе цикла, как в программе очистки регистров, рассмотренной ниже.
Перепишем программу очистки массива, заменив линейную структуру циклом, как показано на рисунке 4.1. Теперь наша программа будет работать по следующему алгоритму, представляющему собой перечень задач:
1
)
Установить указатель FSR на начало
массива.
2) Очистить адресуемый регистр данных, указав в качестве адресата регистр данных h'00'.
3) Инкрементировать указатель FSR.
4) Проверить, не достиг ли указатель конца массива, в нашем случае — адреса h'7F'. Если нет, то перейти к пункту 2.
5) Если массив очищен, то продолжить выполнение программы.
Код, соответствующий этому алгоритму, приведен ниже в программе. Очистку регистров по-прежнему выполняет команда clrf, которая «проходит» по массиву, начинающемуся с адреса h'20’. При каждом проходе цикла указатель в регистре данных h'04' инкрементируется. В конце концов, содержимое регистра FSR выйдет за границу заданного диапазона, в результате чего программа выйдет из цикла и продолжит выполнение следующей секции кода.
Clearfiles; подпрограмма очистки массива.
Movlw h’20’; помещаем начальный адрес в W.
Movwf FSR; и копируем его в FSR.
Metka Clrf INDF; очищаем регистр, на который указывает FSR.
Incf FSR, F; инкрементируем указатель на адрес следующего регистра.
Теперь проверяем, не достиг ли указатель верхней границы массива?
Movf FSR, W; копируем указатель в W.
Addlw -h’7F’; сравниваем с адресом последнего регистра.
Btfss STATUS, Z; проверяем, если флаг Zero=1, то завершаем цикл.
Goto Metka; если нет, выполняем повтор цикла.
Return; если да, завершаем цикл и выходим из подпрограммы.
