русс | укр

Языки программирования

ПаскальСиАссемблерJavaMatlabPhpHtmlJavaScriptCSSC#DelphiТурбо Пролог

Компьютерные сетиСистемное программное обеспечениеИнформационные технологииПрограммирование

Все о программировании


Linux Unix Алгоритмические языки Аналоговые и гибридные вычислительные устройства Архитектура микроконтроллеров Введение в разработку распределенных информационных систем Введение в численные методы Дискретная математика Информационное обслуживание пользователей Информация и моделирование в управлении производством Компьютерная графика Математическое и компьютерное моделирование Моделирование Нейрокомпьютеры Проектирование программ диагностики компьютерных систем и сетей Проектирование системных программ Системы счисления Теория статистики Теория оптимизации Уроки AutoCAD 3D Уроки базы данных Access Уроки Orcad Цифровые автоматы Шпаргалки по компьютеру Шпаргалки по программированию Экспертные системы Элементы теории информации

Косвенная адресация памяти данных


Дата добавления: 2015-08-31; просмотров: 2446; Нарушение авторских прав


Пример 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 раз из-за различных команд, необходимых для организации цикла.

;*************************************************************************

;CLEAR_ARRAY Программа очистки группы регистров с использованием косвенной адресации

;*************************************************************************

ARRAY

MOVLW H’0C’ ; начальный адрес массива

MOVWF FSR ; копируем в индексный регистр

LOOP

CLRF INDF ; очищаем регистр на который указывает FSR

INCF FSR,f ; адрес следующего регистра

MOVFW FSR ; копируем в W

SUBLW H’50’ ; сравниваем с адресом последнего регистра

BTFSS STATUS,Z ; ЕСЛИ не достиг последнего

GOTO LOOP ; ТО продолжаем

; ИНАЧЕ следующая часть программы

MOTOR_2 Программа управления ротором шагового двигателя с помощью косвенной адресации

В программе управления ротором шагового двигателя стр. 63 было задействовано 37 команд с прямой регистровой адресацией. Теперь посмотрим, как эту же процедуру можно выполнить с помощью косвенной регистровой адресации.

;************************************

; MOTOR_2 Шаговый двигатель

;************************************

;подключение обмоток двигателя к PORTB RB[3:0]

COUNT EQU 10H ; счетчик цикла

STEP EQU 8 ;задаваемый параметр

;================================

; Инициализация------------------------------

MOTOR

BSF STATUS,RP0 ; переход на page 1

MOVLW B'11110000'; константа F0 в W

MOVWF TRISB ; RB[3:0]-выходы

BCF STATUS,RP0 ; возврат на page 0

;====================================

; формирование управляющих сигналов----

S_COD

MOVLW B'00000001'; север

MOVWF 10H ; записать в 10Н

MOVLW B'00001001'; северо-восток

MOVWF 11H ; записать в 11Н

MOVLW B'00001000'; восток

MOVWF 12H

MOVLWB'00001010';юго - восток

MOVWF 13H

MOVLWB'00000010'; юг

MOVWF 14H

MOVLWB'00000110';юго - запад

MOVWF 15H

MOVLWB'00000100'; запад

MOVWF 16H

MOVLWB'00000101';северо - запад

MOVWF 17H

;==============================================

; параметры массива----------------------------------------------

START

MOVLW 10H ; адрес массива

MOVWF FSR ; управляющих сигналов

MOVLW STEP ; число шагов

MOVWF COUNT ; двигателя

;===============================================

; подача сигналов в обмотки двигателя-----------------------

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!’, находящееся в памяти данных микроконтроллера.

Подсказка: для шифрования используйте команды сдвига



<== предыдущая лекция | следующая лекция ==>
Конструкция цикл | ГЛАВА 9. МОДУЛЬНОЕ ПРОГРАММИРОВАНИЕ


Карта сайта Карта сайта укр


Уроки php mysql Программирование

Онлайн система счисления Калькулятор онлайн обычный Инженерный калькулятор онлайн Замена русских букв на английские для вебмастеров Замена русских букв на английские

Аппаратное и программное обеспечение Графика и компьютерная сфера Интегрированная геоинформационная система Интернет Компьютер Комплектующие компьютера Лекции Методы и средства измерений неэлектрических величин Обслуживание компьютерных и периферийных устройств Операционные системы Параллельное программирование Проектирование электронных средств Периферийные устройства Полезные ресурсы для программистов Программы для программистов Статьи для программистов Cтруктура и организация данных


 


Не нашли то, что искали? Google вам в помощь!

 
 

© life-prog.ru При использовании материалов прямая ссылка на сайт обязательна.

Генерация страницы за: 0.712 сек.