В микроконтроллерах PIC реализован достаточно простой вариант такого типа адресации — в полном соответствии с их философией. В младшем и среднем семействах[82] имеется отдельный элемент ИЛИ-HE, который детектирует обращение по прямому 7-битному адресу Ь’0000000’ и, как показано на Рис. 5.6, просто выставляет на шину адреса памяти данных содержимое регистра h’04’, называемого
Рис. 5.6.
В качестве простого примера предположим, что содержимое регистра FSR равно h’86’.Тогда команда clrf 0 (или clrf INDF) очистит регистр, расположенный по адресу h’86’, а не по адресу h’00’! Разумеется, содержимое регистра FSR можно изменить в любой момент времени, например, его можно инкрементировать в каждом проходе цикла, как в Программе 5.2.
Давайте в качестве примера перепишем Программу 5.1, заменив линейную структуру
Рис. 5.7.
Теперь наша программа будет работать по следующему алгоритму, представляющему собой перечень задач:
1. Установить указатель FSR на начало массива.
2. Очистить адресуемый регистр данных, указав в качестве адресата регистр данных h’00’.
3. Инкрементировать указатель FSR.
4. Проверить, не достигли указатель конца массива, в нашем случае — адреса h’80’. Если нет, то перейти к пункту 2.
5. Продолжить выполнение программы.
Визуально этот процесс представлен на Рис. 5.8.
Рис. 5.8.
Код, соответствующий этому алгоритму, приведен в Программе 5.2. Линейная структура предыдущей программы была преобразована в цикл, тело которого выделено серым цветом. Очистку регистров по-прежнему выполняет команда clrf, которая «проходит» по массиву, начинающемуся с адреса h’20’. При каждом проходе цикла указатель в регистре данных h’04’ инкрементируется. В конце концов содержимое регистра FSR выйдет за границу заданного диапазона, в результате чего программа выйдет из цикла и продолжит выполнение следующей секции кода.
В Программе 5.2 имеется много других особенностей, так что нам еще придется вернуться к рассмотрению набора команд.
Задача 1
Регистр FSR инициализируется адресом первого очищаемого регистра данных путем записи константы h’20’ в рабочий регистр W (movlw h’20’) с последующим копированием W в регистр h’04’ (movwf FSR). Как видно, в наборе команд отсутствует отдельная команда непосредственного копирования константы в регистр данных. Практически все циклы требуют инициализации перед входом в них.
Задача 2
Основная команда очистки регистра использует косвенную адресацию, указывая в качестве адресата фантомный регистр h’00’ (INDF) — clrf INDF. Эта строка помечена
Задача 3
При каждом проходе цикла указатель увеличивается на единицу. Эта операция осуществляется командой incf FSR,f. Обратите внимание, что в качестве адресата указан сам регистр памяти данных, а не рабочий регистр W.
Задача 4
Если вы не собираетесь крутиться в этом цикле бесконечно, то вам потребуется механизм для выхода из него. В нашем случае для этого используется сравнение содержимого регистра FSR с константой h’80’, т. е. адресом первого регистра, находящегося вне заданного диапазона. Сравнение осуществляется копированием содержимого регистра FSR в W (movf FSR,w) и последующим вычитанием рабочего регистра из константы h’80’ с использованием команды addlw — h'80' (прибавление отрицательного числа). Если эти числа равны, то флаг Z будет установлен, в результате чего команда btfss STATUS, Z (см. стр. 133) пропустит следующую за ней команду goto CLOOP. До наступления этого события команда goto будет передавать управление на начало цикла, и процесс будет повторяться с FSR, указывающим наследующий сбрасываемый регистр данных.