НПО Системы Безопасности
(499)340-94-73 График работы:
ПН-ПТ: 10:00-19:00
СБ-ВС: выходной

Главная » Периодика » Безопасность

0 ... 112113114115116117118 ... 159


ПЕРЕХОД ЗА ПРЕДЕЛЫ ТЕКУЩЕЙ СТРАНИЦЫ

В общем случае для микроконтроллеров младшего подсемейства межстраничный переход имеет вид:

movf STATUS, w ; Модификация трех старших бит

andlw OxOIF ; регистра состояния,

lorlw HIGH ((Label << 4) & ОхОЕО)

movwf STATUS

goto (Label & OxOIFF) ($ & OxOEOO)

Межстраничный переход в PIC-микроконтроллерах, принадлежащих к среднему подсемейству, и в микроконтроллерах PIC iVCxx выглядит так:

movlw HIGH label : Получение номера текущего

: блока (256 команд), movwf PCLATH : Сохранение его таким образом,

, чтобы последующий переход

; был корректным, goto Label & 0x07FF) ($ & 0x01800)

Приведенный ниже фрагмент выполняет межстраничный переход (goto и call) в микроконтроллерах PIC 18Схх. Переход может осуществляться в пределах всей памяти программ. В нем использована команда branch always - BRA:

movlw UPPER Label

movwf PCLATU

Получение номера текущего блока команд. Сохранение его таким образом, чтобы последующий переход , был корректным,

movlw HIGH Label

movwf PCLATH

bra (Label & 0x07FF) ($ & OxOIEOOO)

Если используется команда вызова (call) подпрограммы с другой страницы, необходимо убедиться в том, что содержимое PCLATH (и PCLATU) восстанавливается после возврата из подпрограммы.

ТАБЛИЦЫ

В общем случае программная таблица в PIC-микроконтроллерах младшего подсемейства описывается следующим образом:

Tablel ; Возврат значения из таблицы,

; расположенной в любом месте памяти, , в регистр W



movwf Temp movf STATUS, w

andlw iorlw ftiovwf movlw addwf movwf

Сохранение табличного указателя. Подготовка к модифицикации трех старших бит регистра состояния.

OxOIF

HIGH {{TableEntries << 4) & ОхОЕ) STATUS

LOW TableEntries

Temp, w

Задание блока.

Вычисление смещения в блоке. Запись правильного адреса в программный счетчик.

TableEnt ries dt Table",

В PIC-микроконтроллерах младшего подсемейства указатель на TableEntries ни при каких обстоятельствах не должен оказаться во втором блоке страницы.

В общем случае программа табличной выборки микроконтроллеров среднего подсемейства и PIC 17Схх имеет вид:

ТаЫе2

novwf Temp

Mvlw HIGH TableEntries Mvwf PCLATH

roovwf Temp, w

addlw LOW TableEntries

btfsc STATUS, С

incf PCLATH, f

movwf PCL

TableEnt dt

Возврат табличного в регистр w. Сохранение таблично Получение номера те Сохранение его таки чтобы последующий п был правильным. Соответственно movf для PIG 17СХХ. Прибавление младших

Если в следующем бл то инкрементируется PCLATH.

Запись правильного в программный счетч

значения

го указателя, кущего блока, м образом, ереход

р Temp, WREG

разрядов.

оке, содержимое

адреса ик.

ries

"Table",

Если используется PIC-микроконтроллер 18Схх, необходимо умножить указатель на два, прежде чем изменить PCL, а также обновить содержимое PCLATU и PCLATH:

Tables

movwf Temp

movlw UPPER TableEntries

Возврат табличного значения в регистр W.

Сохранение табличного указателя Получение номера текущего блока.



movwf

PCLATU

movlw

HIGH TableEntries

movwf

PCLATH

STATUS, С

rlcf

Temp, w

btfss

STATUS, С

goto

TableSkipl

infsnz

PCLATH, f

incf

PCLATU, f

TableSkipl

addlw

LOW TableEntries

btfss

STATUS, С

goto

TableSkip2

infsnz

PCLATH, f

incf

PCLATU, f

movwf

TableEntries

"Table, 0

Сохранение его таким образом, чтобы последующий переход был правильным.

Умножение указателя на два. Если установлен перенос, инкрементируется PCLATH/PCLATU

Смещение в таблице

При необходимости инкрементируется

PCLATH/PCLATU.

Запись правильного адреса в программный счетчик

ВЕТВЛЕНИЕ ПО УСЛОВИЮ

В табл. 1I.I представлены фрагменты, используемые для различных типов сравнений и последующих переходов по условию. Обратите внимание, что в нее включены команды, оперирующие и переменными, и константами.

ВРЕМЕННЫЕ ЗАДЕРЖКИ

Ниже приведен макрос, генерирующий задержку от О до 777 циклов.

DlayMacro Macro Cycles ; Задержка.

variables i, Tcycles, Value, Tflag TCycles = Cycles Value = 1 << 7 1 = 7 TFlag = 0 TFlag = 0

If (TCycles > 5)

while (i >= If ((TFlag =

= 0)

((Value . 3) <= TCycles))

DlayCount, 1



0 ... 112113114115116117118 ... 159