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

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


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

87
В
этом случае, "прописка " обязательна
Вашему вниманию предоставлена готовая программа, и
по этой причине, вполне понятно, какие именно регистры общего назначения нужно прописывать, а
анализируя текст программы, становится понятными то, зачем они нужны и
какие функции выполняют
А
если программист сидит перед "чистым листом бумаги " и
только приступает к
составлению программы
В
части
, касающейся регистров специального и
общего назначения, это делается так В "шапке " программы, "оптом прописываются " регистры специального назначения
После окончания составления программы, лишние можно удалить
Регистры общего назначения не "прописываются ", так как пока неясно, что "прописывать ". Им можно назначить какие- нибудь названия, которые, походу составления программы, можно в
любой момент изменить (у любого более- менее "набившего руку " программиста, имеется такой "набор " привычных названий, после чего эти регистры "прописываются ". Но это необязательно Можно начать и
с "пустого места ". Например, походу создания текста программы, возникла необходимость в
однобайтном счетчике
Ему тут же придумывается название, например,
ABC
, присваивается адрес (в области оперативной памяти, например, 0Eh и
после этого, в "шапку " программы добавляется строка
ABC equ 0Eh
Всё
Этот регистр "прописан " (введен в
эксплуатацию ") и
с ним можно работать
Таким же образом "рождаются и
вводятся в
эксплуатацию " другие регистры общего назначения, необходимость в "рождении " которых возникает походу составления текста программы
В
конечном итоге, к
концу процесса написания текста программы, в "шапке " программы "
накапливается
/
оседает " какое- то количество регистров общего назначения, к
содержимому которых, походу исполнения программы, с
помощью команд, происходят обращения
В
тексте программы
cus,
таких регистров "накопилось " три
В
других программах, их может быть другое количество
Зависит от замысла
Пошли дальше
В
"шапке " программы, Вы видите строку equ Смысл этой строки заключается в
следующем
Откройте список команд и
обратите внимание на байт- ориентированные команды, ив частности, на букву, которая является составной частью команды
В
зависимости от значения этого параметра (0 или 1), результат исполнения команды может сохраниться либо в
аккумуляторе
(
W
), либо в
том же регистре, с
содержимым которого производится действие (
F
). Для комфортного восприятия текста программы, удобнее, если в
качестве параметра
d
будет указываться не 0 или 1, а
W
или
F соответственно
Примечание
:
с регистром
W
все понятно, это его название воспринимается однозначно, а
вот регистр
F
физически не существует
Буква
F
, в
символьном
(или в
символическом
, или в
обобщенном
) виде, обозначает тот регистр, с
содержимым которого производится действие и
поэтому
, за этой буквой может "скрываться " любой из задействованных в
программе регистров
Например
, команду декремента содержимого регистра, с
сохранением результата декремента в
нем же, можно "изобразить " так ABC,1 но гораздо удобнее она будет восприниматься как ABC,F Для того чтобы перейти к
этому более комфортному восприятию места сохранения результата выполнения команды, в "шапке " программы и "прописывается " строка equ 1

Директива
equ
дает указание если в
тексте программы имеется буква, то ее нужно "воспринять " как
1
Такого же рода манипуляцию можно произвести и
с нулем, поставив ему в
соответствие букву
W
В
этом случаев "шапку " программы нужно добавить equ При написании программы "с чистого листа ", в "шапку " программы, "не мудрствуя лукаво ", можно поместить обе этих строки
По окончании работы над программой, текст программы просматривается на предмет наличия
/
отсутствия
, например, команд, результат выполнения которых помещается в
регистр

88 Если есть хотя бы одна такая команда, то строка equ оставляется в "шапке " программы, а
если их вообще нетто удаляется
То же самое относится и
к строке equ 1
В
тексте программы, результаты выполнения команд сохраняются в
тех же регистрах, с
содержимым которых производятся действия, а
регистр
W
не задействуется
По этой причине строка equ оставлена, а
строка
W equ удалена (хотя, ее можно и
оставить
От этого, в
работе программы ничего не изменится. Идем далее
Строка
RP0 equ 5
С
учетом сказанного выше, становится понятным, что директива
equ
дает указание если в
тексте программы имеется комбинация символов, то ее нужно воспринять как цифру (в данном случае, 5- й
бит регистра
Status
переключение банков.
В
этом случае, команда переключения в
нулевой банк будет выглядеть не как Status,5

, а
как
bcf Status,RP0
(установить в 0 пятый бит регистра, а
команда переключения в
первый банк будет выглядеть не как Status,5
, а
как
bsf Status,RP0
(установить в 1 пятый бит регистра. Таким же образом, при помощи директивы, можно "подменить " номера любых битов регистров специального назначения на стандартные названия этих битов (можно даже придумать свои названия, но зачем это нужно. Названия битов запоминаются гораздо легче, чем номера битов, которые, к
тому же, и
дублируются
(регистров много, а
битов всего 8), поэтому рекомендую
Вам оперировать не номерами битов, а
их названиями
К
таким "вещам " нужно привыкать с
самого начала
Естественно
, что имеет смысл присваивать названия только тем битам, которые задействованы в
программе
В
программе
cus
, задействован только один такой бит (
RP0
). Они "прописан ". Если возникнет такая необходимость, то ходу написания программы, можно заменять номера битов на их названия (естественно, с "пропиской ").
А
можно изначально прикинуть, какие биты могут потребоваться, "оптом прописать " их, а
затем
, по окончании работы над текстом программы, убрать те названия битов, обращений к
которым нет
Из сказанного можно сделать вывод ничего плохого не произойдет, если в "шапке " программы будет "прописано " то, что в
программе не используется (ошибки нет.
А
вот об обратном такого сказать нельзя если в
рабочей части программы будет использовано то, что в "шапке " программы не "прописано ", обязательно "заругается " и
укажет
Вам на это
То есть, после ассемблирования
, Вы получите сообщение об ошибке, и "откажется " создавать HEX- файл
И
еще один вывод, директива
equ
ставит в
соответствие одно другому название регистра его адресу, название бита его номеру, название константы (константе тоже можно присвоить название) ее значению
Применение этой директивы позволяет составить удобный, для работы и
восприятия
, текст программы
И
в самом деле, зачем каждый раз, при обращении, например, к
регистру
, указывать его адрес в
области оперативной памяти (можно сделать итак, когда этот регистр можно один раз "прописать ", а
затем указывать только его название
Этому названию
MPLAB
автоматически поставит в
соответствие адрес того регистра, которому оно присвоено (найдет его в
области оперативной памяти.
И
последнее
, что нужно указать в "шапке ": "точку входа " в
программу и "точку входа " в
подпрограмму прерывания
О
последнем будет отдельный разговор
Так как в
программе
cus
прерывания не используются, то и "точку входа " в
подпрограмму прерывания указывать ненужно Для того чтобы задать "точку входа " в
программу
, необходимо, при помощи директивы, указать, с
какого адреса (в счетчике команд) нужно начать исполнение программы 0
- начать с
нулевого адреса.
В
подавляющем большинстве случаев, указывается нулевой адрес, но можно указать и

89 другой
В
последнем случаев памяти программ, все команды программы смещаются вниз на количество ячеек, указанное в
рабочей части директивы (применяется редко ив специфических случаях.
Директива
org
подобна стартовому пистолету после того, как она "сделает свое дело " можно начинать исполнение рабочей части программы
Если рабочая часть программы начинается с
ПП
START
, то никаких дополнительных "пинков " ненужно программа начнет исполняться с
ПП
START
, как говорится, "своим ходом ".
А
если
ПП
START
находится где- тов "дебрях " текста программы (например, в
середине текста, то нужен "пинок ", в
качестве которого используется команда START
В
соответствии со сказанным, в
программе
cus
, после директивы 0
, команда ненужна, нов обучающих целях, я
ее убирать не стал, так как во многих случаях, эта команда нужна
Пусть она
Вам немного "глаза помозолит ". Хуже от этого не будет
Теперь о
синтаксисе
В
"шапке " программы, названия "того- сего " могут быть указаны в
удобной для программиста форме
Например
, в "шапке " программы, указано название регистра
IntCon
Это означает то, что в
рабочей части программы, при обращении к
этому регистру, обязательно должны буквально соблюдаться правила написания этого слова
Если
Вы укажете его название как
INTCON
или
Intcon
, то после ассемблирования получите сообщение об ошибке
Если бит "прописан " как, то именно в
таком виде название этого бита должно "фигурировать " в
рабочей части программы
Если
Вы там укажете его название как
rP0
или
Rp0
, то опять же, получите сообщение об ошибке
Сказанное относится как к
названиям рабочих битов, таки к названиям битов флагов
Примечание
:
в тексте программы
cus,
биты флагов не используются (операций с
флагами нет. Названия регистров
W
и
F
можно указывать и
с большой, и
с маленькой буквы
Например
, если в "шапке " указана буква, тов рабочей части программы можно писать или
F
Ошибки не будет
То же самое распространяется на адреса и
директивы
Например
, можно написать адрес регистра как, 0cH, 0ch, 0Ch
, а
директиву как, Equ,
EQu, EQU ...
В
рабочей части программы, названия подпрограмм (и меток) должны буквально совпадать с
названиями этих же подпрограмм (меток, которые указываются в
командах переходов
Например
, имеется подпрограмма
START
Если
, при переходе в
эту подпрограмму, в
команде перехода, указано (
goto Start
, а
не
goto START
), то
MPLAB
выдаст сообщение об ошибке
Названия подпрограмм (меток) придумывает программист
Он может придумать, например, название
Start_1
Главное
, чтобы в
командах переходов, это название было бы точно таким же
Рабочая часть программы. Рабочая часть программы начинается с
подпрограммы
START
, которая, в
свою очередь, начинается с
подготовительных операций и
заканчивается записью, в
регистры общего назначения, констант, задающих время работы таймера
Так как запись этих констант не требует никаких предварительных установок, то эту группу команд можно разместить, например, в
начале
ПП
START
или "врезать " ее между командами подготовительных операций (то, о
чем говорилось ранее. Результат будет одними тем же
В
данном случае, я
разместил эти группы команд так, как указано в
тексте программы
ПП
START
начинается с
команды
clrf Смысл этой команды заключается в
следующем
: вывод
RB0
порта
В
задействован как вход
Одновременно
, вывод
PB0
является входом внешнего прерывания (
INT
).
К
тому же, вывод, по которому организуется прерывание по изменению уровня сигнала на выводах, также задействован как вход
О
прерываниях разговор будет позже, а
пока просто примите это к
сведению

90 Хотя в
программе
cus
и не предусмотрен уход в
прерывания
, специалисты фирмы Microchip рекомендуют, в
этом случае (и вообще, в
случаях
, когда задействованы выводы
ПИКа
, участвующие в
организации прерываний, и
когда хотя бы один из них, работает на вход) глобально запретить прерывания
Для этого достаточно установить в 0 седьмой бит регистра (глобальный запрет прерываний, но чаще всего, сбрасывается в 0 весь байт регистра, что
Вы и
видите в
тексте программы (это, как бы, "двойной запрет " прерываний, см распечатку регистра. На первых порах, команду можно всегда вставлять в
начало программы, в
которой не предусмотрен уход в
прерывания
(или предусмотрен, но позднее, особо не задумываясь, нужна она или нет
Хуже от этого не будет, а "
перестраховочка " не помешает
Следующая команда
clrwdt сброс сторожевого таймера. Так как сторожевой таймер включен (см биты конфигурации, то его, походу исполнения программы, нужно периодически сбрасывать
Напоминаю
, что сторожевой таймер представляет собой "немудреный " RC - одновибратор
(
ждущий мультивибратор) с
перезапуском
Если его периодически не перезапускать
(не сбрасывать, то он закончит формирование импульса, и
по заднему его фронту, произойдет сброс программы на начало, то есть, переход на первую команду
ПП
START
Таким образом, если программа, по каким- то причинам, "зависнет ", то
WDT
выведет ее из этого состояния
В
этом и
заключается основной смысл его применения
Так вот, рассматриваемая сейчас команда является первой из нескольких таких же команд, разбросанных " по тексту программы, что вполне объяснимо, так как
WDT
нужно периодически сбрасывать, чтобы он не закончил формирование импульса
Если программа работает нормально (не "зависает "), то
WDT
никогда не закончит формирование своего импульса, так как он будет периодически перезапускаться
Ниже по тексту программы, располагается группа из шести команд
Это и
есть основные команды подготовительных операций
1.
Выводы
RB0
и
RB6
должны работать на входа выводbRB2bдолжен работать на выход
Следовательно
, речь идет о
регистре
TrisB
Регистр
TrisA
"со счетов сбрасываем ", так как выводы порта
А
не задействованы, и
как именно они будут работать "по барабану ". Необходимо определиться с
подтягивающими резисторами, предделителем
, активными фронтами и
тактовыми сигналами, то есть c содержимым регистра
OptionR
Оба этих регистра (и) расположены в 1- м
банке
(см область оперативной памяти. По умолчанию, программа (начиная с
первой команды
ПП
START
) начинает исполняться в- м
банке
, следовательно, прежде чем работать с
содержимым регистров
TrisB
и
OptionR
, необходимо перейти в 1- й
банк
, что и
делается при помощи первой команды из этой группы команд
bsf Status,RP0
(установка 1- го банка. Напоминаю, что 5- му биту этого регистра, в "шапке " программы, присвоено название
RP0
(
то
, о
чем говорилось ранее, и
поэтому в
команде можно указать не номер бита, а
более удобное для восприятия текста программы, его название
Итак
, переход в 1- й
банк осуществлен
Далее все очень просто устанавливаем 0- й
и
6- й
биты этого регистра в 1 (работа "на вход "), а
остальные в 0 (работа на выход "). Собственно говоря, в
ноль нужно установить только 2- й
бит
, но так как выводы
RB1,3,4,5,7
не задействованы, и
по этой причине, не имеет значения, как именно они будут работать, то установим их "всем скопом " видело с
концом
Бинарное число, которое соответствует такой установке (
0100 0001
) переводим в
более компактную форму
В
данном случае, число переведено из бинарной системы исчисления в
десятичную
(см имеющуюся у
Вас таблицу. Получилось .65 (вспоминайте точка перед числом признак десятичного числа.
А
можно оставить его в
бинарной форме или перевести в 16- ричную

91 Это "дело вкуса " программиста
Данное число определяется (назначается) программистом, следовательно оно будет называться константой
Запись
, в
регистр
TrisB,
числа
.65 происходит в 2 приема, так как за один прием записать в
него константу нельзя
Сначала константа
1   ...   12   13   14   15   16   17   18   19   ...   57


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