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

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

0 ... 135136137138139140141 ... 159


Обратите внимание, что метки в операторах ассемблера не имеют двоеточия и применяется обычный для ассемблера индикатор комментария - точка с запятой (,).

Обработка прерываний в PicBasic осуществляется двумя способами. Наиболее простой способ заключается в использовании оператора ON INTERRUPT GOTO Label. В этом случае каждый раз при получении запроса на прерывание реализуется переход к метке Label, указанной в операторе ON INTERRUPT GOTO, и выполняется соответствующая программа до оператора resume, который выводит микроконтроллер из прерывания. Здесь можно обойтись без команд ассемблера.

Основная операция выглядит следующим образом:

ON INTERRUPT GOTO IntHandler IntHandler

disable Запрещение прерываний

Обработка прерывания enable Разрешение других прерываний

resume Возврат к исходному коду

Однако при использовании этого метода возникает проблема: программа обработки прерываний запускается, когда завершается исполнение текущего оператора. Поэтому при выполнении очень длинного оператора (например, при пересылке последовательного кода) прерывание может не произойти в требуемый срок.

Оптимальным способом для обработки прерываний является применение ассемблера. Ниже для обозначения упомянутого обработчика служит директива define INTHAND Label, указывающая метку, по которой располагается код ассемблера. В случае микроконтроллеров среднего подсемейства вектор обработки прерываний находится по адресу 0x004.

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

int w var byte 0x020 system Определение регистров

int fsr var byte 0x021 system сохранения контекста

int pclath var byte 0x022 system Variables

int status var byte bankO system int fsr var byte bankO system int pclath var byte bankO system

define INTHANDLER IntHandler Спецификация прерывания



Сохранение контекстных регистров. Банк 0.

Программа обработки прерываний с вектором по адресу 0x00004. asm

IntHandler

movwf int w

movf STATUS, w

bcf STATUS, RPO

bcf STATUS, RP1

movwf int Btatus

movf FSR, w

movwf int fsr

movf PCLATH, w

raovwf int pclath

clrf PCLATH

; ### - В этом месте располагается подпрограмма обработки ; прерываний.

movf

movwf movf movwf movf movwf swapf swapf retfie endasra

int pclath, w

PCLATH int fsr, w FSR

intstatus, w STATUS int w, f int w, w

Прерывание закончено, восстанавливается содержимое регистров контекста.

Обратите внимание, что в шаблоне показано сохранение содер-.жимого регистров контекста в максимальном составе.

Математические операторы, используемые в операторах присваивания и командах PicBasic, очень просты и работают совершенно стандартным образом. Необходимо напомнить, что в Basic Stamp PBASIC операции выполняются слева направо; например, оператор

А = В + С X D,

как и ожидается, должен выполняться в следующем порядке:

1. Умножить С на D.

2. Прибавить полученный результат к В.

В случае Parallax PBASIC значение А получается следующим образом:

1. Сложить В и С.

2. Умножить полученный результат на D.

PicBasic следует обычным правилам вычисления, поэтому отпадает необходимость разбивать упомянутые сложные операторы на



одиночные операции, как это происходит в PBASIC. При «переводе» приложения PicBasic в Basic Stamp нужно разделить сложные операторы и использовать временные величины.

В табл. 15.15 представлены математические операторы, приоритет их выполнения и параметры. Все математические операторы работают с 16-разрядными величинами.

1аблица 15.15 Математические операторы

Приоритет

Операторы

Описание

Низший

Parml + Parm2

Возвращает сумму Parml и Parm2

Parml - Parm2

Возвращает результат вычитания Parm2 из Parml

Parml • Parm2

Возвращает младшие 16 бит произведения Parml и Parm2. Часто они обозначаются байтами 0 и 1 результата

Parml •/ Parm2

Возвращает средние 16 бит произведения Parml и Parm2. Часто они обозначаются байтами 1 и 2 результата

Parml ** Parm2

Возвращает старшие 16 бит произведения Parml и Parm2. Часто они обозначаются байтами 2 и 3 результата

Parml / Parm2

Возвращает частное отделения Parm2 на Parml

Parml Parm2

Возвращает остаток от деления Parm2 на Parml. Эта операция известна под названием «деление по модулю»

Parml & Parm2

Возвращает результат логического И Parml и Parm2

Parml 1 Parm2

Возвращает результат логического ИЛИ Parml и Parm2

Parml ~ Parm2

Возвращает результат операции Исключающее ИЛИ Parml и Parm2

-Parml

Возвращает инвертированное значение Parml

Parml &/ Parm2

Возвращает результат логического И-НЕ Parml и Рагга2

Parml 1/ Parm2

Возвращает результат логического ИЛИ-НЕ Parml и Parm2

Parml "/ Parm2

Возвращает результат операции Исключающее ИЛИ-НЕ Parml и Parm2

Parml « Parm2

Сдвигает Parml влево на Parm2 бит. Все младшие биты будут равны 0

Parml » Parm2

Сдвигает Parml вправо на Parm2 бит. Все старшие биты будут равны 0

ABS Parml

Возвращает модуль числа (ABS - 4 равно A8S 4, и возвращается 4)

Parml MAX Parm2

Возвращает наибольшее значение из двух

Parml MIN Parm2

Возвращает наименьшее значение

Parml DIG Parm2

Возвращает цифру с номером Parm2 (отсчет от 0) из Parml (123 DIG 1 возвращает 2)

DCD Parml

Возвращает байт, в котором только бит Parml равен 1 (DCD 4 возвращает %00010000)

NCD Parml

Возвращает номер старшего бита Parml, установленного в 1

Parml REV Parm2

Инвертирует биты в Parml начиная с нулевого до Parm2 (%10101100 REV 4 возвращает %10100011)

SQR Parml

Возвращает целый квадратный корень из Parml

SIN Parml

Возвращает синус от Parml. Выданная величина будет основана на окружности радиусом 127° и 256° (а не на обычных 360°)



0 ... 135136137138139140141 ... 159