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

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


Скачать 3.49 Mb.
НазваниеСистема команд pic16F84A 26 Что такое программа иправила ее составленияПример создания программы автоколебательного мультивибратораДирективы.
АнкорСамоучитель по программированию PIC контроллеров для начинающих (Е.А. Корабельников,2008).pdf
Дата30.01.2017
Размер3.49 Mb.
Формат файлаpdf
Имя файлаСамоучитель по программированию PIC контроллеров для начинающих .pdf
ТипПрограмма
#1195
КатегорияПромышленность. Энергетика
страница34 из 57
1   ...   30   31   32   33   34   35   36   37   ...   57
MPLAB,
нужно щёлкнуть по слову, а
в раскрывшемся списке, щёлкнуть по строке Откроется окно Window

, в
котором
Вы увидите область
EEPROM
памяти данных
В
ней можно определить и
адрес
, и
содержимое любой ячейки
Если после открытия файла примера "программы ", Вы откроете окно Window

, то во всех ячейках, Вы увидите значения чисел, установленных по умолчанию FFh, хотя, казалось бы, в
соответствии с
текстом программы, в
части из них, должны "лежать " числа, отличные от.
В
чем дело
А
дело в
том
, что если ассемблирования текста программы ни разу не производилось, тов окне Вы увидите, во всех ячейках, значения чисел, установленных по умолчанию (FFh). Если текст программы проассемблирован
, тов том случае, если
EEPROM
память данных в
программе не задействована, то будет тоже самое
Если проассемблирован текст программы, в
которой ячейки
EEPROM
памяти данных задействованы, то после ассемблирования
, Вы увидите, в
этих ячейках, те числовые значения, которые "дислоцируются " в
рабочей части директивы в 16- ричной форме исчисления, без указания буквы h). Если это символы, то они будут указаны в
виде чисел
Обращаю
Ваше внимание наследующий, общий принцип
:
в окнах, показывающих содержимое области оперативной памяти, памяти программ и EEPROM памяти данных, отражается результат последнего ассемблирования
. То есть, если в
текст программы внесены изменения, и после этого,

ассемблирование не производилось, то проконтролировать эти изменения нельзя. Вопрос "Если изменения вносятся не в
текст программы, а
в комментарии или в
оформление программы (вовсе то, что располагается правее точек с
запятыми
), то нужно ли, для того чтобы сохранить эти изменения, производить ассемблирование "? Ответ есть 2 варианта сохранения изменений в
комментариях и
/
или в
оформлении программы
Первый вариант произвести ассемблирование
В
этом случаев файле ничего не изменится (
MPLAB
"не видит " ничего, что расположено правее точек с
запятыми
). Значимая часть программы, в
которую не внесены изменения, просто "
перезапишется ", но при этом, будет обновлено то, что расположено правее точек с
запятыми
Второй вариант так как файл обновлять ненужно, то можно сохранить, указанные выше изменения, только в ASM-
файле
Для этого, нужно произвести стандартное действие в
главном меню
MPLAB,
нужно щёлкнуть по слову, а
в выпадающем списке, по строке
Save
На первых порах, проще всего (чтобы не "распылять внимание "), после любых изменений, внесенных в
тексте программы, производить ассемблирование
Вернемся кокну Для того чтобы увидеть результат использования директивы, с
учетом сказанного, текст программы (файл) нужно проассемблировать
Если
Вы попробуете сделать это, то получите сообщение о 21 ошибке
При этом, в
окне
EEPROM ничего не изменится (во всех ячейках FFh), что является закономерным результатом неисполнения требований, предъявляемых к
оформлению текста программы

176
MPLAB
"заругался " абсолютно обоснованно, так как программа неправильно оформлена и
поэтому
, "сего точки зрения " (и по факту тоже, она является "неполноценной ". Вопроса как же в
этом случае, при помощи симулятора
, убедиться в
том
, что директивы
DE
исполняются
? Ответ никак
Вывод
: проверить результаты исполнения директив
DE
можно только в
том случае, если текст оформлен в
виде
"полноценной" программы, и этот текст проассемблирован без ошибок. Это относится не ко всем директивам
Например
, результаты исполнения директив, end и т
д
.), в
симуляторе
, проконтролировать нельзя, так как контролируются изменения только того, что отображается в "контрольных " окнах, а
не результаты действий, обеспечивающих функционирование программы
Но это не свидетельствует о
том
, что "самоустранился от этого дела ". Это не так
Если "что- то пошло наперекосяк ", то, после ассемблирования
, выдаст соответствующие сообщения об ошибках и
/
или предупреждения
Обращаю
Ваше внимание на пояснения, находящиеся в
тексте примера между "шапкой " программы " и
ее рабочей частью
Вы видите варианты заполнения ячеек
EEPROM
памяти данных, для 2- х
случаев "оформления " директив
DE
Это именно то, что будет наблюдаться, в
окне
EEPROM Window
, после проведения успешного ассемблирования
, если предположить, что текст примера оформлен как "полноценная " программа
Разбираем текст программы. Дои после интересующих нас операций, программа может работать множеством различных способов и
реализовывать какие угодно замыслы программиста
В
данном случае, это неважно Важно то, как именно происходит работа с
EEPROM
памятью данных
На момент начала исполнения рабочей части программы, 46 ячеек
EEPROM
памяти заполнены числами (сработала " директива, а
остальные ячейки заполнены числами, устанавливаемыми по умолчанию (FFh). Из всех этих ячеек, нас интересует только одна - третья, с
адресом
02h, так как в
ней
, предварительно, записано число, с
которым нужно производить интересующие нас операции или .100).
В
этом смысле, все остальные, предварительно записанные числа, можно рассматривать как "архитектурные излишества ", не влияющие на ход исполнения программы
В
данном случае, уходов в
прерывания нет
Исполнение программы начинается стандартно
С
ПП
START
В
рабочей части программы, я
не стал обозначать начало этой
ПП
Имейте это ввиду
После "запуска в
эксплуатацию " рабочей части программы, она исполняется до тех пор, пока не возникнет необходимость в
работе с
EEPROM
памятью данных
Если такая необходимость имеется, то рабочая точка программы должна "перейти " на начало исполнения группы команд, которая работает с
EEPROM
памятью данных
В
данном случае, переход на это "начало " происходит "естественным образом " (на "линейном участке программы ". Без задействования. Если используются команды переходов, то переход на это "начало " может происходить из любого "места " программы
В
этом случае, группе команд, обеспечивающей работу с
EEPROM
памятью данных, нужно либо "присвоить статус " подпрограммы, либо выставить метку на первой команде этой группы
Разбираемся стем, что же должна из себя представлять эта группа команд
В
соответствии со сформулированной выше задачей, это должна быть группа команд, обеспечивающая считывание числа, из 3- й
ячейки
EEPROM
памяти данных, в
регистр оперативной памяти
Следовательно
, под это дело, нужно задействовать один из регистров общего назначения
Назначаем ему название, например, и "прописываем " его в "шапке " программы по адресу, например, 0Ch.

177 Теперь мы конкретно знаем, откуда считывать и
куда "закладывать на временное хранение " результат этого считывания
Остается только выяснить, как конкретно это сделать Вы видите перед собой "кучу туманных " команд и
по всей видимости, думаете, что "разборки " сними будут достаточно трудоемкими
Ничего подобного
Группа команд чтения данных из
EEPROM
памяти данных (и записи тоже) является стандартным "набором" команд, рекомендованных к
применению разработчиками
То есть, "изобретать колесо " ненужно Нужно только "врезать " эту стандартную группу команд в
нужное "место " текста программы
Внутри этой группы команд, нужно выставить адрес ячейки, из которой производится чтение (в нашем случае,

02h
), и указать название регистра, в который запишется считываемое число (в нашем случае,
Registr
).
О
том
, что после этого будет происходить в "дебрях " ПИКа, программисту знать необязательно Если группа команд чтения не содержат ошибок, то и
беспокоиться не о
чем
То же самое относится и
к процессу записи данных в
EEPROM
память данных
Тем не менее, хотя бы "для общего развития ", разобраться с
этим стандартным набором команд стОит
Чтение данных, из
EEPROM
памяти данных, начинается с
перехода в 0- й
банк
(
bcf Status,RP0
). Если входе составления программы выяснится, что на момент начала процедуры чтения, происходит работа в 0- м
банке
, то команду из текста программы можно (и нужно) удалить (какой смысл выбирать 0- й
банк
, если работа итак происходит в
нем
?).
А
можно и
оставить все как есть (это для ленивых. Следующие 2 команды - стандартные команды записи константы, о
которых многократно говорилось ранее
В
данном случае, константой является адрес 3- й
ячейки
(02h). Обратите внимание на то, что число 2 указано без атрибута системы исчисления
В
этом случае, оно "воспринимается " как 02h (о том, в
каких случаях можно указывать число без атрибутов, я
объяснял ранее. Эта константа записывается в
регистр специального назначения, который используется только при работе с
EEPROM
памятью данных
Число
, которое в
него записывается, определяет адрес той ячейки, из которой будет производиться считывание
Вот
Вам и "место закладки " адреса ячейки, из которой будет производится считывание
Итак
, ячейка выбрана и
далее нужно инициализировать чтение (разрешить считывание, из нее, числа. Этим делом "рулит " нулевой бит регистра специального назначения, который находится в 1- м
банке и
используется только при работе с
EEPROM
памятью данных
Следовательно
, нужно перейти в 1- й
банк
, установить вбит регистра
EECon1
и опять вернуться в 0- й
банк
, так как следующая команда (
movf EEData,W
) обращается к
регистру
, который "лежит " в 0- м
банке
После команды перехода в 0- й
банк
, располагается группа из двух команд
После исполнения первой команды этой группы (
movf EEData,W
), предварительно записанное в
ячейку
, с
адресом
02h, число 64h (.100), копируется в
регистр
W
(аккумулятора после исполнения второй команды этой группы (
movwf Registr
), число 64h (.100) копируется, из регистра
W,
в регистр оперативной памяти, с
содержимым которого (с числом 64h), в
дальнейшем
, можно произвести ту или иную операцию
Вот
Вам и
ответ на вопрос "
В
какое место группы команд чтения данных, из
EEPROM
памяти данных, нужно вставить название регистра, в
который считывается байт "? Регистр специального назначения (регистр данных) задействуется только при работе с
EEPROM
памятью данных
Теперь
, в
соответствии с
алгоритмом работы программы, нужно произвести операцию инкремента
Итак
, после исполнения команды Registr

, процедура чтения данных, из 3- й
ячейки
, закончилась и
можно увеличить на 1 число .100, хранящееся в
регистре
Registr
Это делается при помощи команды Registr,F

178 После ее исполнения, в
регистре
Registr
будет "лежать " число .101 (65h), которое, в
соответствии со сформулированным ранее алгоритмом работы программы, необходимо записать все в
ту же, 3- ю
ячейку
EEPROM
памяти данных
Делаем это
Разработчики
ПИКов рекомендуют начинать процедуру записи с
команды глобального запрета прерываний Обратите внимание на то, что номер бита (7- го) регистра
Intcon
в команде не указан, так как в "шапке " программы, биту с
номером
7, директивой, присвоено название
GIE.
По этой причине, можно указывать не номер бита, а
его название
Можно эту команду оформить так
bcf Intcon,7
В
этом случае, из "шапки " программы, можно убрать строку equ Глобальный запрет прерываний также можно осуществить при помощи байт- ориентированной команды Если на момент начала исполнения одной из этих команд, в 7- м
бите регистра
Intcon
ранее уже был записан 0, то (по аналогии с
командой
bcf Status,RP0
) эту команду можно исключить из текста "программы ". Формальная необходимость запрета прерываний обусловлена тем, что если прерывания по окончанию записи в (см. 6- й
бит регистра) будут разрешены, то после окончания записи, рабочая точка программы "улетит " в
ПП
прерывания
, которой, в
данном случае, нет (глюк "). Для недопущения этого, нужно просто глобально запретить все прерывания командой Intcon,GIE
(
bcf Эта команда, в
отличие от команды Intcon

, не "выключает " прерывания от других источников прерываний, а
только
(в интервале времени от исполнения команды и до исполнения команды Intcon,GIE
) запрещает их
После команды глобального запрета прерываний, следуют 2 команды адресного выбора ячейки
Они в
точности такие же, как и
команды адресного выбора ячейки при чтении (задействована одна ячейка) и
останавливаться на них я
не буду
После выполнения следующей пары команд, число .101 (65h), через регистр
W,
копируется из регистра оперативной памяти
Registr,
в регистр специального назначения
EEData
и на этом, процесс предварительной подготовки к
записи заканчивается
Теперь нужно сначала разрешить, а
затем и
произвести запись
Запись в
выбранную ячейку
EEPROM
памяти данных, разрешается установкой в 1 второго бита регистра
EECon1
Он "лежит " в 1- м
банке
Следовательно
, перед тем как это сделать, нужно выбрать 1- й
банк
(
bsf Status,RP0
). После разрешения записи (
bsf EECon1,2
), можно произвести эту запись
Для этого используется обязательная последовательность из пяти команд (см текст примера. При этом, производятся операции с
так называемым "физически нереализованным" регистром, технические детали которых достаточно "туманны " (разработчики не объясняют. Собственно говоря, программисту от этого "не тепло и
не холодно ", так как возможность "
манёвра " начисто отсутствует, и
по этой причине, ничего кроме этой обязательной последовательности команд, они не сможет применить
Вот и
применяем ее
После исполнения обязательной последовательности команд, флаг прерывания по окончанию записи в
EEPROM
устанавливается в 1 (флаг поднят. Это и
есть критерий окончания записи
То есть, запись завершена и
можно выйти из процедуры записи
Но для того чтобы можно было осуществить следующую запись, этот флаг нужно программно
("
принудительно ") сбросить (
bcf EECon1,4
). Это единственный вариант его сброса
Аппаратно
(автоматически) он не сбрасывается
Теперь можно перейти из 1- го банка в 0- й (
bcf Status,RP0
). Вопрос "Почему переход в 0- й
банк осуществляется именно в
этом месте, а
не ранее "? Ответ потому, что предшествующие команды, начиная с
команды
bsf EECon1,2
, работают с
регистрами
1- го банка

179
В
тексте примера предполагается, что следующие, после команды Status,RP0
, операции будут производиться с
регистрами
0- го банка (вероятность этого - большая, но если после завершения процедуры записи, следующие операции будут производиться с
регистрами
1- го банка (вероятность этого - маленькая, то команду нужно "вырезать " из концовки процедуры записи и
перенести ниже (по тексту программы, "врезав " ее в
то "место ", в
котором заканчиваются операции с
регистрами
1- го банка и
начинаются операции с
регистрами
0- го банка
Осталось только обратить внимание на "шапку " программы
Рассмотрев ее, Вы сможете убедиться в
том
, что всё
, относящееся к
рассмотренной части программы, в
ней "прописано " и
ответ на вопрос "что откуда взялось" должен быть
Вам понятен
Советую
Вам переписать эти стандартные процедуры на листок и "приобщить " его к
имеющимся у
Вас распечаткам
Примечание
: в
данном случае, рассмотрена процедура типа чтение - модификация – запись, в "границах " только одного полного цикла программы
Не трудно догадаться, что произойдет входе исполнения последующих, полных циклов программы с
каждым циклом, значение числа, записываемого в 3- ю
ячейку
EEPROM
памяти данных, будет увеличиваться на 1. До числа .255 включительно
После этого, входе отработки следующего, полного цикла программы, произойдет переход от числа .255 к
числу
.0. Затем к
числу
.1, .2 и
т д
Это называется счетом по кольцу
Если применить операцию декремента, то все будет наоборот
Для того чтобы можно было отследить изменения, я "модифицировал " нерабочую программу
eeprom.asm
таким образом, чтобы ассемблирование прошло успешно
Эта
"модифицированная" программа называется
eeprom_a.asm
(
находится в
папке
"
Тексты программ.
;********************************************************************************
;
РАБОТА
С
EEPROM
ПАМЯТЬЮ
ДАННЫХ
;********************************************************************************
; "
ШАПКА
ПРОГРАММЫ
"
;================================================================================
;.............................................................
;================================================================================
; Определение положения регистров специального назначения.
;================================================================================
1   ...   30   31   32   33   34   35   36   37   ...   57


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