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

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


Скачать 3.49 Mb.
НазваниеСистема команд pic16F84A 26 Что такое программа иправила ее составленияПример создания программы автоколебательного мультивибратораДирективы.
АнкорСамоучитель по программированию PIC контроллеров для начинающих (Е.А. Корабельников,2008).pdf
Дата30.01.2017
Размер3.49 Mb.
Формат файлаpdf
Имя файлаСамоучитель по программированию PIC контроллеров для начинающих .pdf
ТипПрограмма
#1195
КатегорияПромышленность. Энергетика
страница28 из 57
1   ...   24   25   26   27   28   29   30   31   ...   57
Retr_1.asm
), а
указанными выше объединениями заняться позднее
После приобретения опыта и
навыков
Теперь вернемся к
счетчику интервала времени сканирования
Его конструкция и
принцип работы должны быть сейчас
Вам понятны
В
соответствии со сформулированным ранее алгоритмом работы устройства, вовремя формирования интервала времени сканирования, рабочая точка программы должна (при наличии активного перепада на выводе) уйти в
ПП
прерываний
То есть, "зона " разрешения прерываний должна включать в
себя именно этот интервал времени
В
начале этой "зоны ", нужно разрешить внешние прерывания
INT
Разрешить их до исполнения команд (или между ними) записи констант, в
регистры счетчика, Sec_L

), можно, нов данном случае, я "привязался " непосредственно к
началу счета
Поэтому
, команды записи константы, в
регистр
IntCon,
расположены именно в
том месте, где
Вы их видите (см текст программы.
В
регистре
IntCon
, биты и 7 установлены в 1 (в остальных, 0). Это и
есть разрешение прерываний все остальные виды прерываний, которыми управляет регистр, запрещены нулями. Общая особенность при разрешении любого вида прерываний, бит глобального разрешения прерываний должен быть установлен в 1. Если прерывания
INT
разрешены
(бит = 1), а
глобального разрешения прерываний нет
(
бит

7 = 0), то никаких прерываний
Вы не дождетесь (в том числе и.
В
конце "зоны " разрешения прерываний, прерывания нужно запретить
Проще всего это сделать, запретив их все (
clrf IntCon
). Запретить все прерывания также можно, установив в 0 один только 7- й
бит регистра IntCon,7

), но зачем, на первых порах, "напрягаться "? Проще сбросить весь байт видело с
концом
Что и
сделано
А
вообще
, это личный выбор каждого
Смотрим в
блок
- схему программы
Теперь нужно обеспечить предварительную подготовку смены раскладки частот для следующего "витка " полного цикла программы
При этом, содержимое регистра
Trigg
можно или декрементировать
, или инкрементировать
Так как речь идет о
проверке на четность (используется только бит. Числовое значение байта может быть любым, то это "что в
лоб
, что полбу. Выбираю инкремент
Самое главное, это ответ на вопрос "Какое это число четное (бит = 0) или нечетное

148 бит = 1)"? От ответа на этот вопрос зависит, в
какой именно сценарий работы программы "улетит " ее рабочая точка
От "витка " квитку" полного цикла программы, будут происходить последовательные смены четных чисел на нечетные (или наоборот, ив соответствии с
этим
, будут меняться "раскладки " частот
После того, как произведен инкремент (см конец текста программы) содержимого регистра (
incf Trigg,F
), можно переходить на "новый ", полный цикл "основного тела " программы START
). Обратите внимание на то, что применена команда, которая не является командой ветвления
В
данном случае, "ветвиться " ненужно Поэтому она и
применена
Итак
, мы "прошли по основному телу " программы, исходя из предположения, что активных перепадов "ухода " в
прерывание
(по входу
RB0/INT)
не поступало
Теперь предположим, что на вывод, от внешнего устройства, поступил активный перепад (от 1 к 0). Если это событие произошло вовремя отработки "зоны " разрешения прерываний, то произойдет условный переход (виртуальная " команда call. Формируется аппаратно) на первую команду
ПП
прерывания
(В, адрес 04h). При этом, в
вершину стека будет скопировано числовое значение адреса команды, следующей за командой, вовремя исполнения которой имел место быть активный перепад "Закладка " этого адреса происходит не в
момент фактического возникновения активного перепада, а
после "полноценной " отработки той команды, в
интервале времени исполнения которой этот активный перепад имел место быть
После того как рабочая точка программы "улетит " на начало
ПП
прерывания
, эта
ПП
будет исполнена
Вплоть до команды (возврат из прерывания) включительно
При этом, происходит возврат по ранее "заложенному ", в
стек
, адресу, после чего этот адрес, по причине дальнейшей ненужности, "убивается " путем его безжалостного удаления из вершины стека
Ироничное замечание упомянутый выше, достаточно банальный, условный переход (пусть даже и
команда
call "виртуальная ") называется "переходом по вектору прерывания ". Любят у
нас мудрить без меры Вот таки возникает, в "нетренированных мозгах ", некий "страшный и
ужасный
, прерывательный вектор ", хотя и
с внушающим уважение названием, но как- тоне слишком "комфортно ложащийся в
мозги ".
C
ие вполне можно сформулировать и
на "нормальном языке ": условный переход, с
помощью аппаратно формируемой команды call, в
ячейку
PC
с фиксированным адресом 04h.
И
все дела
И
вектор не прич м ("
усоп за ненужностью "). Вернемся к
нашим "разборкам ". Теперь необходимо выполнить, сформулированные ранее, "правила игры ".
В
начале
ПП
прерывания
, необходимо сохранить содержимое двух регистров и, а
в конце, восстановить
В
большинстве случаев, этого оказывается достаточным, но если есть такая необходимость
(
а она может быть, то можно сохранить
/
восстановить содержимое и
других "
жизненноважных " регистров
Мотивация
: после возврата из прерывания, содержимое "
жизненноважных " регистров должно быть таким, чтобы работа "основного тела " программы не нарушилась
То есть, их содержимое должно быть таким же, как и
на момент ухода в
прерывание
Для реализации сказанного, в "шапке " программы, нужно "прописать " регистры оперативной памяти со стандартными названиями (рекомендованы разработчиками)
Stat_Temp
и
W_Temp
Процедура сохранения и
восстановления содержимого регистров
W
и
Status
, в
обучающих целях, в
тексте программы, отображена в
полном объеме, хотя в
данном случае, содержимое регистра можно и
не сохранять (а соответственно, и
не восстанавливать. Ив самом деле, после возврата из
ПП
прерывания в "основное тело " программы, число, находящееся в
регистре
W
, не имеет значения (может быть любым, так как "по его верху ", будет записана константа
Поэтому можно смело аннулировать "прописку " регистра, а
заодно и
команды сохранения
/
восстановления содержимого регистра

149 Мало того, тоже самое относится и
к регистру
Status
И
в самом деле, уходы в
прерывания происходит в 0- м
банке
, и
работа
, в
ПП
прерывания
, происходит в
нулевом банке (банк не меняется.
К
тому же, флаги регистра
Status
в программе не задействованы (их состояния неважны. Таким образом, в
данной программе, вообще можно не применять указанные выше процедуры, ноя Вам совсем не советую убирать их "сглаз долой ". Оттого, что
Вы их уберете из текста программы, в
ее работе практически ничего не изменится, но при этом
Вы потеряете возможность визуального, сознательно- подсознательного запоминания стандартной "конструкции "
ПП
прерывания
, что совсем не есть хорошо
Если в
данной
, простенькой программе, без этих процедур обойтись можно, тов других программах они могут, в
обязательном порядке, потребоваться
Смотрим в
блок
- схему программы
Необходимо произвести проверку несущая есть
/
нет
? Подобными проверками мы уже занимались не один раз, так что повторяться не буду
Если несущей нетто осуществляется безусловный переход в
ПП
выхода из прерывания (о ней - позднее. Если несущая есть, то необходимо каким- то образом задержать рабочую точку программы в
ПП
прерывания
В
простейшем случае, можно, после команды EndInt поставить " команду CYCLE
, закольцевав " тем самым рабочую точку программы в "вечном кольце " из 3- х
команд
(сверху вниз
btfsc PortB,0, goto EndInt, goto CYCLE
), нов этом случае, проверки нулевого бита регистра
PortB
будут производиться так быстро итак часто, что это может отразиться на качестве работы
ПП
устройства
В
этом случае, устройство будет сильно подвержено воздействию коротких импульсных помех
Чтобы увеличить его помехоустойчивость, нужно сделать его "слегка " инерционным, то есть, ввести в
его состав некий "фильтр ", который "отсеивал бы " значительную часть импульсных помех
Если речь идет об инерционности, то это означает введение, в
состав "вечного кольца ", подпрограммы задержки с
калиброванным временем задержки (ее величина и
определяет инерционность. При таком "раскладе ", подпрограмма задержки (вместе с
командами записи констант) будет являться "врезкой " в
циклическую
ПП
CYCLE
, которая увеличивает время отработки цикла
ПП
CYCLE
Проще говоря, опрос 0- го бита регистра
PortB
будет производится не так часто, и
с цикличностью, определяемой временем задержки
В
программе
Retr_1.asm
, время отработки цикла
ПП
CYCLE
составляет
5,62 мс (можно проверить в
симуляторе
). Это мой субъективный выбор, можно установить и
какое
- то другое значение, соответствующим образом изменив значения констант
Можно также упростить
ПП
CYCLE
, заменив 2- хразрядный счетчик на 1- разрядный
После того, как будет произведено отслеживание и
отладка программы в
том виде, в
котором
Вы ее видите, можете, для тренировки, сделать эту замену, а
затем произвести соответствующую калибровку времени отработки цикла
ПП
CYCLE
В
тексте программы, найдите
ПП
CYCLE
и посмотрите, как сказанное выше, реализуется на практике
Подпрограммы подобной конструкции мы уже "разбирали " ранее и
добавить к
этому мне нечего
При выходе из
ПП
прерывания
(
см
ПП
EndInt
), нужно обязательно сбросить флаг прерывания (
bcf IntCon,1
), восстановить содержимое "
жизненноважных " регистров и
исполнить команду возврата из прерывания
retfie
Пример
: если уход в
прерывание произошел вовремя исполнения команды SecH,F

, то после возврата из
ПП
прерывания
, рабочая точка программы "встанет " наследующую (после SecH,F
) команду (
goto PAUSE
). После этого, работа в "основном телепрограммы будет продолжена
При отладке программы, Вы увидите как работает стеки сможете проконтролировать его содержимое

150
Пояснение
:
в тексте программы
Retr_1.asm,
Вы не найдете команд переходов в
ПП
TRIGGER
(
аналогия с
ПП
INT
). Это название я
ввел в
текст программы для того, чтобы обозначить начало группы команд выбора направлений ретрансляции (для того, чтобы
Вы легче "ориентировались " в
тексте программы.
Если
Вы не испытываете трудностей при работе с
текстом программы, то это название) можно удалить
Это никак не отразится на работе программы
При работе с
программой
cus
, сначала была выполнена отладка, а
затем
, отслеживание
При работе с
программой
Retr_1.asm
, поступим наоборот, то есть "так, как положено ". Отслеживание работы программы в
ее
"основном теле" Подготовьтесь к
отслеживанию
, как это было описано при отслеживании работы программы (откройте соответствующие окна. Врежьте " в "шапку " программы команду INT

(об этом см выше. Сначала работаем в "основном телепрограммы команду точкой с
запятой
Команду
goto блокировать ненужно Сначала "прогоним " рабочую точку программы потому сценарию ее работы, который определяют настройки
MPLAB
по умолчанию
В
дальнейшем
, рекомендую
Вам начинать отслеживание работы любой программы именно исходя из этого (лишние "телодвижения " отсутствуют. Так как были внесены изменения, производим ассемблирование и
устанавливаем рабочую точку программы на ее начало
Пошагово исполняем программу (
F7
).
Команды
ПП
START
"проходим без осложнений " (линейный участок ").
ПП
START
программы
Retr_1.asm
построена аналогично
ПП
START
программы
cus,
и поэтому останавливаться на ее отслеживании я
не буду, сделайте это сами и
убедитесь
, что, походу ее исполнения, все прерывания запрещаются, вывод
RB0
настраивается на работу "на вход ", вывод
RB2
настраивается на работу "на выход ", включаются подтягивающие резисторы порта
В
и прерывания
INT
будут происходить по заднему фронту внешнего, управляющего сигнала
Первой командой
ПП
TRIGGER
является бит- ориентированная команда ветвления Смотрим в
окно
RAM
По адресу 0Ch адрес регистра
Trigg
в области оперативной памяти, "прописанный " в "шапке " программы, на момент исполнения этой команды, записано число 00h. Следовательно, 0- й
бит регистра
Trigg
установлен в 0, ив соответствии с
алгоритмом работы команды, следующей после нее, должна исполниться группа команд записи константы .251 в
регистр
PortB
Что и
имеет место быть (проверьте и
убедитесь в
этом
). Стукаем " по
F7
"
Доходим " до команды и исполняем ее, осуществив безусловный переход на команду, помеченную меткой (
movlw .197
). Далее, исполняем процедуру записи констант в
регистры
SecH_1 и SecL_1
, команду "врезки " в
ПП
задержки
PAUSE_D
(
clrwdt
) и
устанавливаем рабочую точку программы на команду Далее, для того чтобы выйти из "
закольцовки "
ПП
PAUSE_D,
конечно же, можно "постукать " по клавише, но это займет много времени
Чтобы быстро "проскочить эту закольцовку ", лучше перейти на "автомат ". Назначаем точку остановки на команде .245

, щелкаем по зеленому светофору и
ждем окончания процесса
Рабочая точка "встала " на команду Далее, исполняем все последующие команды и
устанавливаем рабочую точку программы на "врезку "
ПП
PAUSE
(
clrwdt
). Походу этого исполнения убеждаемся, что в
регистры
SecH и записались числа .245
(F5h) и .255 (FFh) соответственно, а
в регистр
IntCon
записалось число .144 (90h/
10010000
). По своей конструкции,
ПП
PAUSE
такая же, как и
ПП
PAUSE_D

151 Значит, назначаем точку остановки на команде IntCon

, включаем "автомат " и
дожидаемся конца процесса
Исполняем команду и убеждаемся, что содержимое регистра
IntCon
изменилось сна. Запоминаем значение числа, записанного в
регистр
Trigg
(в окне
RAM
,
адрес
0Ch), исполняем команду и оцениваем изменение, произошедшее с
содержимым регистра
Trigg
Значение записанного в
регистр
Trigg
числа
, должно увеличиться на 1. Исполняем команду Рабочая точка программы "встанет " на первую команду
ПП
START
То есть, произойдет ее переход на новый "виток " полного цикла "основного тела " программы, к
чему мы и
стремились
Один сценарий работы отслежен
Отслеживаем следующий сценарий
Ищем первую, после команды IntCon
, команду ветвления
Это команда Один сценарий ветвления этой команды мы уже отследили
Отслеживаем второй
Вспоминаем про "уловки ". Заменяем команду на команду Так как внесены изменения, производим ассемблирование и
устанавливаем программу на начало
По этому сценарию, должен произойти безусловный переход наметку Поэтому назначаем точкой остановки команду Запускаем "автомат " и
ждем окончания процесса
Рабочая точка программы "встала " на команду Исполняем эту команду и
следующую за ней команду Убеждаемся, что вовсе биты регистра
PortB
записались единицы (число .255). Далее, этот сценарий отслеживается точно также, как и
первый сценарий
А
раз это так, то зачем "
бестолковкой заниматься "? В "основном телепрограммы, никаких других сценариев работы программы больше нет, следовательно, произведено полное отслеживание
При этом мы убедились в
отсутствии функциональных ошибок, при работе программы в
обеих подрежимах сканирования
Ранее говорилось о
том
, что количество сценариев работы программы зависит от количества команд ветвления
В
общем виде, это верно, но теперь следует уточнить, каких именно команд ветвления
В
группе команд "основного тела " программы, кроме команды ветвления Trigg,0
, Вы увидите еще 4 команды ветвления (
decfsz, incfsz
). Формально, каждая из них "порождает " по 2 сценария, но эти сценарии второстепенны по отношению к
рассмотренным выше, так как они "прокручиваются " внутри подпрограмм задержки (
PAUSE_D и PAUSE
). Таким образом, де- юре, эти команды ветвления являются сценарными, аде- факто, сценарии их работы "локализованы " внутри того, что исполняется при любом "раскладе ". Это можно назвать "глобальным сценарием " (или еще как- то. Таким образом, для того чтобы отследить все "локальные" сценарии, достаточно один раз отследить тот "глобальный" сценарий, в состав которого они входят
.
Отслеживание работы программы в
пределах
ПП
прерывания
. Для того чтобы войти в
ПП
прерывания
, в "шапке " программы, необходимо снять блокировку с
команды
goto INT
(убрать точку с
запятой
) и
заблокировать команду START

(поставить точку с
запятой
). После этого, нужно произвести ассемблирование и
установить программу на начало
При этом, рабочая точка программы "встанет " на команду Исполняем эту команду
Рабочая точка программы "встанет " на первую команду
ПП
прерывания
(
1   ...   24   25   26   27   28   29   30   31   ...   57


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