Файл: Самоучитель по программированию PIC контроллеров для начинающих (Е.А. Корабельников,2008).pdf
ВУЗ: Не указан
Категория: Не указан
Дисциплина: Не указана
Добавлен: 16.06.2025
Просмотров: 3590
Скачиваний: 3
Можно организовать серию последовательных проверок, а можно организовать и вычисляемый переход.
В последнем случае, можно обойтись количеством команд меньшим, чем в первом случае, и "в мозги это ложится" более комфортно.
Такого рода выигрыш тем заметнее, чем на большее количество сценариев нужно "разветвиться".
Прежде чем вставить в текст программы команду addwf PC,F, необходимо определиться с критерием перехода, то есть, с содержимым чего-то, что определяет, какой именно из 4-х сценариев будет далее исполняться.
Это "чего-то" есть регистр W, а критерием перехода является его содержимое, то есть, число, находящееся в регистре W на момент исполнения команды addwf PC,F.
Это число и есть приращение счетчика команд PC.
Еще раз повторяю, что команда addwf PC,F, в памяти программ, может иметь любой адрес, и в случае организации вычисляемого перехода, этот адрес определяет только положение этой команды в памяти программ и не влияет на выбор дальнейших сценариев работы программы.
Этот выбор зависит от приращения счетчика команд PC. Какие числа должны быть записаны в регистр W?
Для того чтобы процедура вычисляемого перехода получилась "компактной", значения этих чисел, в данном случае (4 сценария), должны быть равны 0, 1, 2, 3 (почему именно такие значения, а не 1, 2, 3, 4, Вы поймете позже).
Если сценариев большее чем 4, то этот числовой ряд нужно продолжить (количество этих чисел должно быть равно количеству сценариев).
После осуществления одного из нескольких возможных приращений содержимого счетчика команд PC, будет осуществлен переход (стек не задействован) на одну из команд начала исполнения сценариев программы, которая и будет исполнена в последующих машинных циклах.
Командами начала исполнения сценариев могут быть:
-Команды goto.
Последним сценарием, может быть (а может и не быть. Зависит от задумки)
сценарий "программа исполняется далее".
Такой вычисляемый переход применяется в тех случаях, когда выбор того или иного сценария работы программы нужно поставить в зависимость от внешнего управления (например, от состояния клавиатуры) или от результатов работы программы (например, от результата вычисления).
-Команды retlw.
Такой вычисляемый переход применяется для выборок данных из таблицы данных (в том числе и для перекодировок).
Конечно же, можно как угодно, "некомпактно разбросать", по тексту программы, команды начала исполнения сценариев, но зачем нужны лишние проблемы?.
"Компактной группой" я называю группу команд начала исполнения сценариев программы, располагающуюся сразу же после команды addwf PC,F.
То есть, адреса этих команд, в памяти программ, "идут друг за другом" (команды не "разбросаны" по памяти программ).
Например, для случая 4-сценарной работы, перед исполнением команды addwf PC,F, нужно откуда-то скопировать, в регистр W, одно из чисел, находящихся в числовом диапазоне от нуля до трех включительно.
Если это сделать, то после исполнения команды addwf PC,F, произойдет переход ("прыжок") рабочей точки программы на одну из четырех команд начала исполнения сценариев программы (после условных и безусловных, это третья разновидность переходов).
В дальнейшем, после перехода на начало исполнения выбранного сценария, он и будет исполнен.
Вопрос: "Откуда, в регистр W, могут быть записаны числа, значения которых определяют дальнейший выбор того или иного сценария работы программы"?
Ответ: из регистра общего назначения, предназначенного для осуществления этой операции. Соответственно, на момент начала копирования, содержимое этого регистра общего назначения должно соответствовать, сформулированному выше, "условию компактности".
161
Если "привязаться" к случаю управления сценариями работы программы, с помощью клавиатуры, реализующей одно из 4-х возможных состояний, то для этого потребуется 2 кнопки.
Вконечном итоге, содержимое регистра W формируется по результатам опроса клавиатуры. Можно опросить клавиатуру и из большего количества кнопок.
Вэтом случае, количество возможных состояний увеличится и можно реализовать большее количество сценариев работы программы.
Влюбом случае, "прыжок" рабочей точки программы на одну из команд начала исполнения сценариев программы, происходит по принципу: если в регистре W, на момент исполнения команды addwf PC,F, записано число N, то после исполнении команды addwf PC,F, произойдет переход рабочей точки программы на команду начала исполнения сценария программы, с номером N+1.
Обращаю Ваше внимание на то, что этот "прыжок" (переход) происходит без применения команды перехода, а за счет приращения содержимого счетчика команд PC, которое происходит после исполнения команды addwf PC,F.
Итак, ближе к практике.
Файл с примерами вычисляемых переходов 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 |
...... |
...... |
; Программа исполняется далее |
0000 |
0011 |
...... |
...... |
; |
||
;================================================================================
; ПРИМЕР № 2
;================================================================================
; В "шапке" программы должен быть "прописан" регистр PC (PC equ 02h).
;-------------------------------------------------------------------------------- |
|||
...... |
...... |
; |
|
...... |
...... |
; |
|
call |
TABLE |
; Переход по стеку в ПП |
TABLE. |
...... |
...... |
;<--Возврат по стеку из |
ПП TABLE, после чего |
...... |
...... |
; программа исполняется |
далее. |
;-------------------------------------------------------------------------------- |
162
; |
Применение вычисляемого перехода. |
||||
; (преобразование двоично-десятичного кода в код 7-сегментного индикатора) |
|||||
;-------------------------------------------------------------------------------- |
|||||
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).
Рассмотрим пример № 1.
Этот пример иллюстрирует принцип "разветвления" программы на 4 сценария, выбор одного из которых ставится в зависимость от текущего состояния клавиатуры, состоящей из двух кнопок, подключенных между выводами RA0, RA1 порта А и корпусом.
Для того чтобы, на выводах RA0 и RA1, обеспечить единичные уровни при отжатых кнопках (кнопки - с нормально разомкнутыми контактами. Порт А не имеет внутренней "подтяжки"), необходимо их "подтянуть", к цепи +5v, внешними, подтягивающими резисторами.
Всоответствии с изложенным выше принципом, команды начала исполнения сценариев программы должны располагаться компактно, сразу же после команды addwf PC,F, что Вы и видите.
Вданном случае, вычисляемый переход на исполнение одного из 4-х сценариев программы, производится следующим образом.
C помощью команды movf PortA,W, производится опрос клавиатуры.
Так как команда movf является байт-ориентированной, то в регистр W записывается байт (8 битов).
Так как задействован порт А, имеющий 5 выводов (PIC16F84A), то в битах № 5, 6, 7 регистра PortA, по умолчанию, всегда будут выставляться нули.
Таким образом, при наличии нулей на выводах RA2, RA3, RA4 (это нужно обеспечить до "влёта" в эту процедуру), возможные числовые значения содержимого регистра W будут строго определенными: 0, 1, 2, 3.
То есть, имеет место быть компактная группа чисел. Вопрос: "Почему не 1, 2, 3, 4"?
Ответ: потому, что для того чтобы, после исполнения команды addwf PC,F, перейти, например, на следующую после нее команду (сценарий № 1), приращение счетчика команд PC должно быть нулевым.
Это объясняется тем, что счетчик команд PC автоматически инкрементируется при исполнении любой команды и поэтому еще раз повторяю, если в регистре W, на момент исполнения команды addwf PC,F, записано число N, то после исполнении
команды addwf PC,F, произойдет переход рабочей точки программы на команду начала исполнения сценария программы, с номером N+1.
Например, если в регистре W "лежит" число 0, то произойдет переход на начало исполнения сценария №1 (команда его выбора находится сразу же после команды addwf PC,F). И т.д. Вывод из этого следующий: к моменту исполнения команды movf PortA,W, первые 2 вывода
порта А должны быть настроены на работу "на вход", а на выводах RA2 ... RA4 должны быть
163
нулевые уровни.
Всоответствии с этим, возможные результаты опроса клавиатуры будут следующими: 00000000 - для 1-го сценария (W=0), обе кнопки нажаты,
00000001 - для 2-го сценария (W=1), 1-я кнопка нажата, а 2-я отжата, 00000010 - для 3-го сценария (W=2), 2-я кнопка нажата, а 1-я отжата, 00000011 - для 4-го сценария (W=3), обе кнопки отжаты.
Примечание: нажатию кнопки соответствует 0, а отжатию, 1. Красным цветом выделено то, что изменяется.
Врезультате опроса клавиатуры, в регистр W записывается одно из этих чисел, и далее происходит приращение содержимого счетчика команд PC на величину этого числа, плюс один автоинкремент.
Например, для перехода на 3-й сценарий, содержимое счетчика команд PC увеличивается на 2 (за счет суммирования содержимого счетчика команд PC и содержимого регистра W = 2), а затем и еще на 1 (за счет автоинкремента содержимого счетчика команд PC, имеющего место быть при исполнении команды addwf PC,F).
Пример № 1 (см. addwfpc.asm) взят из текста моей программы, которая "обслуживает" частотомер-цифровую шкалу.
Переходы на исполнение первых трех сценариев организованы с помощью команд безусловных переходов (goto), а 4-м сценарием является сценарий "программа исполняется далее".
Взависимости от того, какая из первых трех команд goto будет исполнена, будет отработана одна из трех подпрограмм (Function 1-й сценарий, Plus 2-й сценарий, Minus 3-й сценарий).
Естественно, что количество сценариев может быть и бОльшим.
Впоследнем, 4-м сценарии, также можно использовать команду goto.
А можно и не использовать (как в приведенном примере). Это зависит от замысла программы.
Впримере № 2 показана организация так называемого табличного (аналогия с таблицей), вычисляемого перехода, с целью преобразования двоично-десятичного кода в код 7-сегментного индикатора.
При конструировании устройств с отображением данных в одном или нескольких 7-сегментных индикаторах, такого рода преобразование является абсолютно необходимым. Подпрограмму этого преобразования, построенную по классическому принципу, Вы сейчас и видите (ПП TABLE, но можно назвать ее как угодно).
После стандартной команды вычисляемого перехода addwf PC,F, компактно расположены 15 команд начала исполнения сценариев программы.
Они короткие.
"Расшифровка" команды retlw k : в регистр W, записывается константа, после чего, автоматически осуществляется возврат по стеку.
Откуда, что и куда? Давайте разбираться.
Если речь идет о возврате по стеку, то сначала нужно осуществить условный переход в ПП
TABLE (call TABLE).
Впринципе, команда retlw это та же команда return (возврат из подпрограммы по стеку), но только более "навороченная".
Ее "навороченность" заключается в том, что она совмещает в себе рабочую операцию
(копирование в регистр W константы) и возврат по стеку.
При исполнении команды return, рабочей операции не совершается, а осуществляется только возврат по стеку.
Таким образом, команду retlw можно рассматривать как "микроподпрограмму", состоящую из одной рабочей команды (копирование константы в регистр W), после исполнения которой, осуществляется автоматический возврат по стеку.
Вот такая "хитрая" получается команда, и кстати, очень удобная (многое упрощает).
После исполнения текущей команды retlw (того или иного сценария), в регистре W, "оседает" некое число (то, которое требуется получить в результате реализации текущего сценария, а другими словами – результат кодового преобразования), которое, в дальнейшем, используется в программе.
164