Главная страница

Самоучитель по программированию PIC контроллеров для начинающих (Е.А. Корабельников,2008). Самоучитель по программированию PIC контроллеров для начинающих. Система команд pic16F84A 26 Что такое программа иправила ее составленияПример создания программы автоколебательного мультивибратораДирективы.


Скачать 3.49 Mb.
НазваниеСистема команд pic16F84A 26 Что такое программа иправила ее составленияПример создания программы автоколебательного мультивибратораДирективы.
АнкорСамоучитель по программированию PIC контроллеров для начинающих (Е.А. Корабельников,2008).pdf
Дата30.01.2017
Размер3.49 Mb.
Формат файлаpdf
Имя файлаСамоучитель по программированию PIC контроллеров для начинающих .pdf
ТипПрограмма
#1195
КатегорияПромышленность. Энергетика
страница17 из 57
1   ...   13   14   15   16   17   18   19   20   ...   57
.65
записывается в
аккумулятор
(регистр
movlw .65
(запись константы в
регистр
W
), а
затем копируется (после копирования, число .65 из регистра
W
не удаляется, а
остается в
нем
), из регистра
W,
в регистр (
movwf TrisB
). Итак, задействованные, в
принципиальной схеме, выводы порта
В
, работают в
соответствии с
ранее сформулированным требованием
Переходим к
содержимому регистра
OptionR
Сразу "выбраковываем " то, что ненужно Так как внешние тактовые сигналы в
работе устройства не используются (внешние сигналы управления не являются тактовыми) и
уходов в
прерывания нетто значения
4-
го
, го иго битов регистра
OptionR
могут быть любыми
То есть, они не влияют на работу устройства и
поэтому установим их, например, в 0 (а можно ив 1 или в
любой комбинации. Теперь работаем с
битами
, которые на что- то влияют
Сначала нужно определиться задействовать или нет предварительный делитель
Предделитель может быть включен либо перед таймером, либо после сторожевого таймера
WDT
Внешних тактовых сигналов у
нас нет, значит и
незачем включать предделитель перед
TMR0
Остается
WDT
Давайте поподробнее с
ним разберемся (сторожевой таймер) сбрасывается командой
clrwdt
Строго говоря, вместо слова "сбрасывается ", нужно применять слово "
перезапускается ", но так как по отношению к, слово "сбрасывается " является стандартным, то его и
буду применять
Имейте это ввиду
После инициализации
ПИКа
, по умолчанию (аппаратно, начинается формирование импульса
WDT
Такой аппаратный запуск происходит только один раз (заодно включение питания, а
далее
, походу отработки программы,
WDT
(если он включен) нужно программно перезапускать
При каждом перезапуске, к
сформированному ранее импульсу, проще говоря, добавляется "
довесок
/
хвостик " продолжительностью мс, и
поэтому формирование импульса продолжается (не завершается. Примерно " потому, что стабильность временных характеристик управляемого- одновибратора с
перезапуском
(это основа) оставляет желать лучшего
Разработчики
ПИКов предлагают ориентироваться на мс.

Если
WDT
работает без предделителя
, то сбрасывать (
перезапускать
) его необходимо через промежутки времени менее чем мс, то есть, достаточно часто
Это не всегда бывает удобным из- за необходимости применения относительно большого количество команд
clrwdt
Если после
WDT
включить предделитель
, то максимальный интервал времени перезапуска увеличится
Он будет кратен коэффициенту деления предделителя
Например
, если предделитель с
максимальным коэффициентом деления (128) подключен кто команды
clrwdt
нужно располагать в
тексте программы через промежутки времени меньшие чем х мс (2,3 сек. То есть, потребуется меньшее количество команд, нежели в
случае
, когда предделитель не подключен к
WDT
Если программа "зависнет " (
перезапуски
WDT
прекращаются
), тов данном случае, примерно через 2,3 сек после начала "зависания ", произойдет аппаратный сброс программы на ее начало (исполнение программа начнется с
ПП
START
). Не мудрствуя лукаво ", применяю это на практике (можно задать и
меньший
Кдел предделителя
). Итак, определились подключаем предделитель
, с коэффициентом деления 128, к WDT
. Для этого необходимо установить впервые бита (начиная с
младшего
) регистра
OptionR
Остался один- й
бит
: включение
/
выключение подтягивающих резисторов порта
В
.

92 Если подтягивающие резисторы порта
В
программно включены, то они автоматически (аппаратно) отключаются от тех выводов порта
В
, которые работают "на выходи остаются подключенными к
тем выводам порта
В
, которые работают "на вход. Таким образом, если подтягивающие резисторы программно подключены к
выводам порта
В
, то влияние этих резисторов на внешние устройства, подключенные к
выводам порта
В
, работающим "на выход ", можно не учитывать
А
вот для внешних устройств, подключенных к
выводам порта
В
, работающим "на вход ", это важно
Если оконечные каскады этих внешних устройств имеют "свою " нагрузку (например, вцепи коллектора или вцепи стока, то подключение подтягивающих резисторов может изменить их режим работы по постоянному току
В
большинстве случаев, такие изменения незначительны (номинал резистора внутренней "подтяжки " – несколько килоом
), нов некоторых случаях, могут быть "бяки ". Если эти "бяки " возможны, то подтягивающие резисторы порта
В
включать ненужно Авот если оконечные каскады внешних устройств, подключенных к
выводам порта
В
, работающим "на вход ", имеют открытый выход (каскады с
открытым коллектором или открытым стоком. "Своя " нагрузка отсутствует, то "подтяжку " можно
/
нужно включить
В
этом случае, внутренние, подтягивающие резисторы порта
В
можно
/
нужно использовать в
качестве нагрузок оконечных каскадов внешних устройств, что очень удобно, так как в
этом случае, внешняя "подтяжка " ненужна (принципиальная схема устройства упрощается. Тоже самое относится и
к внешним, механическим, коммутационным устройствам типа кнопок
/
тумблеров
В
нашем случае, подтягивающие резисторы порта
В
включать ненужно, так как выходы внешних устройств, подключенных к
выводам
RB0
и
RB6
, имеют "свои " нагрузки
Следовательно
,
7
- й
бит регистра
OptionR
нужно установить в 1. То есть, в
регистр
OptionR
нужно записать константу .143 (
1000 1111
). Можно использовать также и
число
8Fh (см таблицу перевода. Так как это число является константой, то запись производится через аккумулятор (
W
). Получается то, что
Вы видите в
тексте программы подтягивающие резисторы порта
В
выключены
, и предделитель
, с коэффициентом деления 128, включен после В 1- м
банке "все дела сделаны " и
делать в
нем больше нечего
Теперь нужно перейти в
основной
(нулевой) банк
bcf Status,RP0
(выбор нулевого банка. Идем дальше
Теперь необходимо определиться с
числовыми значениями тех констант, которые определяют величину интервала времени "выхода " сигнала тонального вызова в
эфир
Реально
, при составлении программы "с чистого листа ",
ПП
START
так и
заканчивается командой Status,RP0

И
это естественно, так как пока неизвестно, что из себя будет представлять таймер
Только после того, как "конструкция " и
принцип работы таймера будут определены и
задействованные в
нем регистры общего назначения, будут "прописаны ", можно рассуждать о
записи
, в
эти регистры, каких- то констант
Забегая вперед, скажу, что таймер "собран " на регистрах общего назначения
SecH
и
SecL
После их "прописки ", а
также и "конструирования ", на их основе, таймера, группа команд записи констант (4 команды) просто- напросто "врезается " в
концовку
ПП
START
(см текст программы. Давайте сделаем так не будем "ставить телегу впереди лошади ", а
предположим
, что программа пишется "с чистого листа " и
принцип работы таймера пока неизвестен Вэтом случае, сразу же после команды Status,RP0

, минуя команды операций с
константами таймера и
рас c
читывая на то, что впоследствии, эти команды будут "вставлены " в
концовку
ПП
START
(таки происходит при реальном составлении текста программы, переходим к
составлению подпрограммы. Итак, в
левом столбце текста программы, "
настукиваем " название подпрограммы (
CYCLE
). Смотрим в
блок
- схему программы
Сначала необходимо проверить, управляющий сигнал включения на передачу есть, или его нет Ранее мы определились, что сигналу включения на передачу соответствует 0, а
выключения
1. Этот сигнал присутствует на выводе, который настроен на работу "на вход ". Следовательно, нужно опросить состояние этого вывода, ив зависимости от результата

93 этого опроса, "уйти " в
один из двух возможных сценариев работы программы
Вот
Вам и
типичный пример необходимости применения команды ветвления
Теперь нужно выбрать, какую из команд ветвления применить Для этого нужно предельно четко и
ясно сформулировать алгоритм производимой логической операции
Он формулируется следующим образом Если нулевой бит регистра (он соответствует выводу) равен 1 (передача выключена, то тональный сигнал формироваться не должен, и
рабочая точка программы должна где- то "
закольцеваться " (напоминаю, что выполнение программы не должно останавливаться, до момента появления, на выводе
RB0,
нулевого уровня
2.
Если нулевой бит регистра
PortB
равен
0 (передача включена, то должно начаться формирование тонального сигнала (программа должна исполняться далее. Эта формулировка достаточно конкретна, ноне совсем
Лирическое отступление
:
любой микроконтроллер, также как и
любая микроЭВМ, это всего- лишь "бездушная железяка ".
И
эта "железяка абсолютно не терпит " неопределенности
Для того чтобы она заработала, необходимо избавиться от любой неопределенности
В
конечном итоге, задача любого программиста сводится к "борьбе " с
неопределенностями и
к умению четко формулировать алгоритмы работы всех составных частей программы
Это присутствует всегда, но особенно ярко это проявляется при работе с
командами ветвления
Итак
, устраняем неопределенность, которая заключается в
том
, что пока, непонятно, каким образом и
куда именно необходимо перейти рабочей точке программы, для того чтобы там "
закольцеваться "? Если речь идет о
том
, что нужно куда- то перейти, то сама собой возникает мысль о
том
, что этот переход можно осуществить, используя команду перехода
Вопрос
:
какую именно команду перехода использовать Анализируем "Закольцовывать " рабочую точку программы в
командах
, расположенных ниже (по тексту программы) нельзя, так как ниже будут располагаться команды, формирующие сигнал тонального вызова, а
в соответствии со сформулированным выше алгоритмом, при наличии, на выводе
RB0,
единицы
, сигнал тонального вызова формироваться не должен
Остается только одно "место " подпрограмма
START
Следовательно
, нужно перейти в
нее
В
этом случае, рабочая точка программы будет "крутиться по кольцу ", "границы " которого от первой команды
ПП
START
и до команды перехода в
ПП
START
Теперь остается только выяснить, какой из двух видов переходов применить (безусловный или условный Условный переход, то есть, переход с
использованием стека, применять нет смысла хотя бы потому, что для возврата по стеку требуется лишняя команда (команда возврата, да и
вообще
, смысла задействовать, для выполнения элементарной "
закольцовки ", стек, нет
Вполне достаточно команды безусловного перехода
goto
В
данном случае (на выводе 1), команда, на каждом "витке ", просто будет "
отфутболивать " рабочую точку программы на первую команду
ПП
START
До тех пор, пока, на выводе 1 не сменится на 0. Итак, устраняем последнюю неопределенность при наличии, на выводе
RB0,
единицы
, должен быть осуществлен безусловный переход в
ПП
START
В
конечном виде, алгоритм проверки формулируется так если бит

0
регистра
PortB
(
вывод
RB0
)
равен
1
(
передача выключена, то должен быть осуществлен безусловный переход в
ПП
START
, а если бит

0
регистра
PortB
равен
0
(
передача включена, то программа должна исполняться далее
.
Всё
Полная определенность
Теперь нужно просто подобрать нужную команду ветвления
Естественно
, что эта команда должна быть бит- ориентированной (происходит обращение к
отдельному биту. Смотрим в
список команд
Таких команд две
btfsc
и
btfss
Команда
btfss
не подходит, так как сразу же после команды ветвления, необходимо будет

94 устанавливать две команды переходов, устанавливать метку и
вообще
, неэффективно "ломать голову по поводу выхода из вилки ". Зачем нужен этот "геморрой "?
А
вот
btfsc
- в
самый раз
В
тексте программы
cus,
посмотрите на первые две команды
ПП
CYCLE
Прочитайте комментарии
Мне к
ним добавить просто нечего
Не правда ли, как просто
Единственное
, что можно добавить словосочетание "программа исполняется далее " означает то, что следующей будет исполняться команда Если мыслить "глобально ", то есть, не "привязываясь " к
данной программе, а
имея ввиду программы вообще, тона месте этой команды может оказаться любая другая команда
Прошу обратить внимание на одну особенность команд ветвления, связанную с
переходами
Суть
:
любая команда ветвления предполагает наличие двух сценариев дальнейшей работы программы
Если одним из этих сценариев является сценарий типа "программа исполняется далее ", то вторым сценарием, в
большинстве случаев (ноне всегда, является сценарий типа "переход куда- тов подпрограмму, наметку, причем, команда, на которую переходит рабочая точка программы по сценарию "программа исполняется далее ", должна быть второй снизу (по тексту программы, от команды ветвления, так как только в
этом случае программа может "исполняться далее ".
В
случае наличия и
на первом, и
на втором "месте " (снизу от команды ветвления) команд переходов, сценарий "программа исполняется далее " не может быть выполнен
В
этом случае, осуществляется либо первый, либо второй переход
Таким образом, сценарий типа "программа исполняется далее " связан с
исполнением второй, после команды ветвления, команды
Идем дальше
Смотрим в
блок
- схему программы
Следующая операция - проверка включения или выключения режима тонального вызова
Ход рассуждений точно такой же, как и
выше
Разница заключается в
следующем
Работа происходит сбитом 6
регистра
PortB
Уровни управляющего сигнала "привязаны " к
другому органу управления
Переход
, с
целью "
закольцовки " рабочей точки программы в "вечном кольце ", осуществляется в
подпрограмму
PRD
Для реализации алгоритма проверки, использована команда
btfss
А
теперь
- потренируйтесь
Постарайтесь самостоятельно понять, "где здесь собака порылась " и
почему нужно организовывать эту проверку в
том виде, в
котором она организована в
тексте программы
(
почему не используется команда. Указанные выше, 2 проверки, идущие подряд одна за другой, выполняют роль своеобразного "сита ". Результат их совместной работы таков, что для того чтобы началось формирование сигнала тонального вызова, необходимо одновременное выполнение 2- х
условий
:
- режим тонального вызова должен быть включен,
- и
р
/
станция должна быть включена на передачу
Подобного рода "сита ", при составлении программ, применяются сплошь и
рядом
Если нужно обеспечить одновременное выполнение, например, 3- х
или
4- х
условий
, то применяются 3 или 4 проверки
В
большинстве случаев, такие проверки "идут друг за другом ", но они могут быть и
разнесены
О
подпрограмме
PRD
Загляните в
блок
- схему программы
ПП
PRD
нужна для того, чтобы, после 3- хсекундной "выдачи " в
эфир сигнала тонального вызова, рабочая точка программы либо "
закольцевалась " в
этой подпрограмме (если передача включена, либо "ушла " на новый "виток " полного цикла программы (если передача выключена. Если текст программы составляется "с чистого листа " и
программист находится на теперешней стадии ее составления, то при проверке включения или выключения режима тонального вызова, в
команде безусловного перехода
goto,
просто указывается название подпрограммы (
PRD
), а
саму эту подпрограмму можно составить позднее

95 То есть, тогда, когда "до нее дойдет дело " (что и
будет сделано в
дальнейшем
). Таким образом, работу по составлению рабочей части программы целесообразно начать с
ПП
START,
а в
дальнейшем
, отрабатывать рабочую часть программы последовательно
То есть, походу исполнения программы
При этом, можно пропускать команды, групп команд и
даже целые подпрограммы, работающие с
содержимым регистров, которые еще не "введены в
бой " (но будут "введены " в
будущем
), в
том числе и
с переходами в
подпрограммы
, которые еще не созданы (но будут созданы в
будущем
). Можно пропускать даже несколько подпрограмм, с
расчетом на их создание
/
проработку в
будущем
(приходит с
опытом
).
В
любом случае, нужно быть уверенным в
том
, что "стратегических ляпов " не допущено
(
блок
- схема программы капитально продумана. Самоучитель по программированию PIC контроллеров для начинающих"
http://ikarab.narod.ru E-mail: karabea@lipetsk.ru

96 8. Пример создания программы (продолжение) Итак, мы остановились на том, что, входе описанных выше проверок, состояния выводов
RB0
и
RB6
анализируются
, ив зависимости от соотношения уровней сигналов на этих выводах, рабочая точка программы либо "закольцовывается " в
ПП
1   ...   13   14   15   16   17   18   19   20   ...   57


написать администратору сайта