Программирование микроконтроллеров PIC. Часть 5. Ассемблер. Организация циклов и ветвлений

  1. Часть 1. Необходимые инструменты и программы. Основы MPLAB
  2. Часть 2. Что такое микроконтроллер и как с ним работать
  3. Часть 3. Структура программы на ассемблере
  4. Часть 4. Разработка рабочей части программы. Алгоритмы
  5. Часть 5. Ассемблер. Организация циклов и ветвлений
  6. Часть 6. Как перевести контроллер в режим программирования и залить в него прошивку

В этой части мы рассмотрим, как организуются циклы и ветвления на ассемблере для микроконтроллеров PIC, какие для этого используются команды.

Для начала давайте разберёмся, как организуются ветвления и что это такое. Ветвление — это такое место в программе, после которого в зависимости от какого либо условия может начать выполняться тот или иной код. То есть, счетчик команд в результате выполнения команды ветвления может быть установлен по двум различным адресам, в зависимости от исхода проверки какого-либо условия.

программы с ветвлением и без ветвления

Рис.1

Для организации ветвлений в pic-контроллерах можно использовать 4 команды: две оперирующие с байтами (decfsz, incfsz) и две оперирующие с битами (btfsc, btfss). Работают эти команды следующим образом:

decfsz f,d - вычесть 1 из регистра f, если результат =0, то пропустить следующую команду (d определяет, куда сохранять результат,
             если d=0 - результат сохраняется в аккумуляторе W, если d=1 - результат сохраняется в регистре f)
incfsz f,d - добавить 1 к регистру f, если результат =0, то пропустить следующую команду
btfsc f,b  - проверить бит b в регистре f, если он =0, то пропустить следующую команду
btfss f,b  - проверить бит b в регистре f, если он =1, то пропустить следующую команду

Эти команды эквивалентны следующим алгоритмам:

эквивалентные командам алгоритмы

Рис.2

Как видите, все перечисленные команды позволяют установить счётчик команд либо на следующий адрес, либо через один.

Как же организовать полноценное ветвление, такое как на рисунке 1? Это делается очень просто. Для этого дополнительно используется команда безусловного перехода goto. В итоге алгоритмы приобретают вот такой вид (эквивалентный алгоритму на рисунке 1):

алгоритмы после добавления goto

Рис.3

Если провести аналогию с языками высокого уровня, то эти конструкции можно сравнить с конструкциями вида if then else и им подобными.

Может сложиться впечатление, что число условий для организации ветвлений очень ограничено (проверки на ноль содержимого регистра в результате сложения или вычитания + проверки отдельного бита в регистре). На самом деле нужно понимать, что информация в контроллере представлена битами и байтами и в любом случае все ваши действия отражаются в памяти контроллера изменением каких-либо битов или байтов, равно как и любое условие сводится к проверке каких-либо битов или байтов. Например, большинство логических и арифметических команд в процессе выполнения изменяют флаги регистра специального назначения STATUS, о настройках модулей контроллера и результатах их работы также сигнализируют различные биты в специальных регистрах. Значения всех этих битов могут использоваться в качестве условий для организации ветвлений.

Например, мы хотим проверить, равны ли между собой значения в двух регистрах А и В. Если равны, то пусть программа выполняется дальше, если нет — пусть счётчик команд устанавливается на адрес Y и программа продолжает выполняться с этого адреса.

Для реализации такого алгоритма можно воспользоваться, например, командой xor, которая изменяет флаг Z. Если А=В, то результат побитного исключающего ИЛИ между этими регистрами будет равен нулю и флаг Z в регистре STATUS установится в единицу:

проверка равенства двух регистров

Рис.4

Теперь давайте поговорим о циклах. Собственно, циклы — это повторение одного и того же участка кода заданное количество раз. В ассемблере для организации циклов нет специальных команд, подобных операторам for to , while do и прочим операторам языков высокого уровня. Давайте разберёмся почему.

Как вообще организуются циклы? Есть какое-то условие, при выполнении которого цикл заканчивается. Один из аргументов этого условия (или даже оба аргумента) в процессе выполнения цикла может изменяться. Если условие не выполнено, то цикл повторяется. Как только условие выполнится, счётчик команд устанавливается на адрес первой команды, следующей за командами цикла.

Циклы бывают двух типов: с предпроверкой (или ещё говорят с предусловием), когда проверка условия происходит в начале цикла, и с постпроверкой (или по-другому — с постусловием), когда проверка условия происходит в конце цикла.

циклы с предусловием и с постусловием

рис.5

Ничего не напоминает? Обычное ветвление и ничего особенного, только один из переходов осуществляется назад, к тому коду, который мы уже выполняли. Такой алгоритм легко можно организовать с помощью описанных выше команд. Например, вот так:

циклы с предусловием и с постусловием

рис.6

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

  1. Часть 1. Необходимые инструменты и программы. Основы MPLAB
  2. Часть 2. Что такое микроконтроллер и как с ним работать
  3. Часть 3. Структура программы на ассемблере
  4. Часть 4. Разработка рабочей части программы. Алгоритмы
  5. Часть 5. Ассемблер. Организация циклов и ветвлений
  6. Часть 6. Как перевести контроллер в режим программирования и залить в него прошивку

Добавить комментарий