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

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

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

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

Добавлен: 16.06.2025

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

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

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

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

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

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

Предположим, что имеется термодатчик, который работает в диапазоне от 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


То есть, в случае применения команды ADDWF, потребуется 5 команд, плюс задействование регистра общего назначения, а в случае применения команды ADDLW, потребуется всего 3 команды и никаких регистров задействовать не нужно.

Итак, используем команду ADDLW (суммирование содержимого регистра W и константы, с сохранением результата в регистре W).

Итак, первое слагаемое (константа) в наличии.

Ее числовое значение указывается в рабочей части команды ADDLW.

На момент исполнения команды ADDLW, второе слагаемое должно "лежать" в регистре W. Следовательно, до исполнения команды ADDLW, в регистр W, нужно записать числовое значение второго слагаемого.

Для того чтобы, в симуляторе, выяснить, когда поднимаются флаги C и DC, перед выполнением команды ADDLW их необходимо сбрасывать (устанавливать в ноль). Следовательно, перед исполнением команды ADDLW, должна исполниться команда

bcf Status,0, если работаем с флагом C, или команда bcf Status,1, если работаем с флагом

DC.

Примечание: команды bcf и bsf на флаги не влияют. Получается следующее:

для работы с флагом C

movlw

X

bcf

Status,0

addlw

Y

для работы с флагом DC

movlw

X

bcf

Status,1

addlw

Y

X и Y – слагаемые числа.

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

"Врежьте" указанную выше группу команд (для работы с флагом C), в текст программы

Multi.asm, между командами bcf Status,5 и movlw .32.

Естественно, X и Y "пропечатывать" не нужно. Это символьные обозначения. Просто оставьте пустое место для чисел. Их можно будет "вписать" позднее. Все готово для того чтобы "выпытать" у флага C его "тайны".

Методика этой "пытки" очень проста: в качестве чисел X и Y подставляем различные их значения (от .00 до .255), смотрим, что из этого получится, и анализируем результат. Сразу возникает вопрос: "Куда смотреть и какие значения чисел подставлять?"

Ответ: смотреть - в окно RAM или SFR, а из чего исходить при выборе значений этих чисел, давайте разбираться.

Посмотрите в комментарий к флагу C.

В нем говорится о каком-то старшем бите и не оговаривается, старшем бите чего? Полубайт (4 бита) отпадает, так как с ним работает флаг DC (см. распечатку). Остается байт.

Следовательно, речь идет о каком-то непонятном (пока) переносе, чего-то еще более непонятного, из старшего бита байта.

Байт может отобразить значения чисел от .00 до .255, а старший бит байта устанавливается

в1 во второй половине этого диапазона чисел (начиная с .128) и сбрасывается, из 1, в 0, при переходе от числа .255 к .00.

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

.255 к .00) и предположить, что при этом, должно что-то произойти.

А именно, флаг C должен, на этот "скачек", "среагировать", то есть, подняться (установиться

в1).

Вопрос: "В каком случае, результат исполнения команды ADDLW может быть бОльшим, чем

.255 ?"

Ответ однозначен: если сумма этих чисел больше, чем .255. Но 8-битное число не может быть большим, чем .255.

А если нужно просуммировать, например .250 и .200 ?

Получится не .450, а (.250+.200)-.256=.194.

191


Число .256 "исчезло" по причине того, что разрядности одного регистра маловато будет.

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

ВПИКах, нельзя реализовать, например, 9, 10, 11, ... - разрядный регистр общего назначения.

Можно реализовать только разрядность, кратную 8-ми, задействуя несколько регистров общего назначения.

Только в этом случае можно работать с "большими" числами.

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

Например, если это значение равно .50 000, то нужно использовать двухбайтный регистр (задействуются 2 регистра общего назначения), который способен отобразить числа от .0 до (256х256)-1=.65535.

Итак, возникла необходимость в наращивании разрядности. Вопрос: "Как программно "состыковать" два отдельных регистра"? Ответ: начну "из аппаратного далекА".

Например, нужно нарастить разрядность двоичного счетчика 555ИЕ5.

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

Так называемым выходом переноса, в данном случае, является выход триггера старшего разряда младшего по разрядности счетчика, а сигналом переноса является перепад напряжения, формируемый при переходе от числа .15 к числу .00 (555ИЕ5 работает с полубайтом).

А ведь регистры ПИКа имеют точно такую же основу (триггеры), что и 555ИЕ5 (и многие другие), следовательно, нарастить разрядность этих регистров можно по такому же принципу. То есть, по принципу переноса, из старшего, двоичного разряда "младшей считалки", в младший, двоичный разряд "старшей считалки".

Если же речь идет о ПИКах, то задача формулируется так: нужно организовать перенос

из старшего байта регистра младшего разряда в младший байт регистра старшего разряда.

Только имеется большое горе: внутрь ПИКа с паяльником не залезешь и ничего не припаяешь. И вообще, гиблое это дело … Но то, что выделено темно-синим цветом, можно реализовать программно. Чувствуете, "куда ветер дует?"

А "ветер дует" на флаг C.

Вего названии есть слово "перенос" и "следит" он за байтом.

А что если флаг C поднимается в том случае, если результат суммирования больше, чем число .255 ?

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

Изменяя значения чисел X и Y и производя, после этого, суммирования, обратите внимание (в окне RAM, а можно и в окне SFR) на состояния флага C (бит №0 регистра STATUS, адрес регистра 03h), в случаях, если сумма этих чисел меньше .255 или больше .255.

Работайте в пошаговом режиме.

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

Полчаса такой работы более эффективны, чем несколько часов теории.

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

Итак, что выясняется? Выясняется следующее:

1.Если арифметический (а не по "кольцу") результат сложения двух чисел больше, чем число .255, то флаг С устанавливается в 1. То есть, осуществлен перенос.

2. Если этот результат находится в числовом диапазоне .00 … .255, то флаг C

192