Добавил:
Upload Опубликованный материал нарушает ваши авторские права? Сообщите нам.
Вуз: Предмет: Файл:
PIC микроконтроллеры.docx
Скачиваний:
6
Добавлен:
01.07.2025
Размер:
22 Мб
Скачать
☆

Конструкция цикл

Последней управляющей конструкцией, которую мы рассмотрим, будет итерация, или цикл. Циклом называется многократное повторение последовательности команд до наступления указанного условия.

Рис. 8.7. Цикл в программе

Команда DECFSZ f,f декрементирует содержимое регистра данных общего назначения (cчетчик) и в случае равенства его содержимого нулю пропускает следующую команду. Типичным примером является подсчет числа проходов цикла.

Пример: формирование на выходе RA0 20 импульсов длительностью 2 мкс.

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

MOVLW D’20’ ; число повторов

MOVWF H’30’ ; в счетчике цикла

LOOP

BSF PORTA,0 ; установить RA0 (1 мкс)

NOP ; 1 мкс

BCF PORTA,0 ; сбросить RA0 (1 мкс)

NOP ; 1 мкс

DECFSZ COUNT,f ; ЕСЛИ содержимое счетчика не ноль

GOTO LOOP ; ТО повторить

….. …. ; ИНАЧЕ выйти из цикла

Команда INCFSZ f,f инкрементирует содержимое регистра данных общего назначения (счетчик). При переходе содержимого через ноль (H’FF’→ H’00’), будет пропущена следующая команда. При замене вычитающего счетчика на суммирующий необходимо изменить и содержимое счетчика цикла на 236 (256-20).

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

Пример 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

  1. Доработайте программу BIN_BCD стр.76 для получения трехразрядного BCD числа. Результат сохранить в регистрах 21Н, 22Н, 23Н (сотни, десятки, единицы соответственно).

  2. В качестве фрагмента процедуры тестирования памяти данных в каждый регистр диапазона 0CН…..3FH необходимо занести значение b’01010101’(55H).

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

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

Соседние файлы в предмете [НЕСОРТИРОВАННОЕ]