Добавил:
Upload Опубликованный материал нарушает ваши авторские права? Сообщите нам.
Вуз: Предмет: Файл:

Samouchitel

.pdf
Скачиваний:
16
Добавлен:
13.02.2015
Размер:
3.65 Mб
Скачать

bcf

Status,RP0 ; Переход в нулевой банк.

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

 

;Примечание: время исполнения полного цикла программы должно быть

;более времени, необходимого для окончания записи в EEPROM.

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

 

 

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

 

 

goto

START

; Переход на новый цикл программы.

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

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

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

Под программу eeprom_a.asm, создайте проект, загрузите ее в проект и произведите ассемблирование.

После этого, откройте окно EEPROM Window (Window EEPROM Memory), назначьте точку остановки на команде goto START (на той, ниже которой расположена директива end) и сбросьте программу на начало.

А теперь от души пощелкайте по кнопке с зеленым светофором (или по клавише F9) и обратите внимание на ячейку EEPROM памяти с адресом 02h.

Вы увидите, что с каждым таким "щелчком", ее содержимое будет увеличиваться на единицу.

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

На работе программы, "зашитой" в ПИК, это не отражается.

При записи, теоретически, могут быть совершены ошибки, но практически, их вероятность мала.

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

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

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

Это случай побайтной проверки.

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

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

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

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

Можно применить и другие виды проверок, например, по признаку четности или нечетности. Это, как говорится, личное дело каждого программиста.

"Самоучитель по программированию PIC контроллеров для начинающих" http://ikarab.narod.ru E-mail: karabea@lipetsk.ru

181

13. Флаги. Работа с флагами. Как работает цифровой компаратор. Перенос и заем.

Ранее, во 2-м разделе, я упоминал о флагах. Пришла пора с некоторыми из них разобраться.

Посмотрите в распечатки регистров специального назначения. Названия битов флагов выделены зеленым цветом.

Естественно, что слово "флаг" нельзя воспринимать буквально. Это аналогия.

Факт поднятие флага "сигнализирует" о том, что произошло какое-то конкретное событие.

Факт "опущения" (сброса) флага "сигнализирует" о том, что этого конкретного события не произошло.

Каждый флаг "привязывается" к "своему" типу события.

Например, один флаг "реагирует" на факт наличия или отсутствия нулевого результата произведенной операции (флаг Z), другой флаг "реагирует" на факт наличия или отсутствия переполнения сторожевого таймера (флаг -TO), третий, на факт наличия или отсутствия переноса-заёма (флаг C) и т.д.

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

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

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

Существуют 2 группы флагов.

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

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

Например, если с помощью команды DECF (но не с помощью команды DECFSZ, так как она не оказывает влияния на флаги) осуществляется декремент числа .01, то, после первого декремента (результат операции .00), флаг нулевого результата автоматически поднимется (бит Z установится в 1), а после следующего декремента (результат операции .255), он автоматически сбросится (бит Z установится в 0).

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

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

Например, в ранее рассмотренной программе Retr_1.asm, флаг внешнего прерывания по входу INT с названием INTF, при наличии внешнего прерывания по входу INT, устанавливается в 1 (поднимается).

Если его не сбросить (0) в интервале времени отработки ПП прерывания (до команды retfie), то после возврата из ПП прерывания, факт поднятия этого флага будет "восприниматься" ПИКом как наличие управляющего сигнала "ухода" в прерывание по входу INT, со всеми вытекающими из этого, "мерзопакостными" последствиями (работа программы нарушится). Именно по этой причине, флаг INTF, до исполнения команды retfie, нужно обязательно сбросить.

Посмотрите в распечатки регистров специального назначения.

Те флаги, в комментариях к которым указано "сбрасывается программно", относятся ко 2-й группе флагов, а те флаги, в комментариях к которым этого нет, относятся к 1-й группе флагов.

Таким образом, флаги 1-й группы можно назвать как бы "безобидными".

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

Проще говоря, в этом случае, они "всем скопом" могут как угодно подниматься и опускаться. Работа устройства от этого не нарушится.

Флаги 2-й группы не такие "безобидные".

За их состояниями нужно следить (учитывать при составлении программы).

182

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

Если этого не сделать, то "наказание" последует незамедлительно (нарушение работы программы).

Посмотрите в распечатку команд.

Вправом столбце, с названием "Флаги", Вы увидите стандартные названия флагов (битов флагов), на которые воздействует та или иная команда.

Есть команды, которые воздействуют сразу на несколько флагов (например, ADDWF), есть команды, которые воздействуют на один флаг (например, CLRF), а есть и команды, которые не воздействуют на флаги (например, DECFSZ).

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

Объяснение этому следующее.

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

Вправом столбце распечатки команд, Вы не найдете флагов 2-й группы.

Проанализировав содержимое этого столбца, Вы убедитесь в том, что наиболее часто встречается флаг нулевого результата Z.

По этой причине, он заслуживает особого внимания.

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

Ответ: да, могут. И еще как могут...

Ранее уже говорилось о том, к чему может привести отсутствие программного сброса флагов 2-й группы.

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

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

Далее, будем работать с одним из самых "ходовых" флагов,

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

Изначально, в обучающе-тренировочных целях, принцип работы с ним можно определить так: перед исполнением команды (эта команда должна воздействовать на флаг Z), флаг Z сбрасывается (2-й бит регистра STATUS устанавливается в 0), а потом выполняется команда, с последующим анализом его (Z) состояния.

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

Результат исполнения команды (число) может быть нулевым или не нулевым, то есть возможны 2 сценария.

Из этого следует то, что если проанализировать состояние флага Z после исполнения команды, которая влияет на состояние флага Z, то можно "разветвить" программу на 2 сценария.

Таким образом, выбор одного из двух сценариев дальнейшей работы программы

ставится в зависимость от ответа на вопрос: "Каков результат исполнения команды: нулевой или не нулевой"?

Анализ состояния флага Z (и других флагов тоже) осуществляется с помощью бит-ориентированных команд ветвления btfsc или btfss.

В результате исполнения любой из них, происходит ветвление на 2 сценария:

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

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

Пример.

Допустим, что необходимо составить программу под устройство типа "реле времени" (например, для фотопечати).

То есть, имеется кнопка, после нажатия на которую, производится отсчет заданного интервала времени.

Таким образом, речь идет о счетчике, который, конечно же, можно реализовать так, как это

183

сделано в программах 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

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

Могут быть и другие варианты, здесь "есть где развернуться".

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

Предположим, что имеется термодатчик, который работает в диапазоне от 0 до 100 градусов Цельсия.

Необходимо, чтобы в диапазоне температур от 80 до 90 градусов, сработала некая "предупреждалка" (например, сирена), а в диапазоне температур от 91 до 100 градусов, включилась система автоматического пожаротушения.

Предположим, что датчик линейный, и изменению температуры от 0 до 100 градусов соответствует изменение напряжения на его выходе от 0 до 10в.

Предположим, что аналоговый сигнал датчика переведен в цифровую форму, и изменению напряжения в диапазоне 0 …10 в линейно соответствует изменение значений чисел в диапазоне .0 … .100.

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

На работе устройства это не отразится.

А теперь все зависит от степени "навороченности" замысла конструктора.

Если она низкая, то можно подключить вход исполнительного устройства к какому-нибудь выводу порта, настроенному на работу "на выход", и с помощью команд bcf / bsf, программно управлять его состояниями.

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

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

Если первой анализируется температура, то при наличии числа, например, от .80 до .90, осуществляется переход на исполнение подпрограммы (подпрограмм) анализа задымленности.

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

Если получены утвердительные ответы на оба вопроса ("Температура выше нормы?" и "Уровень задымленности выше нормы?"), то срабатывает исполнительное устройство пожаротушения.

Естественно, что при этом, конструкция и устройства и программы усложняется (два датчика).

Этот пример, может быть, и не слишком удачный, но "глобальный" смысл, я надеюсь, понятен.

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

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

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

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

Пример исполнительного устройства, состояния которого многовариантны 7-сегментный индикатор.

Пример опосредованного воздействия цифрового компаратора, на работу 7-сегментных индикаторов гашение незначащих нулей в линейке из нескольких таких индикаторов.

189

В очень общем виде, это выглядит так.

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

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

Правее первой значащей цифры (включая и ее), гашения нет.

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

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

Разбираемся с флагами C и DC.

Если принцип работы флага Z не является чем-то уж очень сложным, то понимание принципов работы флагов переноса-заёма C и десятичного переноса-заёма DC, для большинства начинающих, является своеобразным "камнем преткновения".

Постараюсь убедить Вас в том, что "не так страшен черт, как его малюют", а заодно, на примере флагов C и DC, расскажу о методике "въезда" в операции, которые вызывают затруднения.

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

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

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

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

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

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

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

Вкачестве таковой, используем известную Вам, простенькую программу Multi.asm. Откройте проект Multi.

Куда "врезать" проверочную группу команд?

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

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

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

Вбольшинстве случаев, она работает в 0-м банке.

"Не мудрствуя лукаво", "врезаем" проверочную группу команд в "промежуток" между командами bcf Status,5 и movlw .32 ("и волки сыты, и овцы целы").

Теперь определяемся с ее составом.

Если необходимо разобраться с флагами C и DC, то нужно работать с командой, которая воздействует на оба этих флага.

Посмотрите в распечатку команд. Таких команд 4: две - сложения и две - вычитания. Операция сложения, на мой взгляд, более проста и привычна, чем операция вычитания. Значит, "отсеиваем" 2 команды вычитания.

Остались команды сложения ADDWF и ADDLW.

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

190

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