Файл: Самоучитель по программированию PIC контроллеров для начинающих (Е.А. Корабельников,2008).pdf

ВУЗ: Не указан

Категория: Не указан

Дисциплина: Не указана

Добавлен: 16.06.2025

Просмотров: 3573

Скачиваний: 3

ВНИМАНИЕ! Если данный файл нарушает Ваши авторские права, то обязательно сообщите нам.

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

Это означает, что в большинстве случаев, за каждый так называемый машинный цикл (такт работы программы: для ПИКов он равен четырем периодам тактового генератора) работы ПИКа, происходит исполнение одной команды.

Есть и команды исполнение которых происходит за 2 машинных цикла (м.ц.), но их меньше. Команд, которые исполняются за 3 м.ц. и более нет.

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

В более сложных программах, с большим количеством условных и безусловных переходов, работу счетчика команд PC можно охарактеризовать фразой "Фигаро здесь, Фигаро там". 1 машинный цикл (м.ц.) равен 4-м периодам тактового генератора ПИКа.

Следовательно, при использовании кварца на 4 Мгц., 1 м.ц.=1 мкс.

Выполнение программы, в рабочем режиме (кроме работы в режиме пониженного энергопотребления SLEEP), никогда не останавливается, то есть, за каждый машинный цикл (или за 2, если команда исполняется за 2 м.ц.) должно выполняться какое-либо действие (команда).

Тактовый генератор, формирующий машинные циклы, работает постоянно. Если его работу прервать, то исполнение программы прекратится.

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

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

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

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

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

Остановить (в буквальном смысле этого слова) исполнение программы можно только прекратив работу тактового генератора.

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

Например, пультов дистанционного управления (и т.д.).

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

Проще говоря, рабочая точка программы должна непрерывно (не останавливаясь) "мотать кольца" полного цикла программы (непрерывно переходить с одного "кольца" на другое).

Общие выводы:

1.Команды программы "лежат" в памяти программ в порядке расположения команд в тексте программы.

2.Адреса этих команд находятся в счетчике команд PC и каждому адресу соответствует одна из команд программы.

3.Команда активируется (исполняется), если в счетчике команд находится ее адрес.

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

5.Выполнение команд программы никогда не останавливается (за исключением режима SLEEP), и поэтому программа должна быть циклической.

Если сейчас это не понятно, то ничего страшного. "Просветление" будет позже.

12


Кроме памяти программ, PIC16F84A имеет энергонезависимую память данных (EEPROM память данных).

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

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

Слово памяти данных равно одному байту (8 бит).

В PIC16F84A, объем памяти данных составляет 64 байта.

Байты, хранящиеся в памяти данных, предназначены для их считывания в стандартные 8-битные регистры, речь о которых пойдет далее.

Данные из этих регистров могут быть записаны в EEPROM память данных, то есть,

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

Например, именно EEPROM память данных я использовал в своем частотомере для сохранения последних, перед выключением питания, настроек.

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

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

Регистры

Включите свое образное мышление.

Предположим, что Вы купили механический конструктор. Что Вы делаете сначала?

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

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

По сути, то же самое происходит и при работе с ПИКами.

"План" это программа, а "составные части конструктора" есть регистры.

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

Без детального знания всех элементов этого "ПИК – конструктора", не может быть и речи о какой-либо эффективной работе по составлению программ. Уделите этому особое внимание. В ПИКах существуют две группы регистров:

-регистры общего назначения (GRP)

-и регистры специального назначения (SFR).

Эти регистры являются элементами оперативной памяти.

То есть, они сохраняют информацию только при включенном питании.

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

Это - общий стандарт.

Регистры общего назначения

Это "вотчина" программиста.

Изначально, они похожи на "пустые болванки" и толка от них - никакого.

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

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

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

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

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

13


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

Когда, например, говорят, что на регистрах общего назначения X, Y, Z (их можно назвать как угодно, это дело вкуса программиста) собран 3-х разрядный вычитающий счетчик, то следует иметь ввиду, что эти регистры, сами по себе, таковым счетчиком не являются.

Этим счетчиком их делает программа, а если конкретнее, то программист.

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

Откройте "Приложение №2".

На этой картинке Вы видите область оперативной памяти PIC16F84A. Регистры общего назначения находятся в пустых клеточках.

Каждой такой клеточке соответствует свой адрес.

Пустые (без названий) они потому, что названия им назначает программист.

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

Назовем его, например, Mem и присвоим ему адрес 0Ch (это делается в "шапке" программы, о чем - позже).

Это означает то, что регистр Mem займет в области оперативной памяти ту клеточку, которая расположена правее желтой клеточки с надписью INTCON.

Всё. Регистр буферной памяти условно "прописан" (ему назначено название и присвоен адрес в области оперативной памяти) и теперь с ним можно работать.

"Условно" потому, что пока он "прописан" на бумаге, а не в тексте программы (об этой "технологии" – позже).

Эту картинку я делал для себя, и кроме обучения, она полезна в работе. Распечатайте ее в нескольких экземплярах.

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

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

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

Именно в таком виде лучше всего указывать адрес регистра в "шапке" программы.

Например, 0Ch, 14h, 29h, 2Ch ...

Можно использовать и прописные буквы: 0ch, 2dh, 1fh ...

Хотя в распечатке области оперативной памяти указаны 36 регистров общего назначения, но на самом деле их 68 (еще плюс 2 ряда по 16 штук ниже нижнего ряда).

Таким образом, 68 регистров общего назначения, в области оперативной памяти, имеют адреса: банк 0 - с 0Ch по 4Fh, банк 1 - c 8Ch по CFh.

При составлении программ, редко когда возникает необходимость в задействовании всех 68-ми регистров общего назначения, и поэтому, в распечатке области оперативной памяти, я указал не 68, а 36 регистров общего назначения, чего вполне достаточно для составления даже достаточно сложных программ. Имейте это ввиду.

Область оперативной памяти, "во всей своей полномасштабной красе", можно наблюдать в MPLAB, речь о которой пойдет ниже.

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

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

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

Что касается регистров общего назначения, то в части касающейся PIC16F84A, все они расположены в нулевом банке, а в первом банке просто дублируются (повторяются или, как часто говорят, отображаются).

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

14


скажешь о недублирующихся регистрах специального назначения.

Регистры специального назначения

Детали нашего ПИК-конструктора состоят не из одних регистров общего назначения. Это - самые простые "детали".

По большому счету, к его "деталям" относится практически вся электронная "начинка" PIC контроллера: тактовый генератор, система сброса, АЛУ, память, устройства, обеспечивающие прерывания, порты ввода - вывода, таймер TMR0, предделитель, сторожевой таймер WDT (перечислен минимальный "набор" для PIC16F84A. Для более сложных ПИКов этот набор еще больше).

Перечисленные выше устройства имеют по нескольку режимов работы, конкретный режим работы которых выбирает программист.

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

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

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

Вдальнейшем, такое упрощение позволит, без особого "напряга", представить себе механизм работы с битами конфигурации.

Рассмотрим регистры специального назначения (SFR).

Взгляните в область оперативной памяти.

Эти регистры находятся в закрашенных желтым цветом клеточках (адреса 07h и 87h – "пустышки"), и в них же находятся их названия.

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

А раз это так, то единственное, что можно с ними сделать, так это только изменить их содержимое, то есть, произвести те или иные манипуляции с их битами (установить те или иные из них их в 0 или 1).

Взависимости от этих манипуляций, электронная "начинка" ПИКа приобретает свойства, обеспечивающие функционирование программы (а значит и устройства) по замыслу программиста.

Регистры SFR с названиями, выделенными красным цветом, дублируются (отображаются) в обеих банках.

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

При этом, содержимое регистров SFR нулевого банка, выделенных красным цветом, дублируется (отображается) в первом банке.

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

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

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

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

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

Их называют флагами.

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

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

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

15


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

Мне она сослужила "хорошую службу", пусть послужит и Вам.

Совет: изначально, Вам будет сложновато запомнить то, что Вы увидите.

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

Общая информация по SFR: "Приложение №3".

Регистр OPTION: "Приложение №4".

Регистр STATUS: "Приложение №5".

Регистр INTCON: "Приложение №6".

Регистр EECON1: "Приложение №7".

Биты конфигурации : "Приложение №8".

Все эти файлы относятся к

PIC16F84A.

Таблица перевода чисел из одной системы исчисления в другую:

"Приложение №9".

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

В ней расписан "расклад" чисел в пределах одного байта.

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

Буквами D, B, H обозначены

десятичная, бинарная, 16-ричная системы исчисления

соответственно.

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

На данной стадии "въезда", "бардак в мозгах" нормален и естественен. Я очень удивлюсь, если этого не будет.

Втакого рода информации нужно немного "повариться", что предполагает приложение некоторых усилий.

"Кавалерийским наскоком" такие дела не делаются.

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

Пошли дальше.

Разбираемся с битами регистров SFR.

Сразу расставлю приоритеты: в первую очередь, с целью недопущения "бардака", сначала я буду рассказывать о рабочих битах, а о флагах расскажу отдельно.

С этой же целью, на первых порах, я не буду вдаваться в некоторые необязательные, для начинающих, детали (о них - позднее).

Сразу обращаю Ваше внимание: нумерация битов в байте происходит не слева -

направо, а справа - налево.

Это означает то, что бит младшего разряда (бит с номером ноль) - крайний справа, а не слева.

7-бит - самый старший. Про нумерацию битов слева направо - забудьте.

Враспечатках, красным цветом обозначены рабочие биты, зеленым цветом - флаги, серым цветом "пустышки" (не используются).

16