44946

Организация вычисляемого перехода

Реферат

Информатика, кибернетика и программирование

Вычисляемый переход осуществляется при помощи команды ddwf PCF которая формально описывается так: сложить содержимое регистров W и PC с сохранением результата сложения в регистре PC имеется ввиду младший байт счетчика команд с названием PCL. Для вычисляемого перехода адрес в PC на момент исполнения команды ddwf PCF является как бы начальной точкой отсчета т. число находящееся в регистре W на момент исполнения команды ddwf PCF которое и будет приращением счетчика команд PC.

Русский

2013-11-14

41.46 KB

2 чел.

Организация вычисляемого перехода

Нам уже известно, что команды ветвления “порождают” 2 сценария работы программы. А как быть, если нужно “компактно разветвиться” на большее число сценариев, например, на 4 сценария (для того чтобы впоследствии “уйти” на исполнение того или иного из этих 4-х сценариев). Нетрудно догадаться, что для этого можно организовать серию последовательных проверок. Но это можно сделать и при помощи, так называемого, вычисляемого перехода (стандартное название операции). В последнем случае можно обойтись количеством команд меньшим, чем в первом случае. Такого рода выигрыш тем заметнее, чем на большее количество сценариев нужно “разветвиться”.

Вычисляемый переход осуществляется при помощи команды addwf PC,F, которая формально описывается так: сложить содержимое регистров W и PC, с сохранением результата сложения в регистре PC (имеется ввиду младший байт счетчика команд с названием PCL). Для вычисляемого перехода адрес в PC на момент исполнения команды addwf PC,F является как бы начальной точкой отсчета, т.е. выбор дальнейшего сценария работы программы зависит от приращения счетчика команд PC.

Прежде чем вставить в текст программы команду addwf PC,F, необходимо определиться с критерием перехода, т.е. с содержимым чего-то, что определяет, какой именно из 4-х сценариев будет далее исполняться. Это “чего-то” есть регистр W, а критерием перехода является его содержимое, т.е. число, находящееся в регистре W на момент исполнения команды addwf PC,F, которое и будет приращением счетчика команд PC.

Какие числа должны быть записаны в регистр W? Для того чтобы процедура вычисляемого перехода получилась “компактной”, значения этих чисел, в данном случае (4 сценария), должны быть равны 0, 1, 2, 3 (почему именно такие значения, а не 1, 2, 3, 4, разберемся позже). Если сценариев больше чем 4, то этот числовой ряд нужно продолжить (количество этих чисел должно быть равно количеству сценариев).  

Например, для случая 4-сценарной работы, перед исполнением команды addwf PC,F, нужно откуда-то (из регистра общего назначения, предназначенного для осуществления этой операции) скопировать в регистр W одно из чисел, находящихся в числовом диапазоне от нуля до трех включительно. Если это сделать, то после исполнения команды addwf PC,F произойдет переход (“прыжок”) рабочей точки программы на одну из четырех команд начала исполнения сценариев программы. В дальнейшем, после перехода на начало исполнения выбранного сценария, он и будет исполнен.

Командами начала исполнения сценариев могут быть:

  1.  Команды goto. Такой вычисляемый переход применяется в тех случаях, когда выбор того или иного сценария работы программы нужно поставить в зависимость от внешнего управления (например, от состояния клавиатуры) или от результатов работы программы (например, от результата вычисления). Последним сценарием в этом случае может быть (а может и не быть. Зависит от задумки) сценарий “программа исполняется далее”;
  2.  Команды retlw. Такой вычисляемый переход применяется для выборок данных из таблицы данных (в том числе и для перекодировок).

Команды начала исполнения сценариев обычно “компактно” размещают сразу же после команды addwf PC,F, т.е. адреса этих команд в памяти программ “идут друг за другом” (команды не “разбросаны” по памяти программ). В любом случае, “прыжок” рабочей точки программы на одну из команд начала исполнения сценариев программы происходит по принципу: если в регистре W, на момент исполнения команды addwf PC,F, записано число N, то после исполнении команды addwf PC,F, произойдет переход рабочей точки программы на команду начала исполнения сценария программы, с номером N+1. Обратите внимание на то, что этот “прыжок” (переход) происходит без применения команды перехода, а за счет приращения содержимого счетчика команд PC, которое происходит после исполнения команды addwf PC,F. Итак, вычисляемый переход является третьей разновидностью переходов (после условных и безусловных переходов).

Если “привязаться” к случаю управления сценариями работы программы с помощью клавиатуры, реализующей одно из 4-х возможных состояний, то для этого потребуется 2 кнопки. В конечном итоге, содержимое регистра W формируется по результатам опроса клавиатуры. Можно опросить клавиатуру и из большего количества кнопок. В этом случае, количество возможных состояний увеличится и можно реализовать большее количество сценариев работы программы.

Следующая программа иллюстрирует принцип “разветвления” программы на 4 сценария, выбор одного из которых ставится в зависимость от текущего состояния клавиатуры, состоящей из двух кнопок, подключенных между выводами RA0, RA1 порта А и корпусом.

; Computed Branch-1

;=========================

; Microcontroller PIC16F84A

; Clock Frequency 4.0 MHz

;=========================

Sec  equ  0Ch

Num  equ  0Dh

SecL  equ  0Eh

SecH  equ  0Fh

;=========================

 org  0

 goto  START

; ****************************

START bsf  Status,RP0

 movlw .3

 movwf TrisA

 movlw .0

 movwf TrisB

 bcf  Status,RP0

;------------------------------------------

PULSES movlw .255

 movwf SecL

 movlw .3

 movwf SecH

DEL  decfsz SecL,F

 goto  DEL

 decfsz SecH,F

 goto  DEL

 movlw .10

 movwf Num

 movf  PortA,W

 addwf  PCL,F

 goto  F0

 goto  F1

 goto  F2

;=========================

F3  movlw .128

 movwf Sec

F3_0  bcf  PortB,3

;------------------------------------------

 decfsz Sec,F

 goto  F3_0

 movlw .127

 movwf Sec

F3_1  bsf  PortB,3

;------------------------------------------

 decfsz Sec,F

 goto  F3_1

;------------------------------------------

 clrwdt

 decfsz Num,F

 goto  F3

 bcf  PortB,3

 goto  PULSES

;=========================

F2  movlw .99

 movwf Sec

 bcf  PortB,2

 nop

;------------------------------------------

F2_0  decfsz Sec,F

 goto  F2_0

 movlw .98

 movwf Sec

 bsf  PortB,2

;------------------------------------------

F2_1  decfsz Sec,F

 goto  F2_1

;-------------------------------

 clrwdt

 decfsz Num,F

 goto  F2

 bcf  PortB,2

 goto  PULSES

;=========================

F1  movlw .66

 movwf Sec

 bcf  PortB,1

;------------------------------------------

F1_0  decfsz Sec,F

 goto  F1_0

 movlw .64

 movwf Sec

 bsf  PortB,1

 nop

 nop

;------------------------------------------

F1_1  decfsz Sec,F

 goto  F1_1

;------------------------------------------

 clrwdt

 decfsz Num,F

 goto  F1

 bcf  PortB,1

 goto  PULSES

;=========================

F0  movlw .32

 movwf Sec

 bcf  PortB,0

 nop

 nop

;------------------------------------------

F0_0  decfsz Sec,F

 goto  F0_0

 movlw .31

 movwf Sec

 bsf  PortB,0

 nop

;------------------------------------------

F0_1  decfsz Sec,F

 goto  F0_1

;------------------------------------------

 clrwdt

 decfsz Num,F

 goto  F0

 bcf  PortB,0

 goto  PULSES

; ****************************

 end

В соответствии с изложенным выше принципом, команды начала исполнения сценариев программы должны располагаться компактно, сразу же после команды 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, т.е. имеет место быть компактная группа чисел. Выбор начального значения этого набора чисел, равным нулю, объясняется тем, что счетчик команд PC автоматически инкрементируется при исполнении любой команды. Следовательно,  если в регистре W на момент исполнения команды addwf PC,F записано число N, то после исполнения этой команды произойдет переход рабочей точки программы на команду начала исполнения сценария программы с номером N+1. Следовательно, если в регистре W “лежит” число 0, то произойдет переход на начало исполнения сценария №1 (команда его выбора находится сразу же после команды addwf PC,F). И т.д.

Рассмотрим подготовительный этап. К моменту исполнения команды movf PortA,W первые 2 вывода порта А должны быть настроены на работу ”на вход”, а на выводах RA2 ... RA4 должны быть нулевые уровни. В этом случае в соответствии с тем, что нажатию кнопки соответствует 0, а отжатию – 1, возможные результаты опроса клавиатуры будут следующими:

  1. 00000000 – для 1-го сценария, обе кнопки нажаты;
  2. 00000001 – для 2-го сценария, 1-я кнопка нажата, а 2-я отжата;
  3. 00000010 – для 3-го сценария, 2-я кнопка нажата, а 1-я отжата;
  4. 00000011 – для 4-го сценария, обе кнопки отжаты.

В результате опроса клавиатуры, в регистр W записывается одно из этих чисел, и далее происходит приращение содержимого счетчика команд PC на величину этого числа, плюс один автоинкремент. Переходы на исполнение первых трех сценариев организованы с помощью команд безусловных переходов (goto), а 4-м сценарием является сценарий “программа исполняется далее”. В зависимости от того, какая из первых трех команд goto будет исполнена, будет отработана одна из трех подпрограмм (“F0” – 1-й сценарий, “F1” – 2-й сценарий, “F2” – 3-й сценарий). В последнем, 4-м сценарии, также можно использовать команду goto или применить сценарий “программа исполняется далее” (как в приведенном примере). Естественно, что количество сценариев может быть и больше.

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

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

; Computed Branch-2

;===============================

; Microcontroller PIC16F84A

; Clock Frequency 4.0 MHz

;===============================

Sec  equ  0Ch

Number equ  0Dh

SecL  equ  0Eh

SecH  equ  0Fh

;===============================

 org  0

 goto  START

;*******************************

TABLE addwf  PCL,F

 retlw  b'00111111'

 retlw  b'00000110'

 retlw  b'01011011'

 retlw  b'01001111'

 retlw  b'01100110'

 retlw  b'01101101'

 retlw  b'01111101'

 retlw  b'00000111'

 retlw  b'01111111'

 retlw  b'01101111'   

 retlw  .00

 retlw  .62

 retlw  .116

 retlw  .56

 retlw  .115

 retlw  .118

;*******************************

START bsf  Status,RP0

 movlw .15

 movwf TrisA

 movlw .0

 movwf TrisB

 bcf  Status,RP0

;----------------------------------------------------

 movlw .255

 movwf SecL

 movlw .255

 movwf SecH

DEL  clrwdt

 decfsz SecL,F

 goto  DEL

 decfsz SecH,F

 goto  DEL

 movf  PortA,W

 call  TABLE

 movwf PortB

 goto  START

;===============================

 end

Эта программа иллюстрирует принцип “разветвления” программы на 16 сценариев, выбор одного из которых ставится в зависимость от текущего состояния клавиатуры, состоящей из четырех кнопок, подключенных между выводами RA0, RA1, RA2, RA3 порта А и корпусом. В подготовительном этапе программы, т.е. к моменту исполнения команды movf PortA,W первые 4 вывода порта А должны быть настроены на работу ”на вход”, а на пятом выводе (RA4) должен быть установлен нулевой уровень.

В этой программе вычисляемый переход на исполнение одного из 16-ти сценариев программы, производится следующим образом. C помощью команды movf PortA,W, производится опрос состояний кнопок. Таким образом, возможные числовые значения содержимого регистра W будут строго определенными (от 0 до 15). В этой программе, после стандартной команды вычисляемого перехода addwf PC,F, компактно расположены 16 команд начала исполнения коротких сценариев программы. “Расшифровка” команды retlw k: в регистр W, записывается константа, после чего, автоматически осуществляется возврат по стеку. Различие команды retlw от команды return (обычный возврат из подпрограммы по стеку) в том, что она совмещает в себе рабочую операцию (копирование в регистр W константы) и возврат по стеку. Таким образом, команду retlw можно рассматривать как “микроподпрограмму”, состоящую из одной рабочей команды (копирование константы в регистр W), после исполнения которой, осуществляется автоматический возврат по стеку.

После исполнения текущей команды retlw (того или иного сценария), в регистре W “оседает” некое число (то, которое требуется получить в результате реализации текущего сценария, а другими словами – результат кодового преобразования), которое, в дальнейшем, используется в программе. В рассматриваемом случае осуществляется кодовое преобразование чисел, “привязанное” к 7-сегментному индикатору, но можно осуществить эту “привязку” и к чему-то другому, например, к жидкокристаллическим модулям, к которым тоже требуется кодовое преобразование.

Посмотрите на первые 10 команд retlw и обратите внимание на числовые значения констант, которые, для удобства, представлены в бинарном виде. Сверьтесь с “раскладкой” секторов 7-сегментного индикатора (A,B,C,D,E,F,H), и Вы без особого труда заметите, что например, после исполнения команды 1-го сценария, в регистр W скопируется число, отображающее в 7-сегментном индикаторе символ 0, 2-го сценария – символ 1, 3-го сценария – символ 2 и т.д. Это означает то, что например, весовой код двоичного числа 0h, непригодный для отображения в 7-сегментном индикаторе в виде символа 0, с помощью подпрограммы табличного, вычисляемого перехода, будет преобразован в код, который 7-сегментный индикатор отображает в виде символа 0. То же самое относится и ко всем остальным двоичным числам до 9 включительно. Итак, первые 10 команд retlw осуществляют кодовое преобразование двоичных чисел в коды символов 0 … 9. Принцип работы последующих 6-ти команд такой же, только осуществляется кодовое преобразование не в символы цифр, а в символы латинских букв, и константы представлены не в бинарной, а в десятичной системе исчисления (можно перевести и в бинарную).

Итак, после исполнения того или иного сценария, в регистре W “осело” число, соответствующее коду одного из нескольких символов, которые способен отобразить 7-сегментный индикатор. Остается только скопировать это число из регистра W в регистр порта (его выводы должны быть настроены на работу “на выход”), к выводам которого подключены секторы 7-сегментного индикатора, и вывести символ на индикацию.

Команда call TABLE может находиться в тексте программы или до, или после подпрограммы TABLE, так как в PIC16F84A (в связи с отсутствием разделения на страницы памяти программ) условный (и безусловный тоже) переход можно осуществить из любого “места” текста программы, в любое “место” текста программы. Единственное ограничение: “граница” между блоками памяти программ (один блок это 256 ячеек) не должна “проходить” через таблицу вычисляемого перехода. В нашем случае, команда call TABLE находится ниже (по тексту программы) подпрограммы TABLE.

Необходимое для реализации вычисляемого перехода значение числа, копируемого в регистр W, перед началом отработки подпрограммы табличного вычисляемого перехода TABLE, вводится в виде двоичного кода с помощью кнопок, размещенных около соответствующих выводов порта A. В случае работы на 16 сценариев и с учетом того, что команды начала исполнения сценариев программы расположены компактно, максимальное значение вводимого, т.е. записываемого затем в регистр W числа, должно быть 16-1=15. Следовательно, в регистр W, предварительно, должны записываться числа, находящиеся в числовом диапазоне от .0 до .15.

Задержка, реализуемая с помощью регистров SecH и SecL, введена в программу для обеспечения “комфортности” осуществления операции ввода двоичного кода необходимого числа и достаточного времени для отображения предыдущего символа перед сменой его на другой.


 

А также другие работы, которые могут Вас заинтересовать

28758. КУЛЬТУРА В ПОСЛЕВОЕННЫЕ ГОДЫ 24.87 KB
  Во время одной из встреч с деятелями литературы и искусства Н. Но тема репрессий сталинских лагерей не ушла из литературы. В начале 60х годов усилилось разоблачение €œидейных шатаний€ деятелей литературы и искусства. Общественный подъем этого времени содействовал становлению творчества деятелей литературы и искусства нового поколения.