Команды ветвления

8-11-2013, 18:03
Просмотров: 1618
Набор команд PIC включает в себя две команды, одна из которых использовалась в подпрограмме выбора режима, а другая имеет обратное ей действие, т.е. проверяет разряд и пропускает следующую команду, если он содержит. При реализации блоков принятия решений в блок-схеме используют только эти две команды.
Команды ветвления

Микроконтроллер PIC проверяет состояния разряда и выполняет соответствующее действие. Обычно с помощью такой команды контролируют разряд, который был установлен или обнулен в результате предыдущей операции. Очень часто проверяют флаг нулевого результата (разряд регистра STATUS), именно поэтому мы создали особое определения для z.
На флаг нуля влияют 15 команд. Это - операции, которые могут иметь нулевой результат. Например, decf декрементирует указанный регистр и, если результат равен 00h, устанавливает флаг нулевого результата. Если результат не равен 00h, то этот флаг сбрасывается. Мы используем состояние данного флага для ветвления в одном из направлений, если z = 1 и - в другом, если z = 0. Соответствующая подпрограмма может выглядеть следующим образом:
Среди других команд, которые могут привести к изменению состояния флага нулевого результата, можно назвать сложение, вычитание л логические операции, так что рассмотренная подпрограмма весьма полезна.
Иногда команды пропуска неудобны тем, что пропускают только 0дну командную строку. Действие в случае отсутствия пропуска может потребовать двух командных строки, а иногда - даже больше. В рассмотренном примере очевидно, что подпрограмма finish потребует использования нескольких командных строк, поэтому для перехода к той части программы, которая может содержать сколько угодно строк, пришлось использовать команду goto.
Иногда бывает необходимо разместить одну из двух различных констант в рабочий регистр в зависимости от состояния некоторого разряда. Например, регистр может устанавливаться в 90h, если разряд содержит 0, или в 60h, если разряд содержит 1. Проблема заключается в том, что запись константы в регистр требует использования двух командных строк, а не одной. Дело в том, что соответствующее значение вначале помещается в w (movlw), а затем переносится из w в требуемый регистр (movwf).
Команды ветвления

Обходное решение заключается в предварительной загрузке w перед считыванием разряда:
Для управления направлением поворота робота "Искатель" в порт В должно быть передано некоторое значение.
Мы устанавливаем w на одну из возможных настроек (поворот влево) прежде, чем проверяем разряд случайности.
Если в результате проверки окажется, что этот разряд содержит 1, то мы изменяем значение в w, чтобы повернуть вправо.
При этом потребуется только одна пропускаемая командная строка. Если разряд содержит 1, то мы пропускаем команду изменения, оставляя значение для левого поворота как есть. Требуемая установка теперь находится в w, после чего она переносится в порт В, чтобы включить двигатели.
Команды опроса разряда используются в логических операциях, а также при наличии входного сигнала от кнопки или ключа.
Применяют две методики использования переключателей и кнопок:
• проверка разряда по ходу выполнения программы;
• ожидание того, чтобы разряд принял конкретное значение: 0 или 1.
Подпрограмма выбора режима - это пример первой методики. Перед тем, как программа считывает состояние, переключатель уже был разомкнут или замкнут. Опрос и результирующий переход реализованы одной командой btfsc или btfss. Подпрограмма выбора режима запускается в самом начале программы. Зачем тратить переключатели на отдельную подпрограмму? Те же переключатели можно использовать позже для выбора других опций. Например, в ходе игры ключ может замыкаться для того, чтобы сказать роботу: "Я сделал мой ход - теперь твоя очередь".
Ожидание специфических входных значений подразумевает зацикливание микроконтроллера PIC.
Рассмотрим простейший способ сделать это:
Эта подпрограмма ожидает, пока вход перейдет в состояние логического нуля. Если на входе присутствует слабое подтягивающее сопротивление, то нам достаточно просто установить ключ между выводом и линией О В. Программа ожидает замыкания ключа. То же самое справедливо и для кнопки.
Простая подпрограмма, показанная выше, имеет свои недостатки, и главный из них - микроконтроллер PIC работает очень быстро.
Если мы используем кнопку, а в программе присутствует несколько подпрограмм ожидания, то PIC, возможно, перейдет к следующей подпрограмме ожидания, в то время как мы все еще жмем на кнопку для первой подпрограммы. Прежде, чем продолжать выполнение программы, необходимо контролировать моменты нажатия и отпускания кнопки. Расширим рассматриваемую подпрограмму следующим образом:
Эти подпрограммы заставляют процессор ожидать в цикле. Ожидая, он не может делать ничего другого. Иногда это - именно то, что нужно, но бывает, что во время ожидания процессору желательно было бы еще чем-нибудь заняться. В таком случае потребуется подпрограмма, опрашивающая состояние кнопки через короткие интервалы.
Один из вариантов реализовать это - заставить микроконтроллер PIC проверять состояние входа от кнопки настолько часто, чтобы казалось, что нажатие кнопки имеет мгновенный эффект. Вот возможное решение:
Опрос - это простейшая из методик. Вы точно знаете, когда будет считываться вход. В этом случае известно, что цикл засвечивания светодиода заканчивается его отключением.
Альтернативная методика связана с использованием прерываний (прерывание по изменению состояния).
Проблема заключается в том, что нельзя сказать с определенностью, на каком этапе цикла подсвечивания светодиода это произойдет.
Необходимо запрограммировать микроконтроллер PIC таким образом, чтобы он выходил из цикла и выключал светодиод прежде, чем программа продолжит выполняться. Кроме того, следует тестировать входные каналы, чтобы выяснить, какой из них вызвал прерывание.
Прерывания - великолепный инструмент в некоторых программах, однако их лучше не использовать, если аналогичного результата можно достичь с помощью простого опроса.

Источник: delete-it.ru
Автор: ziko
Опубликовано пользователем: 81 (смотреть все)
Комментарии: