Самоучитель по программированию PIC контроллеров для начинающих (Е.А. Корабельников,2008). Самоучитель по программированию PIC контроллеров для начинающих. Система команд pic16F84A 26 Что такое программа иправила ее составленияПример создания программы автоколебательного мультивибратораДирективы.
Скачать 3.49 Mb.
|
Intcon equ 0Bh ; Регистр Intcon. Status equ 03h ; Регистр Status. EEData equ 08h ; EEPROM - данные equ 08h ; EECON1 - банк. EEAdr equ 09h ; EEPROM - адрес equ 09h ; EECON2 - банк. ;............................................................. ;............................................................. ;================================================================================ ; Определение названия и положения регистров общего назначения. ;================================================================================ Registr equ 0Ch ; Регистр оперативной памяти, используемый 171 ; при работе с 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 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. 172 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 с указанием адреса (см текст примера. Директива всегда трактуется однозначно (других вариантов "включения " 173 предварительной записи, в EEPROM память данных, нет, и поэтому можно "не забивать себе голову " информацией о том , что такое, а просто принять это как данность ( запомнить как правило. После этой директивы, можно исполнять одну или несколько директив DE При помощи директивы, в ячейки EEPROM памяти данных, записываются числа в диапазоне от .00 до .255. Вопрос "По каким адресами в каком порядке "? Ответ : первая , после директивы 2100h , директива, записывает первое, указанное в рабочей части этой директивы, число (крайнее левое, в ячейку 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. Так как первая, после директивы 2100h , директива "жестко привязана " к "нулевой точке отсчета " (адрес ячейки EEPROM памяти данных, равный 0), то для того чтобы "дойти " до третьей ячейки, нужно чем- то заполнить первые две ячейки (записать в них какие- то числа. Если бы эти 2 ячейки в программе задействовались , тов них нужно было бы записать определяемые программистом числа, нов нашем случае, они не задействованы, и то , какими именно числами они будут заполнены, не имеет значения В них можно записать любые, "дозволенные " числа, но обычно, в такого рода "пустышки ", записываются нули, что Вы и видите в тексте "программы ". По умолчанию, вовсе ячейки EEPROM памяти данных, записываются числа FFh (кроме ячеек, заполняемых при помощи директивы, и на этом "фоне ", тот "сектор " памяти, в котором записаны нули, "сразу бросается в глаза ", что делает более комфортным визуальное восприятие содержимого области EEPROM памяти данных Для того чтобы показать, "как плодятся и размножаются пустышки ", в данном случае, я специально поступил нерационально Это я еще "ушел " недалеко (всего- лишь адрес 02h), а если задействовать, например, последнюю ячейку с адресом 3Fh? В этом случае, рабочая часть директивы DE будет представлять собой длиннющую строку, заполнение которой, по своей сути, является достаточно бестолковой работой Практический вывод из этого следующий если необходимо задействовать ячейки EEPROM памяти данных, то сточки зрения рациональности, их нужно задействовать, начиная с первой ячейки (адрес 0) и далее , по- порядку (если нужны несколько ячеек. В этом случае, до задействованной ячейки ненужно "добираться, плодя пустышки " и рабочая часть директивы будет компактной и удобной для восприятия Если руководствоваться этими соображениями, тов нашем случае, нужно задействовать нею, а 1- ю ячейку EEPROM памяти данных (в рабочей части программы обращаться не к ячейке с адресом 2, а к ячейке с адресом 0). В этом случае, рабочая часть директивы DE будет содержать в себе не 3 числа, а одно число (.100), и дело с концом Далее , можно переходить к "разборкам " с рабочей частью программы, а директива DE будет первой и последней Конечно же, предлагаемый Вашему вниманию пример программы, можно составить и таким образом (на практике, таки нужно делать, нов обучающих целях, пусть она будет такой, 174 какой есть, а иначе отсутствует предмет разбирательств Вопрос : неужели "пустышки " так ужи бесполезны Ответ : нет Представьте себе такую ситуацию на момент начала составления текста программы, программист точно знает, что " железобетонно " потребуется одна ячейка памяти данных, в которую , в процессе "прошивки ", нужно записать константу 64h, но походу составления текста рабочей части программы, возникает необходимость в задействовании еще нескольких групп ячеек, например, двух групп, состоящих из двух ячеек каждая В этом случае, директиву DE можно "оформить " так DE или так DE 0h,0h,0h,0h,64h,0h , или так DE 0h,0h,64h,01h,01h,02h , или еще как- то (по своему желанию, с целью того чтобы как бы "зарезервировать " ячейки под будущие операции с EEPROM памятью данных, а заодно и визуально выделить, из общей "массы " (на "фоне " FFh), группу ячеек, с которыми , в дальнейшем , будет работать программа (элемент удобства, и не более того. Например, DE можно истолковать так ячейки 1, 2 и ячейки 4, 5 зарезервированы под "еще не рожденные " операции с использованием EEPROM памяти данных, в 3- ю ячейку , при "прошивке ", "закладывается " заранее определенная константа, с числовым значением .100, а 6- я ячейка , это помеченный цифрой 2 (а можно и другой ), ефрейторский зазорна всякий случай. Короче, подобного рода "оформление " - дело вкуса Я говорю об этом по той причине, что подобного рода "архитектурные излишества " часто запутывают Особенно начинающих Только ради одного этого, такие "разборки " нужны Замечания по оформлению Например , DE Если поместить "все это добро " на свое "штатное место ", то своей правой частью она "наедет " на "виртуальную ", вертикальную линию, на которой находятся точки с запятыми ( после них начинаются комментарии. По этой причине, текст соответствующего комментария придется сдвинуть вправо, что в тексте программы, создает "легкий бардачок ". Конечно же, это абсолютно не "смертельно " (у это "по барабану ") ив работе программы ничего не изменится, нов оформительском смысле ", получается "кто в лес , кто по дрова ". Для людей, приученных к порядку , это примерно тоже самое, что сесть на кнопку Чтобы "навестив этом бардаке порядок ", одну директиву можно разделить на 2 части так, как это сделано в примере программы Если рабочая часть директивы DE содержит большее количество чисел, то по такому же принципу, одну эту директиву можно "расчленить " на 3, 4, 5 и т д частей , использовав 3, 4, 5 и т д директив DE В этом случае, "начальной точкой отсчета " адреса нижней директивы, будет последний адрес директивы, располагающейся "одним этажом выше ", плюс единица Директива DE может работать не только с числами , указанными в явном виде, но и с символами Это означает то, что если в рабочей части директивы DE указать символы, входящие в состав стандартного, "компьютерного " кода, тов ячейкиEEPROMпамяти данных будут записаны числовые значения символов MPLAB об этом "позаботится " (в автомате "). При этом, группу символов нужно " закавычить ". Посмотрите в текст программы В нем Вы увидите, что при помощи третьей сверху директивы, я вставил в незадействованные ячейки (начиная с 7- й) комментарий в символьном виде Такого рода "архитектурные излишества " реализуются по принципу типа "если есть свободное местечко, то дайка я в него что- нибудь засуну ". Естественно, что это совсем необязательно Если нужно разбить текст такой надписи на части (если она слишком длинная, то это делается по принципу, описанному выше, только каждая группа символов заключается в кавычки В тексте программы, я этого делать не стал Вывод : использующиеся в программе ячейки, целесообразно расположить вначале 175 памяти данных (начиная с нулевого адреса, а в незадействованных ячейках, по умолчанию, записываются числа FFh. Примечание : атрибут 16- ричной системы исчисления (h) не указывается Другое дело, если нужно " спрятать / замаскировать ", в EEPROM памяти данных, некую "секретную " ячейку (ячейки. В этом случае как рази потребуется то, о чем говорилось выше Такого рода "секретные " ячейки, в области EEPROM памяти данных, можно "разбросать " если их несколько) как угодно, "заполнив промежутки " между ними какой- нибудь, сбивающей с толка , "абракадаброй ". Усвоив то, о чем шла речь выше, Вы без особых проблем разберетесь стем, как это делается Проконтролировать содержимое области EEPROM памяти данных можно так В главном меню |