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

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


Скачать 3.49 Mb.
НазваниеСистема команд pic16F84A 26 Что такое программа иправила ее составленияПример создания программы автоколебательного мультивибратораДирективы.
АнкорСамоучитель по программированию PIC контроллеров для начинающих (Е.А. Корабельников,2008).pdf
Дата30.01.2017
Размер3.49 Mb.
Формат файлаpdf
Имя файлаСамоучитель по программированию PIC контроллеров для начинающих .pdf
ТипПрограмма
#1195
КатегорияПромышленность. Энергетика
страница19 из 57
1   ...   15   16   17   18   19   20   21   22   ...   57
1 меняется на 0), должен быть запущен некий счетчик времени
(
таймер
), который отмеряет приблизительно 3 секунды
По окончании формирования этого интервала времени, должно быть выполнено следующее если р
/
станция включена на передачу, то рабочая точка программы должна "уйти в
вечное кольцо " подпрограммы (ее еще нет
Не "родилась " еще
Мы просто дали ей название, а
что в
ней "тайна покрытая мраком ") и
выйти из него при переключении с
передачи на прием (переход на "новый ", полный цикл программы, если р
/
станция включена на прием, то рабочая точка программы сразу же должна уйти в "вечное кольцо " подпрограммы
START
и выйти из него при переключении с
приема на передачу (см блок- схему программы.
Детализируем
Так как сначала нужно сформировать трехсекундный интервал времени "выдачи " сигнала тонального вызова в
эфир
, а
только после этого производить "уход в
вечное кольцо ", то группа команд, производящих операции с
таймером
, должна быть расположена в
тексте программы сразу же после последней команды
ПП
PAUSE_2
, а
группа команд
ПП
PRD
должна следовать сразу же после последней команды группы команд, производящих операции с
таймером
Теперь порядок следования ясени можно перейти к
конструированию таймера
Для тех, кто хорошо усвоил предыдущую информацию, должно быть понятно, что если речь идет о
формировании трехсекундного интервала времени, то необходимо "родить " счетчик, который подсчитывал бы количество периодов (это и
есть то, что я
называю таймером. Так как необходимо сформировать фиксированный интервал времени и
после этого "уйти " в
сценарий "программа исполняется далее " (перейти в
ПП
PRD
), то очевидно, что счетчик можно построить "по образу и
подобию " рассмотренного выше счетчика (
см
ПП
PAUSE_1
и
PAUSE_2
).
В
этом случае, все очень просто все 3 команды подпрограммы, например,
PAUSE_1
(вместе с
названием
ПП
) просто вставляются (копируются) в
текст программы сразу же после команды Теперь нужно "навести порядок ".
Название
ПП
(
PAUSE_1
) необходимо либо заменить (текст программы не должен содержать две
ПП
с одинаковым названием, либо удалить из текста программы
Кроме того, нужно определиться, на какую
ПП
(или метку) необходимо осуществить безусловный переход (
goto
)? Считать необходимо количество периодов, следовательно, для организации "
закольцовки " счетчика, формально, нужно перейти на ту команду, с
которой начинается формирование периода
То есть, на команду Посмотрите в
текст программы
cus
Эта команда не является первой командой подпрограммы, иона ничем не помечена (метка не установлена. Для того чтобы на нее перейти, необходимо придумать какое- нибудь название для метки и "пометить " ей данную команду

101 Например,
Metka_1 bcf После этого, можно осуществить безусловный переход наметку. Это конечно сделать можно, но есть более выгодный вариант - переход в
ПП
CYCLE
В
этом случае, задействуются команды обеих проверок, которые рассматривались выше
Этот вариант выгоден тем, что если выключение с
передачи происходит вовремя формирования сигнала тонального вызова вовремя- хсекундного интервала времени, тов момент перехода с
передачи на прием, формирование сигнала тонального вызова тут же прекращается
За счет "
закольцовки " рабочей точки программы (уход в "вечное кольцо ") в
ПП
START
(зона " кольца от 1- й
команды
ПП
START
до команды START

).
В
этом случае, метку выставлять ненужно Вслучае перехода на команду PortB,2

, "помеченную " меткой, трехсекундный интервал сформируется полностью, и
только после этого рабочая точка программы "уйдет в
вечное кольцо "
ПП
START
С
практической точки зрения, вариант с
переходом наметку неудобен тем, что в
некоторых случаях, пьезоэлектрический излучатель будет выдавать тональный сигнал тогда, когда передатчик не работает (работа на прием, что не совсем удобно для пользователя
Итак
, осуществляем безусловный переход в
ПП
CYCLE
(заменяем команду на команду CYCLE
). Название подпрограммы (
PAUSE_1
), по причине ненужности (безусловный переход осуществляется в
ПП
CYCLE
), из текста программы убирается
Таким образом, все команды программы, от 1- й
командой
ПП
CYCLE
и до команды SecL,F
, можно считать "врезкой " в "кольцо " циклической
ПП
задержки
CYCLE
, которая "проходится " рабочей точкой программы за время, равное одному периоду сигнала тонального вызова "Старую " "врезку " (
clrwdt
) можно удалить, так как, при формировании периода, и
без этого сбрасывается часто
Теперь можно сформировать трехсекундный интервал времени
Период тонального сигнала равен 690 мкс (см выше. Таким образом, необходим счетчик, считающий, как минимум, до 3000000:690=4347,826 округляем) =4348. Грубая прикидка ": при применении стандартной
ПП
задержки
(полный цикл
ПП
= 3 м
ц
.), значение константы, записываемой в
назначенный
, в
качестве счетчика, регистр общего назначения, должно быть 4348:3= приблизительно 1450. Максимальное значение константы, которую можно "заложить " в
один регистр, равно .255 На одном регистре общего назначения, при использовании хитроумной "врезки " типа дополнительной
ПП
задержки
, собрать такой счетчик, конечно же, можно, но это не самый лучший выход из положения (потребуется много команд. Гораздо удобнее и
проще применить двухбайтный счетчик (не путать с
двумя однобайтными счетчиками. Такой счетчик считает дохи, сего помощью, можно сформировать
(
применительно к
нашему случаю) не только трехсекундный интервал времени, но и
гораздо больший
Если речь идет о
нескольких байтах, то нужно определить порядок их старшинства
Старший байт пометим буквой, а
младший
, буквой
L
Примечание
:
такого рода пометки - стандарт, хотя можно и
придумать что- нибудь свое
Если счетчик трехбайтный
, то добавляется буква - средний байт (порядок старшинства
H,
M, L
), а
если четырехбайтный, то добавляются буквы - "старший старшего " (порядок старшинства
HH, H, M, L
). Под это дело, в "шапке " программы, "прописываем " регистры общего назначения с
названиями
SecH
(в нем "лежит " старший байт) ив нем "лежит " младший байт) и
назначаем им адреса в
области оперативной памяти
Например
:
0Dh
и
0Eh
соответственно
Вот
Вам и
ответ на вопрос откуда, в "шапке " программы, взялись регистры
SecH
и
SecL
?
В
части
, касающейся рассматриваемой группы команд, получилось то, что
Вы видите в
тексте программы
cus
Давайте разберемся с 2- байтным счетчиком (что это такое и
откуда что взялось. Стандартный принцип организации работы 2- байтного вычитающего счетчика
- сначала декрементируется содержимое регистра младшего байта,

102
- а
после его очищения (в счетчике - ноль, декрементируется содержимое регистра старшего байта
Примечание
:
N- байтный счетчик может называться N- разрядным счетчиком
В
последнем случае, имеется ввиду количество байтов
Строго говоря, такое определение удобно, ноне вполне корректно
Имейте это ввиду
Далее
, я
буду использовать оба этих понятия
Именно таки "закаляется сталь
/
приобретается иммунитет " (организмы должны быть стойкими "). Декремент счетчика младшего разряда будет происходить каждый раз после формирования периода тонального сигнала, а
декремент счетчика старшего разряда будет происходить через каждые
256
периодов тонального сигнала, в
момент смены, в
младшем разряде счетчика, числа
.255
на число
.0
Сигналом окончания формирования трехсекундного интервала времени является очищение счетчика старшего разряда, после чего рабочая точка программы должна "уйти " в
сценарий "программа исполняется далее ". По своей сути, этот "механизм " ничем не отличается от "механизма " работы счетчика, собранного, например, на микросхемах счетчиков (...
ИЕ
...) и
тот
, кто сними работал, без особого труда поймет, о
чем идет речь
В
регистры
SecH
и
SecL
, нужно записать какие- то константы
Нужно определиться сих числовыми значениями
Для того чтобы "отмерить " 3 сек, 2- хразрядный счетчик должен посчитать 4348 периодов
(
см выше. Счетчик младшего разряда декрементируется каждый период
Если установить в
нем константу, например, .255, тов процессе последовательного декрементирования
, после установки числа .0, произойдет один декремент содержимого счетчика старшего разряда
Затем
, в
счетчике младшего разряда, происходит переход от .0 к .255 и
все повторяется снова
И
так происходит много раз (счет "по кольцу "). Пока не обнулится счетчик старшего разряда
Таким образом, при прохождении 4348 периодов, должно произойти примерно 17 декрементов содержимого счетчика старшего разряда
Следовательно
, для того чтобы очистить счетчик старшего разряда примерно засек, необходимо записать, в
регистр
SecH
, константу .17
В
данном случаев счетчик младшего разряда записывается максимально возможное значение константы (.255), которое, по этой причине, условно можно приравнять единице значения константы старшего разряда
Таким образом, в
счетчик старшего разряда необходимо заложить "прикидочную " (грубую ") константу .17 - .1 = .16
Обращаю
Ваше внимание наследующее Между первой командой
ПП
CYCLE
и командой располагаются не только отдельные команды, но и
целых две циклические подпрограммы
Подпрограмма
CYCLE
классифицируется как циклическая подпрограмма задержки, с "массивной врезкой ", включающей в
себя две циклические
ПП
задержки
PAUSE_1
и
PAUSE_2
Вот
Вам и
наглядная иллюстрация того, о
чем я
говорил ранее в
состав "врезки " могут входить не только отдельные команды, но и
целые циклические подпрограммы
В
циклическую
ПП
задержки
, образно выражаясь, можно "врезать все что угодно. Главное при этом то, чтобы после этого,
ПП
задержки не "потеряла свою жизнеспособность" и обеспечивала нужное время задержки. Если говорить конкретно о
циклической
ПП
CYCLE
, то можно сделать следующий вывод врезка " подпрограммы
CYCLE
работает по заданному разработчиком алгоритму и
обеспечивает полный цикл этой подпрограммы, равный периоду сигнала с
частотой
1450 Гц мкс.
2- хразрядный счетчик отсчитывает число периодов, "помещающихся " в
трехсекундном интервале времени, и
по его окончании, осуществляется переход в
сценарий "программа исполняется далее ". Для полного счастья ", остается только детально разобраться с
константами трехсекундного счетчика (таймера. Чтобы излишне не мудрствовать, "привяжусь " к
тем значениям констант, которые были указаны выше

103 То есть, .255 в
младшем разряде счетчика и .16 в
старшем
С
учетом того, что "прикидка " производилась "грубо ", ив результате этого, реальное время "выхода " в
эфир сигнала тонального вызова несколько больше, чем расчетное, я
на единицу уменьшил числовое значение константы счетчика старшего разряда и
сделал ее равной .15. То есть, в
этом случае, сигнал тонального вызова будет "выдаваться " в
эфир в
течение времени немного меньшего, чем 3 сек "На фоне слова приблизительно ", это приемлемо
Лично я, решил так, а
другой человек может принять другое решение
Например
, можно уменьшить числовое значение константы счетчика младшего разряда, а
числовое значение константы счетчика старшего разряда не менять, или перейти к
другому соотношению числовых значений констант, или вообще задать другое значение интервала времени "выхода " в
эфир сигнала тонального вызова
Если
, как в
данном случае, точной калибровки не требуется, то достаточно и
приблизительного расчета, подобного приведенному выше
То есть, рассчитанные ранее константы, можно "смело закладывать " в
программу
, ив дальнейшем, не тратить время на проверку истинного значения трехсекундного интервала времени в
симуляторе
Естественно
, что в
этом случае, нужно быть уверенным, что расчеты произведены правильно
Если возникают сомнения по поводу правильности выбора числовых значений времязадающих констант, то милости просим в
симулятор
Он для этого и
существует
Если же речь идет о
формировании калиброванных (точных) интервалов времени (в нашем случае, времени полупериодов, тов большинстве случаев, без проверки их значений в
симуляторе и
соответствующей "рихтовки ", не обойтись
Итак
, "окончательно и
бесповоротно " назначаю константа старшего разряда счетчика =
.15
, константа младшего разряда счетчика = Теперь возникает вопрос "
В
какое место текста программы нужно врезать группу команд записи констант "? Ответ на этот вопрос был дан ранее, и
поэтому "врезаю " эту группу команд в
концовку
ПП
START
Вот
Вам и
ответ на вопрос "Откуда взялась, в
концовке
ПП
START
, группа команд записи констант и
почему она выглядит именно так "? Если производится последовательная запись констант в
несколько регистров, то порядок этой записи не имеет значения
.
Применительно к
данному случаю, это означает то, что сначала можно записать константу в
регистр
SecH
, а
потом
, в
регистр
SecL
или наоборот
Что получается
А
получается это Декремент содержимого 2- хразрядного счетчика производится при наличии, на
НЧ
выходе устройства, единичного уровня, так как рабочая точка программы "заходит в
этот счетчик " вовремя формирования положительного полупериода
Во время формирования 3- хсекундного интервала времени, после перехода рабочей точки программы в
ПП
CYCLE
, установка нулевого уровня, на
НЧ
выходе устройства, происходит после исполнения команды Далее, с
помощью
ПП
PAUSE_1
, этот уровень фиксируется на время отработки полупериода
Далее
, после исполнения команды PortB,2

, на
НЧ
выходе устройства, устанавливается единичный уровень
Далее
, с
помощью
ПП
PAUSE_2
, этот уровень фиксируется на время отработки полупериода
Далее
, происходит декремент содержимого 2- разрядного счетчика
Если результат декремента неравен нулю, то происходит переход в
ПП
CYCLE
(
goto CYCLE
) и
все повторяется снова и
снова
, до тех пор, пока, с
момента включения на передачу, не пройдет примерно 3 сек
Посмотрите в
текст программы
cus
После
4- х
команд
2- хразрядного счетчика, Вы видите команду Именно на эту команду переходит рабочая точка программы после того, как счетчик старшего разряда очистится, то есть, завершится формирование 3- хсекундного интервала времени "выхода " тонального сигнала в
эфир
Этой командой осуществляется смена единичного уровня, на
НЧ
выходе устройства, на нулевой

104 Это сделано для того, чтобы после очищения счетчика старшего разряда, закончить формирование положительного полупериода
Собственно говоря, эта команда вставлена в
текст программы "для порядка " и
без нее вполне можно обойтись (убрать. Ив самом деле, какая разница, какой уровень "выставлен " на
НЧ
выходе устройства после формирования 3- хсекундного интервала времени "выхода " тонального сигнала в
эфир
(см разделительный конденсатор Эту команду можно оставить, а
можно и
удалить
Далее
, рабочая точка программы "влетает " в
ПП
PRD
, которую сейчас предстоит создать
Напоминаю
, что она должна делать
В
этой
ПП
, рабочая точка программы должна уйти в "вечное кольцо " и
выйти из него в
момент переключения с
передачи на прием, с
последующим переходом на новый цикл программы "Механизм " функционирования "вечного кольца " рассмотрен ранее (см. "вечное кольцо "
ПП
START
).
И
в
ПП
PRD
он точно такой же
Разница только в
деталях
: так как "
закольцовка " происходит внутри
ПП
PRD
, то команда безусловного перехода должна обращаться к
ПП
PRD
, и
при опросе состояния вывода
RB0,
вместо команды
btfsc,
используется команда (если применить, то будет "вилка "). Если речь идет о
длительной "
закольцовке " (что и
имеет место быть, то обязательно нужно периодически сбрасывать
WDT
В
"вечном кольце "
ПП
START
, это делалось с
помощью команды, расположенной в
группе команд подготовительных операций
Примерно также нужно поступить и
по отношению к
ПП
PRD
То есть, нужно "врезать " команду
clrwdt
в цикл "вечного кольца " этой подпрограммы
В
данном случае, команду
clrwdt
можно "пристроить " единственно разумным способом - сверху от команды ветвления, с
переносом названия подпрограммы
PRD
на команду
clrwdt
Посмотрите
, как это выглядит в
тексте программы
cus
Необходимость применения команды
clrwdt
обусловлена тем, что время включения на передачу может быть бОльшим
, чем 2,3 сек
Первые
3 команды
ПП
PRD
можно классифицировать так циклическая
ПП
задержки
, с "врезкой " из одной команды, с "уходом в
вечное кольцо " и
с выходом из него по внешнему управляющему сигналу
Для сценария типа "
закольцовка ", цикл такой подпрограммы равен 3 м
ц
.+1 м
ц команды = 4 м
ц и
поэтому срабатывания
1   ...   15   16   17   18   19   20   21   22   ...   57


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