Файл: Самоучитель по программированию PIC контроллеров для начинающих (Е.А. Корабельников,2008).pdf

ВУЗ: Не указан

Категория: Не указан

Дисциплина: Не указана

Добавлен: 16.06.2025

Просмотров: 3615

Скачиваний: 3

ВНИМАНИЕ! Если данный файл нарушает Ваши авторские права, то обязательно сообщите нам.

сделано в программах Multi или cus.

Но в нашем случае, нужно пофантазировать и "родить" вычитающий счетчик, работающий по

принципу анализа состояния флага нулевого результата Z.

Фрагмент этого счетчика будет выглядеть так:

....................

XYZ ....................

....................

bcf

Status,2

decf

ABC,F

btfss

Status,2

goto

XYZ

....................

....................

ABC - название регистра общего назначения,

XYZ - название циклической подпрограммы,

строки с точками - предыдущие и последующие команды программы.

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

Пока кнопка не нажата, рабочая точка программы должна "крутиться" где-то в программе, "обходя" указанную выше группу команд, и при этом, состояние кнопки запуска должно опрашиваться (состояние ожидания нажатия кнопки).

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

Указанная выше группа команд, должна входить в состав этой циклической подпрограммы "на правах отфутболивателя рабочей точки".

При таком "раскладе", рабочая точка программы может выйти из циклической подпрограммы только при условии, что флаг нулевого результата поднялся (Z=1).

Итак, после нажатия на кнопку, рабочая точка программы "рано или поздно" установится на команду bcf Status,2 (сброс флага Z).

Следующей исполняется команда декремента decf ABC,F, воздействующая на флаг Z.

Врегистре общего назначения, условно названном ABC, на момент начала счета, находится какое-то предварительно (до входа в циклическую ПП) записанное в него число (константа), например .10 (количество отрабатываемых циклов).

После декремента, число .10 уменьшается до .09 и сохраняется в том же регистре ABC. Далее, с помощью команды btfss Status,2, производится анализ состояния флага Z.

Если результат декремента не нулевой (Z=0), то произойдет переход на начало циклической подпрограммы (goto XYZ) и все повторится снова.

Вконце каждого такого "витка", содержимое регистра ABC будет уменьшаться на 1.

"Рано или поздно" (на 10-м "витке"), результат декремента станет нулевым (Z=1), после чего произойдет переход в сценарий типа "программа исполняется далее" (выход из циклической подпрограммы).

После этого, рабочая точка программы будет "гонять по другим кольцам" полного цикла программы, обходя указанную выше, циклическую подпрограмму и осуществляя слежение за состоянием кнопки.

Время задержки будет равно времени нахождения рабочей точкой программы внутри циклической подпрограммы.

Изменяя числовое значение константы, можно изменить продолжительность этой задержки. По сравнению с тем, что рассматривалось ранее (применялась команда decfsz), такой способ "постановки на счетчик", не является выигрышным (большее количество команд).

Я о нем рассказал только для того, чтобы "проиллюстрировать" работу с флагом Z. Следующий пример работы с эти флагом более востребован.

Задействуя флаг Z, можно реализовать такое нужное устройство, как цифровой компаратор, то есть, устройство, осуществляющее анализ "входного" числа на предмет его "попадания" (или нет) в определенную "зону" чисел.

Если анализируемое число не попадает в эту "зону", то исполняется один сценарий работы программы, а если попадает, то другой.

184


В состав такой "зоны" чисел, в зависимости от желания программиста, могут входить от двух чисел и более.

Цифровой компаратор может быть частью, например, системы фазовой автоподстройки частоты, дешифратора, системы блокировки и т. д., то есть, весьма обширного класса устройств.

Файл с примером реализации цифрового компаратора, с формализованными комментариями, называется flag.asm (находится в папке "Тексты программ").

Это выглядит так:

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

; flag.asm ПРИМЕР ИСПОЛЬЗОВАНИЯ ФЛАГА НУЛЕВОГО РЕЗУЛЬТАТА "Z"

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

Вопрос: что должно произойти?

Ответ: если, на момент анализа содержимого регистра буферной памяти, в нем записано любое из чисел от .00 до .04 включительно, то рабочая точка программы должна "уйти" в один сценарий работы "программы" (в подпрограмму YES), а если указанное выше число не входит в "зону" чисел от .00 до .04 включительно, то рабочая точка программы должна "уйти" в другой сценарий работы "программы" (в подпрограмму NO).

;******************************************************************************** ; "ШАПКА ПРОГРАММЫ"

;================================================================================ ;.............................................................

;.............................................................

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

; Определение положения регистров специального назначения.

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

Status equ 03h ; Регистр Status.

;.............................................................

;.............................................................

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

; Определение названия и положения регистров общего назначения.

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

Registr

equ

0Ch

; Регистр буферной памяти.

;.............................................................

;.............................................................

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

; Определение места размещения результатов операций.

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

W

equ

0

; Результат направить в аккумулятор.

;

.............................................................

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

; Присваивание битам названий.

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

RP0

equ

5

;

Бит

выбора банка.

Z

equ

2

;

Бит

флага нулевого результата.

;.............................................................

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

org

0

;

Начать выполнение программы

goto

START

;

с подпрограммы START.

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

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

; РАБОЧАЯ ЧАСТЬ ПРОГРАММЫ

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

START ......................................

......................................

......................................

;--------------------------------------------------------------------------------

;ПП NO, в которую "уходит" рабочая точка программы, если анализируемое число не

;попадает в "зону" чисел от .00 до .04 включительно.

185


;--------------------------------------------------------------------------------

NO ......................................

......................................

;--------------------------------------------------------------------------------

......................................

......................................

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

;Реализация цифрового компаратора.

;Решение задачи о вхождении или нет анализируемого числа в "зону" чисел от .00

;до .04 включительно.

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

movf

Registr,W

; Скопировать содержимое регистра Registr

; в регистр W.

bcf

Status,Z

; Сбросить

флаг нулевого результата Z.

sublw

.00

; Вычесть из константы .00 содержимое

; регистра

W.

btfsc

Status,Z

; Проверка

состояния флага нулевого

; результата (Z).

goto

YES

; Если Z=1

(нулевой результат операции),

; то "уход" в ПП YES.

movf

Registr,W

; Если Z=0

(ненулевой результат операции), то

;содержимое регистра Registr копируется

;в регистр W.

sublw

.01

; Вычесть из константы .01 содержимое

; регистра W.

btfsc

Status,Z

; --------------

"--------------

goto

YES

; --------------

"--------------

movf

Registr,W

; --------------

"--------------

; --------------

"--------------

sublw

.02

; Вычесть из константы .02 содержимое

; регистра W.

btfsc

Status,Z

; --------------

"--------------

goto

YES

; --------------

"--------------

movf

Registr,W

; --------------

"--------------

; --------------

"--------------

sublw

.03

; Вычесть из константы .03 содержимое

; регистра W.

btfsc

Status,Z

; --------------

"--------------

goto

YES

; --------------

"--------------

movf

Registr,W

; --------------

"--------------

; --------------

"--------------

sublw

.04

; Вычесть из константы .04 содержимое

; регистра W.

btfsc

Status,Z

; Проверка состояния флага нулевого

; результата (Z).

goto

YES

; Если Z=1 (нулевой результат операции),

; то "уход" в ПП YES.

goto

NO

; Если Z=0 (ненулевой результат операции),

; то происходит безусловный переход в ПП NO.

;--------------------------------------------------------------------------------

;ПП YES, в которую "уходит" рабочая точка программы, если анализируемое число

;попадает в "зону" чисел от .00 до .04 включительно.

;--------------------------------------------------------------------------------

YES ......................................

......................................

;--------------------------------------------------------------------------------

......................................

......................................

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

end ; Конец программы.

186


Файл с примером реализации цифрового компаратора, с неформализованными комментариями, называется flag_1.asm (находится в папке "Тексты программ").

Это выглядит так:

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

; flag_1.asm ПРИМЕР ИСПОЛЬЗОВАНИЯ ФЛАГА НУЛЕВОГО РЕЗУЛЬТАТА "Z"

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

;.............................................................

;.............................................................

;.............................................................

;.............................................................

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

;Реализация цифрового компаратора.

;Решение задачи о вхождении или нет анализируемого числа в "зону" чисел от .00

;до .04 включительно.

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

movf

Registr,W

; Скопировать содержимое регистра Registr

; в регистр W.

bcf

Status,Z

; Сбросить флаг нулевого результата Z.

sublw

.00

; Вычесть из константы

.00 содержимое

; регистра W.

btfsc

Status,Z

; Результат

вычитания

нулевой?

goto

YES

; Да. --->"уход" в ПП YES.

movf

Registr,W

; Нет. --->скопировать

содержимое регистра

; Registr в регистр W.

sublw

.01

; Вычесть из константы

.01 содержимое

; регистра W.

btfsc

Status,Z

; Результат

вычитания

нулевой?

goto

YES

; Да. --->"уход" в ПП YES.

movf

Registr,W

; Нет. --->скопировать

содержимое

; регистра Registr в регистр W.

sublw

.02

; Вычесть из константы

.02 содержимое

; регистра W.

btfsc

Status,Z

; Результат

вычитания

нулевой?

goto

YES

; Да. --->"уход" в ПП YES.

movf

Registr,W

; Нет. --->скопировать

содержимое регистра

; Registr в регистр W.

sublw

.03

; Вычесть из константы

.03 содержимое

; регистра W.

btfsc

Status,Z

; Результат

вычитания

нулевой?

goto

YES

; Да. --->"уход" в ПП YES.

movf

Registr,W

; Нет. --->скопировать

содержимое регистра

;Registr в регистр W.

sublw

.04

; Вычесть из константы

.04

содержимое

; регистра W.

btfsc

Status,Z

; Результат вычитания

нулевой?

goto

YES

;

Да. --->"уход" в ПП YES.

goto

NO

;

Нет. --->"уход" в ПП

NO.

;--------------------------------------------------------------------------------

......................................

......................................

Проект под них в MPLAB создавать не нужно. Просто откройте (File Open). Вы видите пример программы, реализующей цифровой компаратор. Сначала, в общем виде, проанализируем принцип ее работы.

Цифровой компаратор анализирует "поступающие на его вход" числа, на предмет их попадания или нет в "зону" чисел от .00 до .04 включительно.

"Ширину" этой "зоны" можно сделать другой. Можно также и сместить ее по числовой оси. При соответствующем наращивании количества команд, можно расширить эту "зону", а при сокращении, уменьшить.

В результате "протаскивания" рабочей точки программы через цифровой компаратор, она должна "неизбежно уйти" в один из двух сценариев работы программы.

187


Вданном случае, один сценарий будет исполняться после безусловного перехода рабочей точки программы в ПП YES, а другой, в ПП NO.

Вних может "делаться все что угодно". Это зависит от замысла программы.

Названия этих подпрограмм условны и их можно назвать иначе.

Если переходы осуществляются не на первые команды подпрограмм, то речь идет о метках. Я расположил ПП NO вверху, а ПП YES внизу (по тексту программы), но они могут располагаться и иначе.

Вкачестве элемента оперативной памяти, используется регистр Registr (см. "шапку" программы).

На момент начала исполнения первой команды группы команд цифрового компаратора, в регистре Registr должно "лежать" число, величину которого нужно "заанализировать".

Вданном, учебно-тренировочном случае, не важно, каким именно образом "возникло" это число (существует множество вариантов "возникновения").

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

Так как командой, результат исполнения которой анализируется, является команда операции с константой, предполагающая задействование регистра W (команда sublw, воздействующая на флаг Z), то перед ее исполнением, необходимо скопировать в регистр W число, "находящееся" в регистре Registr, что и делается с помощью команды movf Registr,W. Перед командой, результат исполнения которой будет анализироваться (sublw), сбрасываем (опускаем) флаг Z.

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

Такого рода навыки будут архивостребованы при работе с флагами 2-й группы. Результат исполнения команды sublw .00 будет нулевым только тогда, когда содержимое регистра Registr также будет нулевым (0-0=0).

При этом, флаг Z будет поднят (Z=1).

Во всех остальных случаях, результатом исполнения команды sublw .00 будет число не равное нулю.

При этом, флаг Z будет опущен (Z=0).

После исполнения команды sublw .00, результат ее исполнения анализируется командой btfsc Status,Z (анализ состояния флага Z).

Если в регистре Registr "лежит" число .00 (Z=1), то рабочая точка программы "улетает" в ПП YES.

Во всех остальных случаях (Z=0), она продолжает свое движение по сценарию "программа исполняется далее".

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

Входе исполнения этой группы команд, выражаясь неформально, дается ответ на вопрос:

"Анализируемое число равно числу .01 или не равно?"

Если равно, то рабочая точка программы "летает" все в ту же ПП YES, а если не равно, то начинается отработка следующей, "однотипной" группы команд анализа, но только с использованием числа .02.

И так далее. До числа .04 включительно.

Если не в одной из этих групп команд не произошел "улёт" рабочей точки программы в ПП YES (числовых соответствий не обнаружено), то после отработки группы команд анализа на соответствие числу .04, начнется отработка ПП NO.

В ПП YES и NO, примитивно выражаясь, "может делаться все, что угодно".

Если по факту "срабатывания" компаратора, нужно банально включить какое-то внешнее устройство, то команды goto YES можно заменить, например, на команды bsf PortA,X (X – номер бита).

Если во всех командах bsf PortA,X, номер бита один и тот же (задействован один вывод порта), то устройство будет включаться в диапазоне чисел.

Если номера этих битов разные (задействованы несколько выводов порта), то можно включать несколько устройств.

При этом, факт включения любого из них, будет "привязан" не к диапазону чисел, а к одному из его поддиапазонов или даже к конкретному числу (от .00 до .255).

Могут быть и комбинации.

188