Самоучитель по программированию PIC контроллеров для начинающих (Е.А. Корабельников,2008). Самоучитель по программированию PIC контроллеров для начинающих. Система команд pic16F84A 26 Что такое программа иправила ее составленияПример создания программы автоколебательного мультивибратораДирективы.
Скачать 3.49 Mb.
|
" Приложении № 10" . Вопросы Дмитрия Дубровенко выделены синим цветом По команде, использующейся для вычисляемых переходов " В примере указано ADDWF PCL,0 , то есть, результат должен записываться в аккумулятор , а не в PCL. Если это какая - то особенность, у Вас нигде не сказано про это (что надо ставить 0, а не Ну конечно же, нужно писать , а не PCL,0 , а иначе приращения счетчика команд PC ( вычисляемого перехода) не произойдет Ошибка в "чистом виде ", причем, повторяющаяся в двух примерах для команды ADDWF Почему в моих дальнейших объяснениях (в последующих разделах) ADDWF PC,1 , а не ADDWF PCL,1 ? А это зависит оттого, под каким именем "прописан " регистр счетчика команд в "шапке " программы можно "прописать " итак PC , тогда PC,1 , а можно и по - другому PCL , тогда PCL,1 ). Это на любителя ". В примерах таблицы для команды, название PCL указано потому, что в комментариях (в последнем примере) указан (для обозначения "составных частей " и порядка их "взаимодействия ", а точнее , если речь идет о вычисляемом переходе, " невзаимодействия ", так как при переполнении, приращения PCH не происходит. 34 2. По командами (примеры 2 и 3): Написано RLF INDF,1 (RRF INDF,1). Значение W, до выполнения - неопределенное. Почему, после выполнения команды, оно становится Ответ регистр "тут вообще не прич м ", так как при циклическом сдвиге (в любую сторону, он не задействуется и, по этой причине, операция циклического сдвига, по определению, никак не может повлиять на содержимое регистра что в нем "лежало до того ", то и будет "лежать после того ". Обращение команды к содержимому регистра, если результат сохраняется в нем же, также не влияет на содержимое регистра W Регистр W нужно вообще убрать из комментариев 2- го иго примеров для команд RLF и RRF , что я и сделал Как хххххххх "превратилось " в Тайна сия велика есть ". Если кто- то знает, то поделитесь разгадкой По команде ADDLW и другим командам, где упоминается HIGH(LU_TAB): До выполнения W=0x10, LU_TAB=0x9375 (адрес в памяти программ. После выполнения W=0xA3. Откуда берется этот адрес (он ведь больше максимального количества команд, и почему операции производятся со старшим байтом ?" Несоответствие (ошибка) обнаружено совершенно верно для наибольшего "объема " памяти программ ПИКов , величиной в 8 килослов , максимальная величина адреса памяти программ составляет 1FFFh. 9375h больше 1FFFh, и это число (9375h) использовать нельзя (в памяти программ ПИКов нет таких адресов. Если предположить, что речь идет не о адресе , а о содержимом 2- хбайтного регистра = 10010011 01110101), то, опять же, имеет место быть ошибка по той простой причине, что комментарий "адрес в памяти программ " неверен По всей видимости, составители подобного рода примеров пытались показать работу с табличными данными, но сделали они это "неуклюже ", в примитивном виде, да еще и с ошибками и "недомолвками ". Ничего вредоносней таких "недоношенных " примеров и представить себе трудно, и поэтому я заменил их на примеры работы с заранее "прописанной ", в "шапке " программы, константой (этому названию или другому названию, директивой, можно присвоить любое числовое значение в диапазоне 0 … 255). Пояснения По командам управления "11 бит адреса загружаются из кода команды в счетчик команд PC(10:0). 2 старших бита загружаются в счетчик команд PC(12:11) из регистра PCLATH. Вот это совсем не понял ." В " Справочнике по среднему семейству м / контроллеров PICmicro" (можно скачать на сайте Микрочипа ), на странице 6-5, найдите рисунки б, в При переходах, это именно та специфика адресации, которая имеет место быть, и ее просто нужно принять как данность По большому счету, на эти фразы можно просто не обращать внимания, так как влияния на эту специфику программист оказать не может Это аппаратная "епархия " ПИКа "Он там все сам разрулит " (при исполнении команд переходов / возвратов ). Возможно ли использовать аккумулятор в качестве аргумента именно в командах типа ADDWF (те. ADDWF W,d)? Насколько я Вас понял, нельзя ?" Никакого практического смысла в этом действии нет (разве только задержка, но для этого есть NOP ы ): обращение командой ADDWF, к содержимому W, не вызовет никаких изменений его содержимого (при любом значении что в нем "лежало до того ", то и будет "лежать после того " (можете проверить в симуляторе ). Какие еще регистры, кроме W, не надо прописывать в шапке ?" Когда речь идет о "прописке ", то под этим подразумевается предварительное указание, в "шапке " программы, адресов используемых в программе регистров области оперативной памяти "Прописка " адресов этих регистров обязательна (то ли "напрямую ", то ли при помощи директивы, иначе "откажется " создавать HEX- файл 35 Регистру же, адрес ставится в соответствие автоматически (он имеет строго фиксированный адрес. Другое дело, в каком виде к нему обращаться в "рабочей " части программы то ли нулем, то ли при помощи его общепринятого названия ( W ). Если нулем, то его можно не "прописывать ". Если, то лучше, на всякий случай, "прописать ". Это было обязательным в самых первых версиях, а в более поздних версиях ( включая и рекомендованную мной, букве W автоматически ставится в соответствие 0. В этом случае, аккумулятор можно не "прописывать ". Это же относится и к символьному обозначению регистра ( F / d =1). Можете провести эксперимент откройте текст программы Multi.asm и проассемблируйте его с "пропиской " и без нее (в "рабочей " части программы укажите, а не 0). В обеих случаях ассемблирование пройдет успешно Выводы делайте сами С целью наиболее простого и удобного "въезда " в команды , "фирменную " таблицу команд я довольно - таки основательно видоизменил ( см " Приложение № 11" ). Эти изменения можно отследить, если сравнить " Приложение № 10" с " Приложением № 11" Если есть неясности, то пишите (просьба четко сформулировать вопрос. В конце концов, ведь должна же существовать максимально доходчивая и понятная таблица команда не "кроссворд, от которого крыша едет ". Чудеса " продолжаются Валерий Галкин обнаружил еще три ошибки в "расшифровке " системы команд, опубликованной в "Справочнике по среднему семейству Все они связаны с неверными числовыми результатами выполнения команд Вопросы Валерия Галкина выделены синим цветом 1. Команда ANDWF f,d Правильно ли указано в третьем примере, что результат исполнения команды - число (по моему, Валерий прав при побитном "И" числа (17h) и (5Ah), получается число (12h), а не 00010101 (15h). Команда IORLW k Правильно ли указано во втором примере, что после выполнения команды, W = 0x9F по моему, W = Валерий прав при побитном "ИЛИ" числа (9Ah) и (37h), получается число (BFh), а не 10011111 (9Fh). 3. Команда XORLW k Правильно ли указано во втором примере, что после выполнения команды, W = 0x18 по моему, W = Валерий опять прав при побитном " Исключающее ИЛИ " числа (AFh) и, получается число (98h), а не 00011000 (18h). Выводы делайте сами Валерий , спасибо за обнаружение "мин на этом минном поле ". Таблица команд ассемблера, которая не содержит ошибок, находится в " Приложении № 12". Самоучитель по программированию PIC контроллеров для начинающих" http://ikarab.narod.ru E-mail: karabea@lipetsk.ru 36 4. Что такое программа и правила ее составления Пример создания программы автоколебательного мультивибратора Директивы Программа это таили иная последовательность команд, которая реализует замысленные программистом действия с числами . Производя те или иные действия с заранее заданными или формируемыми, входе исполнения программы, числами и / или сданными, поступающими от внешних устройств (что, по сути своей, есть все те же числа, можно сформировать требуемые алгоритмы и сигналы управления внешними исполнительными устройствами, что и есть "кульминация " работы программы (то, ради чего и " затеивается вся эта свистопляска " с нулями и единицами ). Специфики работ по созданию устройств на дискретных элементах цифровой техники (Кит д) и работ по созданию устройств на микроконтроллерах, значительно отличаются друг от друга При создании устройств на дискретных элементах цифровой техники, конструктор, преимущественно, имеет дело с машинными кодами Если речь идет об устройствах, в состав которых входит большое количество корпусов м / схем , то такое конструирование весьма хлопотно и трудоемко Устройства получаются энергоемкими, громоздкими и габаритными На их разработку и изготовление тратится много сил, времени и денег В процессе конструирования устройств нам контроллерах, конструктор, преимущественно, имеет дело нес машинными кодами, ас языком программирования ассемблер (или с каким - либо языком высокого уровня, нов конечном итоге, все сводится к ассемблеру ), c помощью которого, задачи решаются гораздо проще и эффективнее Устройства , по схемотехнике, получаются очень простыми, компактными, экономичными и относительно дешевыми Задача желающего научиться программированию ПИКов , на первых порах, сводится к изучению его "начинки ", изучению команд ассемблера и принципов построения нескольких фундаментальных подпрограмм Потом , когда Вы "войдете во вкус ", все станет гораздо понятнее и интереснее (по себе знаю. А пока , наберитесь терпения (а куда деваться Выбора- тонет Вэтой "епархии ничего с неба не падает. Итак, ранее выяснилось, что любая программа должна строиться по "циклическому принципу ", и ее рабочая точка может двигаться по командам программы либо последовательно, если нет команд переходов, либо совершить " скачёк " в то место программы, которое указывается в команде перехода (с возвратом и без возврата, либо " закольцеваться ", на какое- то время, в той или иной подпрограмме, с возможностью последующего выхода из этой " закольцовки ". Походу создания программы, программист может реализовать в ней различное количество "колец " (больших, средних, малых или еще каких- то. Самым большим "кольцом " является полный цикл программы, который, при работе программы, исполняется снова и снова , до тех пор, пока Вы не выключите питание Естественно , что прежде чем составлять программу, необходимо четко определиться как с ее стратегией, таки с принципиальной схемой создаваемого устройства, ведь программа составляется не для самой себя, а под конкретное устройство. Пример Необходимо разработать простую программу, реализующую функцию автоколебательного мультивибратора, с одним - разъединственным выходом Форма сигнала - меандр (отношение периода к длительности импульса =2). Используется PIC16F84A Под этот выход, можно назначить любой из выводов порта А или В Пусть это будет, например, вывод RB0 порта В Следовательно , необходимо установить режим работы вывода "на выход ". Кроме того, что полный цикл программы должен исполняться циклически (периодически, внутри полного цикла программы, должны иметь место быть еще и внутренние циклы А как же иначе Ведь это определяется самим принципом работы автоколебательного мультивибратора, формирующего, в пределах периода, двухуровневый сигнал В одном случае, рабочая точка программы должна " закольцеваться " (задержаться, наматывая витки "), на какое- то время, в подпрограмме формирования уровня 0, а в другом 37 случае, она должна " закольцеваться ", на какое- то время, в подпрограмме формирования уровня 1. Потом опять 0, потом опять 1 и т д И так , до "бесконечности " (пока включено питание. Форма сигнала "меандр " предполагает одинаковое время формирования этих уровней Предположим , что для каждого из уровней, это время должно быть равным 100 мкс Выстраиваем упрощенный скелет " программы После команды, переводим вывод RB0 на работу "на выход ". Далее, на выводе, в течение 100 мкс, формируем нулевой уровень Далее , на выводе RB0, в течение 100 мкс, формируем единичный уровень Переходим на новый, полный цикл программы, то есть, на команду, итак до "бесконечности " (пока питание не будет выключено. Как составляется эта программа Текст программы выглядит так ;******************************************************************************* ; Автоколебательный мультивибратор PIC16F84A Кварц 4 мГц. ;=============================================================================== LIST p=16F84A ; Установка типа микроконтроллера. __CONFIG 03FF1H ; Бит защиты выключен, WDT выключен, ; стандартный XT - генератор. ;=============================================================================== ; Определение положения регистров специального назначения. ;=============================================================================== Status equ 03h ; Регистр выбора банка. TrisB equ 06h ; Регистр выбора направления работы выводов ; порта В . PortB equ 06h ; Регистр управления защелками порта В . ;=============================================================================== ; Определение названия и положения регистров общего назначения. ;=============================================================================== Sec equ 0Ch ; Счетчик времени полупериода. ;=============================================================================== org 0 ; Начать выполнение программы с адреса 0 PC. goto Start ; Переход в ПП Start. ;******************************************************************************* ; Текст рабочей части программы. ;******************************************************************************* ; Установка направления работы RB0 - на выход. ;------------------------------------------------------------------------------- Start bsf Status,5 ; Перейти в й банк (установить в 1 й бит ; регистра Status). movlw .0 ; Записать константу 0 в аккумулятор (W). movwf TrisB ; Скопировать 0 изв регистр TrisB. bcf Status,5 ; Перейти в й банк (установить в 0 й бит ; регистра Status). ;------------------------------------------------------------------------------- ; Определение времени полупериода (закладка константы в регистр Sec). ;------------------------------------------------------------------------------- movlw .32 ; Записать в регистр W константу .32 movwf Sec ; Скопировать .32 изв регистр Sec. ;------------------------------------------------------------------------------- ; Формирование на выводе RB0 нулевого уровня. ;------------------------------------------------------------------------------- bcf PortB,0 ; Установить на выходе защелки RB0 ноль. nop ; Калибровочный машинный цикл. 38 nop ; -------------"-------------- Pause_1 decfsz Sec,F ; Декремент содержимого регистра Sec с goto Pause_1 ; помещением результата в этот же регистр Если этот результат не, то ; осуществляется переход ; в ПП Pause_1 (" закольцовка " в этой ПП ). ; Если =0, то программа исполняется далее. ;------------------------------------------------------------------------------- ; Определение времени полупериода (закладка константы в регистр Sec). ;------------------------------------------------------------------------------- movlw .30 ; Записать в регистр W константу .30 movwf Sec ; Скопировать .30 изв регистр Sec. ;------------------------------------------------------------------------------- ; Формирование на выводе RB0 единичного уровня. ;------------------------------------------------------------------------------- bsf PortB,0 ; Установить на выходе защелки RB0 единицу. nop ; Тоже самое, что и для нулевого уровня, nop ; только " закольцовка " происходит в ПП Pause_2. Pause_2 decfsz Sec,F ; ------------------"------------------- goto Pause_2 ; ------------------"------------------- goto Start ; Переход на новый полный цикл программы. ;******************************************************************************* end ; Директива конца программы (всегда ; последняя снизу |