Самоучитель по программированию PIC контроллеров для начинающих (Е.А. Корабельников,2008). Самоучитель по программированию PIC контроллеров для начинающих. Система команд pic16F84A 26 Что такое программа иправила ее составленияПример создания программы автоколебательного мультивибратораДирективы.
Скачать 3.49 Mb.
|
- Команды retlw Такой вычисляемый переход применяется для выборок данных из таблицы данных (в том числе и для перекодировок ) . Конечно же, можно как угодно, "некомпактно разбросать ", по тексту программы, команды начала исполнения сценариев, но зачем нужны лишние проблемы. Компактной группой " я называю группу команд начала исполнения сценариев программы, располагающуюся сразу же после команды PC,F. То есть, адреса этих команд, в памяти программ, "идут друг за другом " (команды не "разбросаны " по памяти программ. Например, для случая 4- сценарной работы, перед исполнением команды PC,F , нужно откуда- то скопировать, в регистр W, одно из чисел, находящихся в числовом диапазоне от нуля до трех включительно Если это сделать, то после исполнения команды PC,F , произойдет переход (прыжок ") рабочей точки программы на одну из четырех команд начала исполнения сценариев программы (после условных и безусловных , это третья разновидность переходов. В дальнейшем , после перехода на начало исполнения выбранного сценария, они будет исполнен Вопрос : "Откуда, в регистр W, могут быть записаны числа, значения которых определяют дальнейший выбор того или иного сценария работы программы "? Ответ : из регистра общего назначения, предназначенного для осуществления этой операции Соответственно , на момент начала копирования, содержимое этого регистра общего назначения должно соответствовать, сформулированному выше, "условию компактности ". 162 Если "привязаться " к случаю управления сценариями работы программы, с помощью клавиатуры, реализующей одно из 4- х возможных состояний, то для этого потребуется 2 кнопки В конечном итоге, содержимое регистра W формируется по результатам опроса клавиатуры Можно опросить клавиатуру и из большего количества кнопок В этом случае, количество возможных состояний увеличится и можно реализовать большее количество сценариев работы программы В любом случае, "прыжок " рабочей точки программы на одну из команд начала исполнения сценариев программы, происходит по принципу если в регистре W , на момент исполнения команды PC,F , записано число, то после исполнении команды PC,F , произойдет переход рабочей точки программы на команду начала исполнения сценария программы, с номером N+1 . Обращаю Ваше внимание на то, что этот "прыжок " (переход) происходит без применения команды перехода, аза счет приращения содержимого счетчика команд PC , которое происходит после исполнения команды Итак, ближе к практике Файл с примерами вычисляемых переходов addwfpc.asm находится в папке " Тексты программ. Это выглядит так ;******************************************************************************** ; ПРИМЕРЫ ИСПОЛЬЗОВАНИЯ ВЫЧИСЛЯЕМЫХ ПЕРЕХОДОВ ; ПРИМЕР 1 ;******************************************************************************** ; В данном случае, клавиатура подключена к выводам RA0 и RA1 ; (2 кнопки или тумблера. ; В "шапке" программы должен быть "прописан" регистр PC (PC equ 02h) и до исполнения команды movf PortA,W, выводы порта А , подключенные к клавиатуре , ; должны быть установлены на работу "на вход. ;-------------------------------------------------------------------------------- ...... ...... ; ...... ...... ; movf PortA,W ; Опрос клавиатуры (копирование числа, ; присутствующего на выводах порта А , ; в регистр W). ;-------------------------------------------------------------------------------- ; Применение вычисляемого перехода. ; (переход на исполнение различных сценариев в зависимости от состояния клавиатуры) ;-------------------------------------------------------------------------------- addwf PC,F ; Увеличение PC в зависимости от состояния ; клавиатуры (числа, записанного при опросе ; клавиатуры, в регистр W). goto Function ; Режим установки ПЧ . 0000 0000 goto Plus ; " Плюс ПЧ ". 0000 0001 goto Minus ; " Минус ПЧ ". 0000 0010 ; Программа исполняется далее 0011 ...... ...... ; ;================================================================================ ; ПРИМЕР 2 ;================================================================================ ; В "шапке" программы должен быть "прописан" регистр PC (PC equ 02h). ;-------------------------------------------------------------------------------- ...... ...... ; ...... ...... ; call TABLE ; Переход по стеку в ПП TABLE. Возврат по стеку из ПП TABLE, после чего программа исполняется далее. ;-------------------------------------------------------------------------------- 163 ; Применение вычисляемого перехода. ; (преобразование двоично - десятичного кода в код сегментного индикатора) ;-------------------------------------------------------------------------------- TABLE addwf PC,F ; Содержимое счетчика команд PC увеличивается ; на величину содержимого аккумулятора W. retlw b'00111111' ; ..FEDCBA = 0 retlw b'00000110' ; .....CB. = 1 retlw b'01011011' ; .G.ED.BA = 2 retlw b'01001111' ; .G..DCBA = 3 retlw b'01100110' ; .GF..CB. = 4 retlw b'01101101' ; .GF.DC.A = 5 retlw b'01111101' ; .GFEDC.A = 6 retlw b'00000111' ; .....CBA = 7 retlw b'01111111' ; .GFEDCBA = 8 retlw b'01101111' ; .GF.DCBA = 9 retlw .00 ; ........ = Все секторы погашены retlw .113 ; .GFE...A = F Признак режима установки ПЧ . retlw .246 ; HGFE.CB. = H. Признак режима " плюс ПЧ ". retlw .184 ; H.FED... = L. Признак режима " минус ПЧ ". retlw .241 ; HGFE...A = F. Признак режима частотомера. ;-------------------------------------------------------------------------------- Обращаю Ваше внимание на то, что этот файл, формально, не является программой (он является частью программы и не оформлен как "полноценная " программа) и проекта под него создавать ненужно Открыть его в MPLAB можно как обычный файл ( File Open ). Рассмотрим пример Этот пример иллюстрирует принцип "разветвления " программы на 4 сценария, выбор одного из которых ставится в зависимость от текущего состояния клавиатуры, состоящей из двух кнопок, подключенных между выводами, RA1 порта А и корпусом Для того чтобы, на выводах RA0 и RA1, обеспечить единичные уровни при отжатых кнопках ( кнопки - с нормально разомкнутыми контактами Порт А не имеет внутренней "подтяжки "), необходимо их "подтянуть ", к цепи +5v, внешними, подтягивающими резисторами В соответствии с изложенным выше принципом, команды начала исполнения сценариев программы должны располагаться компактно, сразу же после команды PC,F , что Вы и видите В данном случае, вычисляемый переход на исполнение одного из 4- х сценариев программы, производится следующим образом помощью команды производится опрос клавиатуры Так как команда movf является байт- ориентированной, тов байт (8 битов. Так как задействован порт А , имеющий 5 выводов ( PIC16F84A ), тов битах 5, 6, 7 регистра, по умолчанию, всегда будут выставляться нули Таким образом, при наличии нулей на выводах, RA3 , RA4 (это нужно обеспечить до " влёта " в эту процедуру, возможные числовые значения содержимого регистра W будут строго определенными 0, 1, 2, 3. То есть, имеет место быть компактная группа чисел Вопрос : "Почему не 1, 2, 3, 4"? Ответ : потому , что для того чтобы, после исполнения команды перейти, например, наследующую после нее команду (сценарий 1), приращение счетчика команд PC должно быть нулевым Это объясняется тем, что счетчик команд PC автоматически инкрементируется при исполнении любой команды и поэтому еще раз повторяю, если в регистре W , на момент исполнения команды PC,F , записано число, то после исполнении команды PC,F , произойдет переход рабочей точки программы на команду начала исполнения сценария программы, с номером N+1 . Например , если в регистре W "лежит " число 0, то произойдет переход на начало исполнения сценария (команда его выбора находится сразу же после команды PC,F ). И т д Вывод из этого следующий к моменту исполнения команды PortA,W , первые 2 вывода порта А должны быть настроены на работу "на вход ", а на выводах ... должны быть 164 нулевые уровни В соответствии с этим , возможные результаты опроса клавиатуры будут следующими 000000 00 - для 1- го сценария ( W =0), обе кнопки нажаты, 000000 01 - для 2- го сценария ( W =1), 1- я кнопка нажата, а 2- я отжата , 000000 10 - для 3- го сценария ( W =2), 2- я кнопка нажата, а 1- я отжата , 000000 11 - для 4- го сценария ( W =3), обе кнопки отжаты Примечание : нажатию кнопки соответствует, а отжатию , Красным цветом выделено то, что изменяется В результате опроса клавиатуры, в регистр W записывается одно из этих чисел, и далее происходит приращение содержимого счетчика команд PC на величину этого числа, плюс один автоинкремент Например , для перехода на й сценарий, содержимое счетчика команд PC увеличивается на 2 (за счет суммирования содержимого счетчика команд PC и содержимого регистра = 2 ) , а затем и еще на 1 (за счет автоинкремента содержимого счетчика команд, имеющего место быть при исполнении команды Пример 1 (см) взят из текста моей программы, которая "обслуживает " частотомер- цифровую шкалу Переходы на исполнение первых трех сценариев организованы с помощью команд безусловных переходов ( goto ), а 4- м сценарием является сценарий "программа исполняется далее ". В зависимости оттого, какая из первых трех команд goto будет исполнена, будет отработана одна из трех подпрограмм ( Function 1- й сценарий , Plus 2- й сценарий , Minus 3- й сценарий ). Естественно, что количество сценариев может быть и бОльшим В последнем , 4- м сценарии , также можно использовать команду goto А можно и не использовать (как в приведенном примере. Это зависит от замысла программы В примере № 2 показана организация так называемого табличного (аналогия с таблицей ), вычисляемого перехода, с целью преобразования двоично- десятичного кода в код 7- сегментного индикатора При конструировании устройств с отображением данных водном или нескольких- сегментных индикаторах, такого рода преобразование является абсолютно необходимым Подпрограмму этого преобразования, построенную по классическому принципу, Вы сейчас и видите ( ПП TABLE , но можно назвать ее как угодно. После стандартной команды вычисляемого перехода PC,F , компактно расположены команд начала исполнения сценариев программы Они короткие "Расшифровка " команды k : в регистр W, записывается константа, после чего, автоматически осуществляется возврат по стеку Откуда , что и куда ? Давайте разбираться Если речь идет о возврате по стеку, то сначала нужно осуществить условный переход в ПП TABLE ( call TABLE ). В принципе , команда retlw это та же команда (возврат из подпрограммы по стеку, но только более "навороченная ". Ее " навороченность " заключается в том , что она совмещает в себе рабочую операцию ( копирование в регистр W константы) и возврат по стеку. При исполнении команды, рабочей операции не совершается, а осуществляется только возврат по стеку Таким образом, команду retlw можно рассматривать как " микроподпрограмму ", состоящую из одной рабочей команды (копирование константы в регистр W ), после исполнения которой, осуществляется автоматический возврат по стеку Вот такая "хитрая " получается команда, и кстати , очень удобная (многое упрощает. После исполнения текущей команды (того или иного сценария, в регистре W, "оседает " некое число (то, которое требуется получить в результате реализации текущего сценария, а другими словами – результат кодового преобразования, которое, в дальнейшем , используется в программе 165 В рассматриваемом случае, осуществляется кодовое преобразование чисел, "привязанное " к- сегментному индикатору, но можно осуществить эту "привязку " и к чему- то другому Например , к жидкокристаллическим модулям В этом случае, тоже требуется кодовое преобразование Посмотрите на первые 10 команд retlw и обратите внимание на числовые значения констант, которые, для удобства, представлены в бинарном виде Сверьтесь с "раскладкой " секторов 7- сегментного индикатора (A,B,C,D,E,F,H), и Вы без особого труда заметите, что например, после исполнения команды 1- го сценария, в регистр W скопируется число, отображающее в 7- сегментном индикаторе символ, 2- го сценария – символ, 3- го сценария – символ 2 и т д Это означает то, что например, весовой код двоичного числа 0h, непригодный для отображения в 7- сегментном индикаторе в виде символа, с помощью подпрограммы табличного, вычисляемого перехода, будет преобразован в код , который 7- сегментный индикатор отображает в виде символа 0 То же самое относится и ко всем остальным двоичным числам до 9 включительно Первые 10 команд retlw осуществляют кодовое преобразование двоичных чисел в коды символов Первая команда сверху, производит кодовое преобразование двоичного кода числа 0 в код символа, а последняя , кодовое преобразование двоичного кода числа 9 в код символа 9 Принцип работы последующих 5- ти команд такой же, только осуществляется кодовое преобразование не в символы цифра в символы латинских букв (с задействованием запятой, и константы представлены не в бинарной , а в десятичной системе исчисления ( можно перевести ив бинарную. Итак, после исполнения того или иного сценария, в регистре W "осело " число, соответствующее коду одного из нескольких символов, которые способен отобразить- сегментный индикатор Остается только скопировать это число, из регистра W, в регистр порта (его выводы должны быть настроены на работу "на выход "), к выводам которого подключены секторы- сегментного индикатора То есть, вывести символ на индикацию Каким образом должны формироваться значения чисел, копируемых в регистр W, перед началом отработки подпрограммы табличного, вычисляемого перехода Команда может находиться в тексте программы или доили после ПП TABLE , так как в (в связи с " слабосильностью ", разделения на страницы памяти программ нет, условный (и безусловный тоже) переход можно осуществить из любого "места " текста программы, в любое "места " текста программы Единственное ограничение граница" между блоками памяти программ (один блок это ячеек PC ) не должна "проходить" через таблицу вычисляемого перехода (об этом говорилось ранее. В нашем случае, команда находится выше (по тексту программы, а значит ив) ПП TABLE В случае 15- тисценарной работы, с учетом того, что команды начала исполнения сценариев программы расположены компактно, максимальное значение числа, предварительно записываемого в регистр W , должно быть 15-1=14. То есть, в регистр W , предварительно, должны записываться числа, находящиеся в числовом диапазоне от .0 до .14. Для первых 10- ти сценариев, значения этих чисел дублируются в символьной форме, 1 1 , 2 2 , ... 9 9 ). В данном случае, к значениям чисел, предварительно записываемым в регистр W для исполнения сценариев с по 15 (числа с .10 по .14), должны быть "жестко привязаны " результаты выполнения операций установки признаков режимов, которые, в свою очередь, жестко привязаны " к результату опроса состояния клавиатуры (режимы работы устройства переключаются при помощи клавиатуры. Аналогичные "привязки " режимов / подрежимов работы устройства (или еще чего- ток тем или иным символам, выводимым на индикацию, осуществляются до исполнения команды и "механизм " их осуществления может быть различным В большинстве случаев, ПП вычисляемого перехода, подобная ПП TABLE , вызывается TABLE ) из циклических подпрограмм обработки содержимого неких регистров общего назначения, содержащих в себе данные, предназначенные для вывода на индикацию 166 Для краткости, назову эти регистры |