Добавил:
Upload Опубликованный материал нарушает ваши авторские права? Сообщите нам.
Вуз: Предмет: Файл:

Samouchitel

.pdf
Скачиваний:
16
Добавлен:
13.02.2015
Размер:
3.65 Mб
Скачать

; при работе с 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

EEPROM памяти данных (начиная с нулевого адреса), а в незадействованных ячейках, по умолчанию, записываются числа FFh.

Примечание: атрибут 16-ричной системы исчисления (h) не указывается.

Другое дело, если нужно "спрятать/замаскировать", в EEPROM памяти данных, некую "секретную" ячейку (ячейки).

В этом случае как раз и потребуется то, о чем говорилось выше.

Такого рода "секретные" ячейки, в области EEPROM памяти данных, можно "разбросать" (если их несколько) как угодно, "заполнив промежутки" между ними какой-нибудь, сбивающей с толка, "абракадаброй".

Усвоив то, о чем шла речь выше, Вы без особых проблем разберетесь с тем, как это делается.

Проконтролировать содержимое области EEPROM памяти данных можно так.

Вглавном меню MPLAB, нужно щёлкнуть по слову Window, а в раскрывшемся списке, щёлкнуть по строке EEPROM Memory.

Откроется окно EEPROM Window, в котором Вы увидите область EEPROM памяти данных.

Вней можно определить и адрес, и содержимое любой ячейки.

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

FFh.

В чем дело?

А дело в том, что если ассемблирования текста программы ни разу не производилось, то в окне EEPROM Window Вы увидите, во всех ячейках, значения чисел, установленных по умолчанию (FFh).

Если текст программы проассемблирован, то в том случае, если EEPROM память данных в программе не задействована, то будет то же самое.

Если проассемблирован текст программы, в которой ячейки EEPROM памяти данных задействованы, то после ассемблирования, Вы увидите, в этих ячейках, те числовые значения, которые "дислоцируются" в рабочей части директивы DE (в 16-ричной форме исчисления, без указания буквы h).

Если это символы, то они будут указаны в виде чисел.

Обращаю Ваше внимание на следующий, общий принцип: в окнах, показывающих

содержимое области оперативной памяти, памяти программ и EEPROM памяти данных, отражается результат последнего ассемблирования.

То есть, если в текст программы внесены изменения, и после этого, ассемблирование не производилось, то проконтролировать эти изменения нельзя.

Вопрос: "Если изменения вносятся не в текст программы, а в комментарии или в оформление программы (во все то, что располагается правее точек с запятыми), то нужно ли, для того чтобы сохранить эти изменения, производить ассемблирование"?

Ответ: есть 2 варианта сохранения изменений в комментариях и/или в оформлении программы.

Первый вариант: произвести ассемблирование.

В этом случае, в HEX-файле ничего не изменится (MPLAB "не видит" ничего, что расположено правее точек с запятыми).

Значимая часть программы, в которую не внесены изменения, просто "перезапишется", но при этом, будет обновлено то, что расположено правее точек с запятыми.

Второй вариант: так как HEX-файл обновлять не нужно, то можно сохранить, указанные выше изменения, только в ASM-файле.

Для этого, нужно произвести стандартное действие: в главном меню MPLAB, нужно щёлкнуть по слову File, а в выпадающем списке, по строке Save.

На первых порах, проще всего (чтобы не "распылять внимание"), после любых изменений, внесенных в тексте программы, производить ассемблирование.

Вернемся к окну EEPROM Window.

Для того чтобы увидеть результат использования директивы DE, с учетом сказанного, текст программы (файл eeprom.asm) нужно проассемблировать.

Если Вы попробуете сделать это, то получите сообщение о 21 ошибке.

При этом, в окне EEPROM Window ничего не изменится (во всех ячейках FFh), что является закономерным результатом неисполнения требований, предъявляемых к оформлению текста программы.

175

MPLAB "заругался" абсолютно обоснованно, так как программа неправильно оформлена и поэтому, "с его точки зрения" (и по факту тоже), она является "неполноценной".

Вопрос: а как же в этом случае, при помощи симулятора, убедиться в том, что директивы DE исполняются?

Ответ: никак.

Вывод: проверить результаты исполнения директив DE можно только в том

случае, если текст оформлен в виде "полноценной" программы, и этот текст проассемблирован без ошибок.

Это относится не ко всем директивам.

Например, результаты исполнения директив equ, end (и т.д.), в симуляторе, проконтролировать нельзя, так как контролируются изменения только того, что отображается в "контрольных" окнах, а не результаты действий, обеспечивающих функционирование программы.

Но это не свидетельствует о том, что MPLAB "самоустранился от этого дела". Это не так. Если "что-то пошло наперекосяк", то MPLAB, после ассемблирования, выдаст соответствующие сообщения об ошибках и/или предупреждения.

Обращаю Ваше внимание на пояснения, находящиеся в тексте примера между "шапкой" "программы" и ее рабочей частью.

Вы видите варианты заполнения ячеек EEPROM памяти данных, для 2-х случаев "оформления" директив DE.

Это именно то, что будет наблюдаться, в окне EEPROM Window, после проведения успешного ассемблирования, если предположить, что текст примера оформлен как "полноценная" программа.

Разбираем текст программы.

До и после интересующих нас операций, программа может работать множеством различных способов и реализовывать какие угодно замыслы программиста.

В данном случае, это не важно.

Важно то, как именно происходит работа с EEPROM памятью данных.

На момент начала исполнения рабочей части программы, 46 ячеек EEPROM памяти заполнены числами ("сработала" директива DE), а остальные ячейки заполнены числами, устанавливаемыми по умолчанию (FFh).

Из всех этих ячеек, нас интересует только одна - третья, с адресом 02h, так как в ней, предварительно, записано число, с которым нужно производить интересующие нас операции

(64h или .100).

Вэтом смысле, все остальные, предварительно записанные числа, можно рассматривать как "архитектурные излишества", не влияющие на ход исполнения программы.

Вданном случае, уходов в прерывания нет.

Исполнение программы начинается стандартно. С ПП START.

Врабочей части программы, я не стал обозначать начало этой ПП. Имейте это ввиду. После "запуска в эксплуатацию" рабочей части программы, она исполняется до тех пор, пока не возникнет необходимость в работе с EEPROM памятью данных.

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

Вданном случае, переход на это "начало" происходит "естественным образом" (на "линейном участке программы". Без задействования call/goto).

Если используются команды переходов call/goto, то переход на это "начало" может происходить из любого "места" программы.

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

Разбираемся с тем, что же должна из себя представлять эта группа команд?

Всоответствии со сформулированной выше задачей, это должна быть группа команд, обеспечивающая считывание числа, из 3-й ячейки EEPROM памяти данных, в регистр оперативной памяти.

Следовательно, под это дело, нужно задействовать один из регистров общего назначения. Назначаем ему название, например, Registr и "прописываем" его в "шапке" программы по адресу, например, 0Ch.

176

Теперь мы конкретно знаем, откуда считывать и куда "закладывать на временное хранение" результат этого считывания.

Остается только выяснить, как конкретно это сделать?

Вы видите перед собой "кучу туманных" команд и по всей видимости, думаете, что "разборки"

сними будут достаточно трудоемкими. Ничего подобного.

Группа команд чтения данных из EEPROM памяти данных (и записи тоже) является

стандартным "набором" команд, рекомендованных к применению разработчиками.

То есть, "изобретать колесо" не нужно.

Нужно только "врезать" эту стандартную группу команд в нужное "место" текста программы.

Внутри этой группы команд, нужно:

- выставить адрес ячейки, из которой производится чтение (в нашем случае, 02h), - и указать название регистра, в который запишется считываемое число

(в нашем случае, Registr).

О том, что после этого будет происходить в "дебрях" ПИКа, программисту знать не обязательно.

Если группа команд чтения не содержат ошибок, то и беспокоиться не о чем. То же самое относится и к процессу записи данных в EEPROM память данных.

Тем не менее, хотя бы "для общего развития", разобраться с этим стандартным набором команд стОит.

Чтение данных, из EEPROM памяти данных, начинается с перехода в 0-й банк

(bcf Status,RP0).

Если в ходе составления программы выяснится, что на момент начала процедуры чтения, происходит работа в 0-м банке, то команду bcf Status,RP0 из текста программы можно (и нужно) удалить (какой смысл выбирать 0-й банк, если работа и так происходит в нем?).

А можно и оставить все как есть (это для ленивых).

Следующие 2 команды - стандартные команды записи константы, о которых многократно говорилось ранее.

В данном случае, константой является адрес 3-й ячейки (02h).

Обратите внимание на то, что число 2 указано без атрибута системы исчисления.

В этом случае, оно "воспринимается" как 02h (о том, в каких случаях можно указывать число без атрибутов, я объяснял ранее).

Эта константа записывается в регистр специального назначения EEAdr, который используется только при работе с EEPROM памятью данных.

Число, которое в него записывается, определяет адрес той ячейки, из которой будет производиться считывание.

Вот Вам и "место закладки" адреса ячейки, из которой будет производится считывание. Итак, ячейка выбрана и далее нужно инициализировать чтение (разрешить считывание, из нее, числа).

Этим делом "рулит" нулевой бит регистра специального назначения EECon1, который находится в 1-м банке и используется только при работе с EEPROM памятью данных. Следовательно, нужно перейти в 1-й банк, установить в 1 бит №0 регистра EECon1 и опять вернуться в 0-й банк, так как следующая команда (movf EEData,W) обращается к регистру, который "лежит" в 0-м банке.

После команды перехода в 0-й банк, располагается группа из двух команд.

После исполнения первой команды этой группы (movf EEData,W), предварительно записанное в ячейку, с адресом 02h, число 64h (.100), копируется в регистр W (аккумулятор), а после исполнения второй команды этой группы (movwf Registr), число 64h (.100) копируется, из регистра W, в регистр оперативной памяти Registr, с содержимым которого (с числом 64h), в дальнейшем, можно произвести ту или иную операцию.

Вот Вам и ответ на вопрос: "В какое место группы команд чтения данных, из EEPROM памяти данных, нужно вставить название регистра, в который считывается байт"?

Регистр специального назначения EEData (регистр данных) задействуется только при работе

сEEPROM памятью данных.

Теперь, в соответствии с алгоритмом работы программы, нужно произвести операцию инкремента.

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

Это делается при помощи команды incf Registr,F.

177

После ее исполнения, в регистре Registr будет "лежать" число .101 (65h), которое, в соответствии со сформулированным ранее алгоритмом работы программы, необходимо записать все в ту же, 3-ю ячейку EEPROM памяти данных.

Делаем это.

Разработчики ПИКов рекомендуют начинать процедуру записи с команды глобального запрета прерываний bcf Intcon,GIE.

Обратите внимание на то, что номер бита (7-го) регистра Intcon в команде не указан, так как в "шапке" программы, биту с номером 7, директивой equ, присвоено название GIE.

По этой причине, можно указывать не номер бита, а его название. Можно эту команду оформить так: bcf Intcon,7.

В этом случае, из "шапки" программы, можно убрать строку GIE equ 7. Глобальный запрет прерываний также можно осуществить при помощи байториентированной команды clrf Intcon.

Если на момент начала исполнения одной из этих команд, в 7-м бите регистра Intcon ранее уже был записан 0, то (по аналогии с командой bcf Status,RP0) эту команду можно исключить из текста "программы".

Формальная необходимость запрета прерываний обусловлена тем, что если прерывания по окончанию записи в EEPROM (см. 6-й бит регистра Intcon) будут разрешены, то после окончания записи, рабочая точка программы "улетит" в ПП прерывания, которой, в данном случае, нет ("глюк").

Для недопущения этого, нужно просто глобально запретить все прерывания командой bcf Intcon,GIE (bcf Intcon,7).

Эта команда, в отличие от команды clrf Intcon, не "выключает" прерывания от других источников прерываний, а только (в интервале времени от исполнения команды bcf Intcon,GIE и до исполнения команды bsf Intcon,GIE) запрещает их.

После команды глобального запрета прерываний, следуют 2 команды адресного выбора ячейки.

Они в точности такие же, как и команды адресного выбора ячейки при чтении (задействована одна ячейка) и останавливаться на них я не буду.

После выполнения следующей пары команд, число .101 (65h), через регистр W, копируется из регистра оперативной памяти Registr, в регистр специального назначения EEData и на этом, процесс предварительной подготовки к записи заканчивается.

Теперь нужно сначала разрешить, а затем и произвести запись.

Запись в выбранную ячейку EEPROM памяти данных, разрешается установкой в 1 второго бита регистра EECon1.

Он "лежит" в 1-м банке.

Следовательно, перед тем как это сделать, нужно выбрать 1-й банк (bsf Status,RP0). После разрешения записи (bsf EECon1,2), можно произвести эту запись.

Для этого используется обязательная последовательность из пяти команд (см. текст примера).

При этом, производятся операции с так называемым "физически не реализованным" регистром EECon2, технические детали которых достаточно "туманны" (разработчики не объясняют).

Собственно говоря, программисту от этого "не тепло и не холодно", так как возможность "манёвра" начисто отсутствует, и по этой причине, ничего кроме этой обязательной последовательности команд, он и не сможет применить.

Вот и применяем ее.

После исполнения обязательной последовательности команд, флаг прерывания по окончанию записи в EEPROM устанавливается в 1 (флаг поднят).

Это и есть критерий окончания записи.

То есть, запись завершена и можно выйти из процедуры записи.

Но для того чтобы можно было осуществить следующую запись, этот флаг нужно программно ("принудительно") сбросить (bcf EECon1,4).

Это единственный вариант его сброса. Аппаратно (автоматически) он не сбрасывается. Теперь можно перейти из 1-го банка в 0-й (bcf Status,RP0).

Вопрос: "Почему переход в 0-й банк осуществляется именно в этом месте, а не ранее"? Ответ: потому, что предшествующие команды, начиная с команды bsf EECon1,2, работают с регистрами 1-го банка.

178

В тексте примера предполагается, что следующие, после команды bcf Status,RP0, операции будут производиться с регистрами 0-го банка (вероятность этого - большая), но если после завершения процедуры записи, следующие операции будут производиться с регистрами 1-го банка (вероятность этого - маленькая), то команду bcf Status,RP0 нужно "вырезать" из концовки процедуры записи и перенести ниже (по тексту программы), "врезав" ее в то "место", в котором заканчиваются операции с регистрами 1-го банка и начинаются операции с регистрами 0-го банка.

Осталось только обратить внимание на "шапку" программы.

Рассмотрев ее, Вы сможете убедиться в том, что всё, относящееся к рассмотренной части программы, в ней "прописано" и ответ на вопрос "что откуда взялось?" должен быть Вам понятен.

Советую Вам переписать эти стандартные процедуры на листок и "приобщить" его к имеющимся у Вас распечаткам.

Примечание: в данном случае, рассмотрена процедура типа чтение - модификация запись, в "границах" только одного полного цикла программы.

Не трудно догадаться, что произойдет в ходе исполнения последующих, полных циклов программы: с каждым циклом, значение числа, записываемого в 3-ю ячейку EEPROM памяти данных, будет увеличиваться на 1.

До числа .255 включительно.

После этого, в ходе отработки следующего, полного цикла программы, произойдет переход от числа .255 к числу .0. Затем к числу .1, .2 и т.д.

Это называется счетом по кольцу.

Если применить операцию декремента, то все будет наоборот.

Для того чтобы можно было отследить изменения, я "модифицировал" нерабочую программу eeprom.asm таким образом, чтобы ассемблирование прошло успешно.

Эта "модифицированная" программа называется eeprom_a.asm

(находится в папке "Тексты программ").

;******************************************************************************** ; РАБОТА С EEPROM ПАМЯТЬЮ ДАННЫХ

;******************************************************************************** ; "ШАПКА ПРОГРАММЫ"

;================================================================================ ;.............................................................

;================================================================================

; Определение положения регистров специального назначения.

;================================================================================

Intcon

equ

0Bh

; Регистр Intcon.

Status

equ

03h

; Регистр Status.

EEData

equ

08h

; EEPROM - данные

EECon1

equ

08h

; EECON1 - банк1.

EEAdr

equ

09h

; EEPROM - адрес

EECon2

equ

09h

; EECON2 - банк1.

;.............................................................

 

 

 

;================================================================================

; Определение названия и положения регистров общего назначения.

;================================================================================

Registr equ 0Ch ; Регистр оперативной памяти, используемый ; при работе с EEPROM.

;.............................................................

;================================================================================

; Определение места размещения результатов операций.

;================================================================================

W

equ

0

;

Результат

направить

в

аккумулятор.

F

equ

1

;

Результат

направить

в

регистр.

;================================================================================

; Присваивание битам названий.

;================================================================================

RP0

equ

5

;

Бит

выбора банка.

GIE

equ

7

;

Бит

глобального разрешения прерываний.

;================================================================================

179

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.

;********************************************************************************

;******************************************************************************** ; РАБОЧАЯ ЧАСТЬ ПРОГРАММЫ

;******************************************************************************** START ; .........................

;.............................................................

;================================================================================

; Чтение данных из 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.

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.

180

Соседние файлы в предмете [НЕСОРТИРОВАННОЕ]