Файл: Самоучитель по программированию PIC контроллеров для начинающих (Е.А. Корабельников,2008).pdf
ВУЗ: Не указан
Категория: Не указан
Дисциплина: Не указана
Добавлен: 16.06.2025
Просмотров: 3604
Скачиваний: 3
; при работе с EEPROM.
;.............................................................
;.............................................................
;================================================================================
; Определение места размещения результатов операций.
;================================================================================
W |
equ |
0 |
; |
Результат |
направить |
в |
аккумулятор. |
F |
equ |
1 |
; |
Результат |
направить |
в |
регистр. |
;================================================================================
; Присваивание битам названий.
;================================================================================
RP0 |
equ |
5 |
; |
Бит |
выбора банка. |
GIE |
equ |
7 |
; |
Бит |
глобального разрешения прерываний. |
;================================================================================
org |
2100h |
; |
Обращение |
к EEPROM памяти данных. |
|||
DE |
0h,0h,64h |
; |
Записать в ячейки |
с адресами |
.0, |
.1, .2 |
|
; |
числа 0h, |
0h, 64h |
(.100) соответственно. |
||||
DE |
0h,0h,0h |
; |
Записать в ячейки |
с адресами |
.3, |
.4, .5 |
|
; |
числа 0h, |
0h, 0h соответственно. |
|||||
DE |
"Korabelnikow |
E.A. Rus. |
Lipetsk. 03.2005" |
; Записать |
|||
; |
символы в |
ячейки с адресами с .6 |
по .46 |
||||
;================================================================================
org |
0 |
; |
Начать выполнение программы |
goto |
START |
; |
с подпрограммы START. |
;********************************************************************************
---------------------------------------------------------------------------------
ПОЯСНЕНИЯ ПО ДИРЕКТИВЕ DE
---------------------------------------------------------------------------------
Содержимое |
EEPROM |
||||||
1. Для случая, указанного |
---> 00 00 |
64 |
00 |
00 |
00 |
xx xx |
xx xx xx xx xx xx xx xx |
в "шапке" программы |
---> xx xx xx xx |
xx xx xx xx |
xx xx xx xx xx xx xx xx |
||||
---> xx xx xx xx |
xx xx xx xx |
xx xx xx xx xx xx xx FF |
|||||
---> FF FF FF FF |
FF FF FF FF |
FF FF FF FF FF FF FF FF |
|||||
xx - 16-ричные числа символов, включая и |
пробелы. |
||||||
---------------------------------------------------------------------------------
2. А можно и так: |
||||||||||||||||||
org |
2100h |
---> 00 |
00 |
64 |
FF FF FF FF FF |
FF FF FF FF FF FF FF FF |
||||||||||||
DE |
0h,0h,64h--> FF FF FF FF FF FF FF FF |
FF FF FF FF FF FF FF FF |
||||||||||||||||
---> |
FF FF FF FF |
FF |
FF |
FF |
FF |
FF |
FF |
FF |
FF |
FF |
FF |
FF |
FF |
|||||
---> |
FF |
FF |
FF |
FF |
FF |
FF |
FF |
FF |
FF |
FF |
FF |
FF |
FF |
FF |
FF |
FF |
||
---------------------------------------------------------------------------------
;******************************************************************************** ; РАБОЧАЯ ЧАСТЬ ПРОГРАММЫ
;********************************************************************************
;.............................................................
;.............................................................
;================================================================================
; Чтение данных из EEPROM
;================================================================================
;Считывание содержимого байта с адресом 02h и запись его в регистр общего
;назначения Registr.
;-------------------------------------------------------------------------------- |
||||
bcf |
Status,RP0 |
; Переход в |
нулевой банк. |
|
movlw |
2 |
; Записать в регистр W константу 02h. |
||
movwf |
EEAdr |
; Скопировать 02h, |
из регистра W, |
|
; в регистр |
EEAdr. |
|||
bsf |
Status,RP0 |
; Переход в |
первый |
банк. |
bsf |
EECon1,0 |
; Инициализировать |
чтение. |
|
bcf |
Status,RP0 |
; Переход в |
нулевой банк. |
|
movf |
EEData,W |
; Скопировать число из ячейки EEPROM, |
||
; с адресом |
02h, в |
регистр W. |
||
171
movwf |
Registr |
; Скопировать число из регистра W |
;в регистр Registr. |
||
;-------------------------------------------------------------------------------- |
||
; Изменение содержимого регистра Registr. |
||
;-------------------------------------------------------------------------------- |
||
incf |
Registr,F |
; Увеличить на 1 содержимое регистра Registr с |
; сохранением результата в нем же. |
||
;================================================================================
; Запись данных в EEPROM.
;================================================================================
; Запись содержимого регистра Registr в ячейку EEPROM с адресом 02h.
;-------------------------------------------------------------------------------- |
|||
bcf |
Intcon,GIE |
; Глобальный запрет прерываний. |
|
movlw |
2 |
; Записать, |
в регистр W, константу 02h. |
movwf |
EEAdr |
; Скопировать константу 02h, из регистра W, |
|
; в регистр |
EEAdr. |
||
movf |
Registr,W |
; Скопировать число, из регистра Registr, |
|
; в регистр |
W. |
||
movwf |
EEData |
; Скопировать число, из регистра W, |
|
; в ячейку EEPROM с адресом 02h. |
|||
bsf |
Status,RP0 |
; Переход в |
первый банк. |
bsf |
EECon1,2 |
; Разрешить |
запись. |
movlw |
055h |
; Обязательная |
|
movwf |
EECon2 |
; процедура |
|
movlw |
0AAh |
; при записи. |
|
movwf |
EECon2 |
; ----"---- |
|
bsf |
EECon1,1 |
; ----"---- |
|
bcf |
EECon1,4 |
; Сбросить флаг прерывания по окончании |
|
; записи в EEPROM. |
|||
bcf |
Status,RP0 |
; Переход в |
нулевой банк. |
;-------------------------------------------------------------------------------- |
|||
;...................................................................
;...................................................................
;********************************************************************************
end ; Конец программы.
Примечание: регистр EECon2 не реализован физически. Он используется в операциях записи в EEPROM память данных, для реализации обязательной последовательности команд.
Этот файл не является "полноценной" программой.
Проекта под него создавать не нужно, а просто откройте его (File Open).
Вы видите "заготовку" программы, с задействованием EEPROM памяти данных, в которой решается задача, сформулированная выше.
Все что относится к работе с EEPROM памятью данных, расписано подробно. Остальная часть программы обозначена условно строками из точек.
Это относится и к "шапке" программы, и к ее рабочей части.
На месте этих строк, образно выражаясь, может быть "все что угодно". Это "все что угодно", в данный момент, не существенно.
Нужно разобраться с тем, как предварительно записать, в ячейку EEPROM памяти данных с адресом 02h, число .100, затем, в рабочей части "программы", скопировать это число в регистр оперативной памяти, увеличить его на 1, и после этого, записать число .101 в ту же ячейку EEPROM памяти данных.
Сначала разберемся с предварительной записью.
Предварительная запись данных, в ячейки EEPROM памяти данных, производится при помощи директивы DE.
Прежде чем применить эту директиву, необходимо обратиться к EEPROM памяти данных (активизировать, включить, запустить кому как нравится) при помощи директивы org с указанием адреса 2100h (см. текст примера).
Директива org 2100h всегда трактуется однозначно (других вариантов "включения"
172
предварительной записи, в EEPROM память данных, нет), и поэтому можно "не забивать себе голову" информацией о том, что такое 2100h, а просто принять это как данность (запомнить как правило).
После этой директивы, можно исполнять одну или несколько директив DE.
При помощи директивы DE, в ячейки EEPROM памяти данных, записываются числа в диапазоне от .00 до .255.
Вопрос: "По каким адресам и в каком порядке"?
Ответ: первая, после директивы org 2100h, директива DE, записывает первое, указанное в рабочей части этой директивы, число (крайнее левое), в ячейку EEPROM памяти данных с адресом .00 (00h), второе число записывается в ячейку с адресом .01 (01h), третье, в ячейку с адресом .02 (02h) и т.д., вплоть до последней ячейки (если в этом есть необходимость).
Значения чисел, предварительно записываемых в ячейки EEPROM памяти данных, должны быть указаны в рабочей части директивы DE и расположены в порядке следования адресов, по которым эти числа нужно записать (начиная с нулевого и далее по порядку), с отделением этих чисел, друг от друга, запятыми.
Вданном случае, первая директива DE записывает числа 0h, 0h, 64h (.100) в 1, 2, и 3 ячейки соответственно (по адресам 00h, 01h, 02h).
Примечание: обратите внимание на форму представления числа ноль (0h).
00h, 000h, 0000h и т. д., это то же самое, что и 0h. Все незначащие нули, находящиеся слева от значащей цифры, можно не указывать, но крайняя, правая значащая цифра (цифры) указываться должна.
Например, .0034 = .034 = .34 = 0022h = 022h = 22h.
Для того чтобы, в конечном итоге, вся эта "канцелярия" не вызывала у Вас затруднений, по ходу дальнейшей работы, я буду "манипулировать" различными формами представления чисел.
Внашем случае, число .100 (64h) нужно записать в 3-ю ячейку с адресом 02h.
Так как первая, после директивы org 2100h, директива DE "жестко привязана" к "нулевой точке отсчета" (адрес ячейки EEPROM памяти данных, равный 0), то для того чтобы "дойти" до третьей ячейки, нужно чем-то заполнить первые две ячейки (записать в них какие-то числа).
Если бы эти 2 ячейки в программе задействовались, то в них нужно было бы записать определяемые программистом числа, но в нашем случае, они не задействованы, и то, какими именно числами они будут заполнены, не имеет значения.
Вних можно записать любые, "дозволенные" числа, но обычно, в такого рода "пустышки", записываются нули, что Вы и видите в тексте "программы".
По умолчанию, во все ячейки EEPROM памяти данных, записываются числа FFh (кроме ячеек, заполняемых при помощи директивы DE), и на этом "фоне", тот "сектор" EEPROM памяти, в котором записаны нули, "сразу бросается в глаза", что делает более комфортным визуальное восприятие содержимого области EEPROM памяти данных.
Для того чтобы показать, "как плодятся и размножаются пустышки", в данном случае, я специально поступил нерационально.
Это я еще "ушел" не далеко (всего-лишь адрес 02h), а если задействовать, например, последнюю ячейку с адресом 3Fh?
Вэтом случае, рабочая часть директивы DE будет представлять собой длиннющую строку, заполнение которой, по своей сути, является достаточно бестолковой работой. Практический вывод из этого следующий: если необходимо задействовать ячейки EEPROM памяти данных, то с точки зрения рациональности, их нужно задействовать, начиная с первой ячейки (адрес 0) и далее, по-порядку (если нужны несколько ячеек).
Вэтом случае, до задействованной ячейки не нужно "добираться, плодя пустышки" и рабочая часть директивы DE будет компактной и удобной для восприятия.
Если руководствоваться этими соображениями, то в нашем случае, нужно задействовать не 3-ю, а 1-ю ячейку EEPROM памяти данных (в рабочей части программы обращаться не к ячейке с адресом 2, а к ячейке с адресом 0).
Вэтом случае, рабочая часть директивы DE будет содержать в себе не 3 числа, а одно число 64h (.100), и дело с концом.
Далее, можно переходить к "разборкам" с рабочей частью программы, а директива DE будет первой и последней.
Конечно же, предлагаемый Вашему вниманию пример программы, можно составить и таким образом (на практике, так и нужно делать), но в обучающих целях, пусть она будет такой,
173
какой есть, а иначе отсутствует предмет разбирательств. Вопрос: неужели "пустышки" так уж и бесполезны? Ответ: нет.
Представьте себе такую ситуацию: на момент начала составления текста программы, программист точно знает, что "железобетонно" потребуется одна ячейка EEPROM памяти данных, в которую, в процессе "прошивки", нужно записать константу 64h, но по ходу составления текста рабочей части программы, возникает необходимость в задействовании еще нескольких групп ячеек, например, двух групп, состоящих из двух ячеек каждая.
В этом случае, директиву DE можно "оформить" так: DE 0h,0h,64h,0h,0h,0h или так:
DE 0h,0h,0h,0h,64h,0h, или так: DE 0h,0h,64h,01h,01h,02h, или еще как-то (по своему желанию), с целью того чтобы как бы "зарезервировать" ячейки под будущие операции с EEPROM памятью данных, а заодно и визуально выделить, из общей "массы" (на "фоне"
FFh), группу ячеек, с которыми, в дальнейшем, будет работать программа (элемент удобства, и не более того).
Например, DE 0h,0h,64h,01h,01h,02h можно истолковать так: ячейки 1, 2 и ячейки 4, 5 зарезервированы под "еще не рожденные" операции с использованием EEPROM памяти данных, в 3-ю ячейку, при "прошивке", "закладывается" заранее определенная константа, с числовым значением .100, а 6-я ячейка, это помеченный цифрой 2 (а можно и другой), "ефрейторский зазор" (на всякий случай).
Короче, подобного рода "оформление" - дело вкуса.
Я говорю об этом по той причине, что подобного рода "архитектурные излишества" часто запутывают. Особенно начинающих.
Только ради одного этого, такие "разборки" нужны. Замечания по оформлению.
Например, DE 0h,0h,64h,0h,0h,0h.
Если поместить "все это добро" на свое "штатное место", то своей правой частью она "наедет" на "виртуальную", вертикальную линию, на которой находятся точки с запятыми (после них начинаются комментарии).
По этой причине, текст соответствующего комментария придется сдвинуть вправо, что в тексте программы, создает "легкий бардачок".
Конечно же, это абсолютно не "смертельно" (MPLABу это "по барабану") и в работе программы ничего не изменится, но "в оформительском смысле", получается "кто в лес, кто по дрова".
Для людей, приученных к порядку, это примерно то же самое, что сесть на кнопку. Чтобы "навести в этом бардаке порядок", одну директиву DE 0h,0h,64h,0h,0h,0h можно разделить на 2 части так, как это сделано в примере программы.
Если рабочая часть директивы DE содержит большее количество чисел, то по такому же принципу, одну эту директиву можно "расчленить" на 3, 4, 5 и т.д. частей, использовав 3, 4, 5 и т.д. директив DE.
Вэтом случае, "начальной точкой отсчета" адреса нижней директивы, будет последний адрес директивы, располагающейся "одним этажом выше", плюс единица.
Директива DE может работать не только с числами, указанными в явном виде, но и с символами.
Это означает то, что если в рабочей части директивы DE указать символы, входящие в состав стандартного, "компьютерного" кода, то в ячейки EEPROM памяти данных будут записаны числовые значения символов.
MPLAB об этом "позаботится" ("в автомате"). При этом, группу символов нужно "закавычить". Посмотрите в текст программы.
Внем Вы увидите, что при помощи третьей сверху директивы DE, я вставил в незадействованные ячейки (начиная с 7-й) комментарий в символьном виде. Такого рода "архитектурные излишества" реализуются по принципу типа "если есть свободное местечко, то дай-ка я в него что-нибудь засуну".
Естественно, что это совсем не обязательно.
Если нужно разбить текст такой надписи на части (если она слишком длинная), то это делается по принципу, описанному выше, только каждая группа символов заключается в кавычки.
Втексте программы, я этого делать не стал.
Вывод: использующиеся в программе ячейки, целесообразно расположить в начале
174