Добавил:
Upload Опубликованный материал нарушает ваши авторские права? Сообщите нам.
Вуз: Предмет: Файл:
Программирование на ассемблере для PIC.doc
Скачиваний:
0
Добавлен:
01.05.2025
Размер:
153.09 Кб
Скачать

Переход по событиям в счётчиках

Переход по событиям в счётчиках – ни что иное, как зачатки интеллекта нашего МК. Суть работы заключается в выполнении счёта до определенного момента, т.е. до тех пор, пока регистр, увеличиваемый или уменьшаемый командой счётчиком, не станет равен нулю, а это произойдет либо при "переносе", либо при "заёме".

УВЕЛИЧЕНИЕ НА ЕДИНИЦУ в общем виде выглядит как INCFSZ F,D

если после увеличения результат равен 0,

то пропуск следующей команды

УМЕНЬШЕНИЕ НА ЕДИНИЦУ в общем виде выглядит как DECFSZ F,D

если после уменьшения результат равен 0, то пропуск следующей команды

Разберемся c этим фрагментом кода. Сначала мы записали через аккумулятор W в регистр CLOP число 255, затем его увеличили на единицу (инкрементировали), в результате у нас произошло переполнение (или перенос), т.е. результат операции равен нулю – 0 и как следствие, пропускается команда GOTO Metka1. Поскольку мы результат операции увеличения на единицу сохранили в аккумуляторе W, то в регистре CLOP осталось прежнее число. Уменьшаем регистр CLOP на единицу; результат операции 254, и этот результат отличается от нуля, следовательно, выполняется следующая команда GOTO Metka2.

Переход по результатам бит-проверки

По сравнению с предыдущими командами это более интеллектуальные команды. Их актуальность во много связана с проверкой состояния ножек МК, а если быть точнее, с проверкой битов в регистрах.

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

Проверить бит на равенство нулю BTFSC F,B

если бит B=1, то выполняется следующая инструкция

если бит B=0, то следующая инструкция пропускается

Проверить бит на равенство единице BTFSS F,B

если бит B=0, то выполняется следующая инструкция

если бит B=1, то следующая инструкция пропускается

Разберем фрагмент этого кода. Помните, биты в регистре нумеруются справа налево и от нуля до семи, следовательно, первый бит в примере у нас равен нулю. Сделав первую проверку по команде BTFSC PORTB,1 обнаруживается совпадение и пропускается следующая команда – GOTO Metka1. Во второй проверке по команде BTFSS PORTB,1 обнаруживается несовпадение и выполняется следующая команда – GOTO Metka2.

Важный вывод. Комбинация команд "переходов по результатам проверки" и команд простых переходов позволяют разветвлять ход программы по нескольким сценариям, тем сам выполнять те или иные задачи.

Флаги как индикаторы событий

Под флагами понимаются значения некоторых битов в регистрах специального назначения. Такие биты в регистрах специального назначения после выполнения определенных команд могут устанавливаться в единицу (иначе говорят – флаг установлен или поднят), а могут опускаться в ноль (иначе – флаг опущен или сброшен).

В регистре STATUS с адресом H03 мы рассмотрим два флага:

– флаг Z (второй бит) – флаг нулевого результата

если Z=1, то был нулевой результат выполнения команды

если Z=0, то ненулевой результат выполнения команды

– флаг C (нулевой бит) – флаг переноса-займа

если C=1, то было переполнение регистра (происходил перенос)

если C=0, то не было переполнения регистра (либо был заём)

Как работать с флагами?

Если в ходе программы предполагается переполнение регистра (или ожидается заём) и нам необходимо отслеживать эти события, то выполняем следующую последовательность:

STATUS EQU H0003 ; определяем регистр

C EQU H0000 ; определяем номер бита для флага C

Z EQU H0002 ; определяем номер бита для флага Z

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

; ПРОВЕРКА НА ФАКТ ПЕРЕНОСА

...

BCF STATUS,C ; опускаем флаг C в ноль

;... операции увеличения каких либо регистров

BTFSS STATUS,C ; делаем бит-проверку C-флага

; если бит C=0, то выполняется следующая инструкция

; если бит C=1, то следующая инструкция пропускается

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

Установка флага из нуля в единицу подтверждает факт переноса.

; ПРОВЕРКА НА ФАКТ ЗАЙМА

...

BSF STATUS,C ; поднимаем флаг C в единицу

;... операции уменьшения каких либо регистров

BTFSC STATUS,C ; делаем бит-проверку C-флага

; если бит C=1, то выполняется следующая инструкция

; если бит C=0, то следующая инструкция пропускается

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

Установка флага из единицы в ноль подтверждает факт займа.

Ранее было обещано рассмотрение команды "MOVF KLOP,F" , в которой результат копирования помещается назад в регистр KLOP.

Если регистр KLOP равен нулю, то после команды "MOVF KLOP,F" флаг Z из нуля поднимется в единицу; иначе из единицы опустится в ноль.

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

; ПРОВЕРКА НА РАВЕНСТВО НУЛЮ

CLRF CLOP ; обнулим регистр KLOP

BCF STATUS,Z ; опустим флаг Z в ноль

MOVF KLOP,F ; копировать из KLOP в KLOP

BTFSC STATUS,Z ; делаем бит-проверку Z-флага

; если Z=1, то выполняется следующая инструкция, иначе – пропускается

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

Умышленная очистка регистра KLOP командой CLRF была сделана ради примера. В результате операции "MOVF KLOP,F" флаг Z из нуля поднимется в единицу, после которого мы делаем проверку и идём по одному из вариантов.

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