Главная страница

Самоучитель по программированию PIC контроллеров для начинающих (Е.А. Корабельников,2008). Самоучитель по программированию PIC контроллеров для начинающих. Система команд pic16F84A 26 Что такое программа иправила ее составленияПример создания программы автоколебательного мультивибратораДирективы.


Скачать 3.49 Mb.
НазваниеСистема команд pic16F84A 26 Что такое программа иправила ее составленияПример создания программы автоколебательного мультивибратораДирективы.
АнкорСамоучитель по программированию PIC контроллеров для начинающих (Е.А. Корабельников,2008).pdf
Дата30.01.2017
Размер3.49 Mb.
Формат файлаpdf
Имя файлаСамоучитель по программированию PIC контроллеров для начинающих .pdf
ТипПрограмма
#1195
КатегорияПромышленность. Энергетика
страница41 из 57
1   ...   37   38   39   40   41   42   43   44   ...   57
RLF
или
RRF
А
можно и "зайти с
другого конца ", как бы введя бит
С
в состав регистра, к
которому обращается команда
RLF
или
RRF,
с присвоением ему "статуса " бита 8.
В
этом случае, речь идет о
составном
(комплексном) 9- битном регистре, с
раздельным отображением байта (биты с 0 … 7) и
бита с 8, замкнутом в
кольцо обратной связи
Числовое значение байта можно проконтролировать, просмотрев содержимое регистра, к
которому обращается команда
RLF
или
RRF
, а
состояние бита с 8 можно проконтролировать, просмотрев содержимое флага
С
В
большинстве случаев, перед началом процедуры циклического сдвига, бит
С
нужно сбросить в
ноль
Если до начала этой процедуры, не применялись команды, воздействующие на флаг
С
(
ADDWF, ADDLW, SUBWF, SUBLW
), то о
сбросе флага
С
можно не заботиться он будет сброшен по умолчанию
Если эти команды применялись, тона момент начала процедуры циклического сдвига, нужно проконтролировать состояние бита флага
С
, и
если в
нем установлена 1, то нужно сбросить бит
С
в
0 командой Status,0
(
C
). Если лень "забивать себе голову " выяснением состояния бита
С
на момент начала операции циклического сдвига, то непосредственно перед проведением этой операции, нужно просто сбросить бит
С
в
0, и
дело с
концом
Для того чтобы понять, как происходит процедура циклического сдвига, достаточно провести аналогию с
работой реверсивного, сдвигового регистра с
предустановкой типа
ИР
Хотя микросхем 9- разрядных регистров
ИР
и нет, но, предположим, что такой регистр существует
Сейчас я
Вам "обрисую " аналог процедуры циклического сдвига "Закольцовываем " регистр, соединяя выход 9- го разряда со счетным входом 1- го разряда- битное исполнительное устройство, назовем его
А
, подключаем к
выходам с 1- го пой, а- битное исполнительное устройство, назовем его
В
, подключаем к 9- му выходу регистра
Сначала
, нами параллельных входах предустановки
(начало нумерации - от младшего разряда) выставляются уровни, соответствующие числу, которое нужно преобразовать в
результате сдвига (сдвигов, а
на
9- м
входе предустановки выставляем 0. Записываем все это в
регистр
Это соответствует записи, в
регистр
, числа, которое нужно преобразовать в
результате исполнения процедуры циклического сдвига и
предварительному сбросу бита флага
С
Далее
, на вход управления реверсом, подается уровень, соответствующий, например, сдвигу влево
Это соответствует применению команды
RLF
На тактовый вход регистра подается один тактовый импульс
Это соответствует исполнению команды
RLF
Происходит сдвиг, предварительно записанной информации, в
сторону старших разрядов
(
влево
). Из- за наличия "
закольцовки ", бит с 8 "занимает место " бита с 0, а
бит с 7 "занимает место " бита с 8 (остальные сдвигаются соответственно. На управляющие входы исполнительных устройств
А
и
В
подаются уровни, сдвинутые на такт влево
Таких тактовых импульсов (команд) можно сформировать (исполнить) несколько, и

209 соответственно, содержимое 9- разрядного регистра сдвинется влево на такое же количество разрядов
На
10- м
сдвиге
, в
регистре установится исходное число
А
теперь поближе к
ПИКам
В
одном регистре общего назначения, можно отобразить только 8 битов этого "виртуального " условно, 9- битного числа (начиная с
младшего
), ай (старший) бит находится как бы "за кулисами ".
А
теперь давайте проанализируем "механику этого действа " и
какую практическую выгоду можно из этого извлечь "Прогоним " по полному циклу сдвигов влево, например, число .09 (
00001001
).
0000
1
00
1
C
=0
9 Начальная установках х
00
1
00
1
00
C
=0 18
х
2=
36
х
4
0
1
00
1
000
C
=0 36
х
2=
72
х
8
1
00
1
0000
C
=0 72
х
2=
144
х
16
00
1
00000
C
=
1
144
х
2=288-256=
32
Выход на й "виток" цикла счета.
0
1
00000
1
C
=0 32
х
2+1{
перенос
, избита Св младший разряд байтах х. Выход на й "виток" цикла счета.
................................. С 4
х
2+1{
перенос
, избита Св младший разряд байта
}=
9
.................................
Первое
, что бросается в
глаза
, это движение единиц "Привязавшись " к
ним
(или к
нулям
), можно реализовать, например, устройства типа бегущих огней, бегущей строки или что- то подобное
А
нельзя ли, при помощи циклических сдвигов, реализовать что- нибудь "посолиднее "? Очень даже можно
После анализа результатов циклического сдвига влево числа .09 (или других чисел, можно сделать следующие выводы Циклический сдвиг влево,

на
1
такт
(
позицию
)
, связан с
операцией умножения "предшествующего" лежащего " в
регистре до этого сдвига
)
числа на
2.
-
Если результат умножения на "выходит на второй виток" полного цикла чисел
(
более
.255)
, то флаг
С
поднимается
(
перенос
)
. Если в
бите
С
находится
1
, то результат следующего циклического сдвига, с учетом умножения на, увеличивается на.
В
случае использования однобайтного регистра, "закольцованного ", через бит
С
,
на самого себя (рассмотренный выше случай, последовательно исполняя несколько команд, можно умножить исходное число на, 4, 8 …

, но только при условии отсутствия переносов
(
см приведенный выше пример. Например, после умножения на 2 (один сдвиг) чисел до .127 включительно, в
регистре общего назначения, к
которому обращается команда, будет "лежать " число, точно отображающее результат выполнения арифметической операции умножения на 2, а
бит флага
С
всегда будет нулевым (старший бит байта всегда будет равен нулю. После умножения на 2 чисел от .128 до .255 включительно, в
регистре общего назначения, к
которому обращается команда, будет "лежать " число, отображающее результат выполнения арифметической операции умножения на 2, но только с
учетом "выхода на второй виток " цикла счета, а
бит флага
С
установится в 1 (перенос.
В
этом случае, для получения истинного результата умножения на 2, необходимо к
числу
, лежащему " (после исполнения команды) в
регистре общего назначения, к
которому обращается команда, прибавить число .256. Ноне будет же программист, походу исполнения программы, "вручную " вносить поправки в
результаты вычислений
Нужно сделать так, чтобы он этим не занимался
Вопрос
:
"Как "?
Ответ
:
нужно нарастить разрядность, задействовав один или несколько дополнительных, предварительно (до начала процедуры сдвигов) "обнуленных " регистров общего назначения
В
этом случае, исходное, однобайтное число можно умножить на множитель кратный двум

210
(1 сдвиг – х, 2 сдвигах сдвигах и
т д, причем, эта кратность может быть достаточно большой (зависит от количества задействованных регистров. После окончания сдвигов, результат кратного умножения насчитывается из N- байтного регистра
Такой способ умножения, хотя и
прост
, но если использовать только его, то его возможности сильно ограничены, да и
с множителем равным двум в
степени
N (где N – количество сдвигов) "особо- то и
не развернешься ". Поэтому, нужен комплексный подход
А
как
, например, умножить на 7 или на 10 и
т д
В
этом случае, используется несколько последовательных умножений на 2 (сдвигов влево, с
учетом остатка
Для этого нужно составить разложение числа (множителя. Арифметика этого разложения простая
Например
, приемлемые варианты для 7: х или 7=2
х
2
х
2-1.
В
первом случае, посредством двух сдвигов влево, множимое умножается на 4. Далее, к
этому результату, 3 раза, последовательно прибавляется множимое
Во втором случае, посредством трех сдвигов влево, множимое умножается на 8. Далее, из этого результата, один раз вычитается множимое
Какой вариант выбрать Лучше выбрать второй вариант, так как в
этом случае, группа команд умножения будет содержать меньшее количество команд, чем в
случае использования первого варианта
При умножении на 10 могут быть такие варианты 2
х
2
х
2+1+1, 2
х
2
х
2
х
2-1-1-1-1-1-1,
(2
х
2+1)+(2
х
2+1), хит д
Самым оптимальным является 1- й
вариант
, так как для его реализации, требуется наименьшее количество команд
Вот его- тов качестве примера, давайте и
реализуем
(
простейшая
ПП
умножения
). Файл программы умножения на 10,
с
формализованными комментариями, называется (находится в
папке
"
Тексты программ. Она выглядит так
;********************************************************************************
;
ПРИМЕР
ИСПОЛЬЗОВАНИЯ
ФЛАГА
"C"
В
ОПЕРАЦИИ
УМНОЖЕНИЯ
НА
10
;********************************************************************************
; Подпрограмма умножения 8-
битных чисел на 10
;********************************************************************************
; Множимое числа от .00 до .255, которые закладываются в
регистр
RegL на момент начала подпрограммы перемножения на 10.
; Множитель 10 (2*2*2+1+1).
; Произведение результат трех умножений на 2 и двух суммирований
. На момент
окончания
ПП
умножения на 10, записывается в
двухбайтный регистр RegL/RegH

; (
двухбайтное двоичное число.

;********************************************************************************
; "
ШАПКА
ПРОГРАММЫ
"
;********************************************************************************
;.............................................................
;.............................................................
;================================================================================
; Определение положения регистров специального назначения.
;================================================================================
Status equ 03h
; Регистр Status.
;.............................................................
;.............................................................
;================================================================================
; Определение названия и
положения регистров общего назначения.

;================================================================================
RegL equ 0Ch
; Регистр множимого.
; Он же - регистр младшего байта.
RegH equ 0Eh
; Регистр старшего байта.
;.............................................................
;.............................................................

211
;================================================================================
; Определение места размещения результатов операций.
;================================================================================
W equ 0
; Результат направить в
аккумулятор
.
F equ 1
; Результат направить в
регистр
.
;.............................................................
;================================================================================
; Присваивание битам названий.
;================================================================================
C equ 0
; Бит флага переноса
-
заёма
.
;.............................................................
;================================================================================
org 0
; Начать выполнение программы goto START
; с подпрограммы START.
;********************************************************************************
;********************************************************************************
;
РАБОЧАЯ
ЧАСТЬ
ПРОГРАММЫ
;********************************************************************************
START ......................................
......................................
......................................
...................................... На момент начала
ПП
умножения
, в регистр RegL должно быть записано однобайтное двоичное число (множимое, которое нужно умножить на 10 (множитель. Значения произведений отражаются в
двухбайтном регистре RegL/RegH.

;================================================================================
; Подпрограмма умножения на 10
однобайтных двоичных чисел (.00 ... .255)

;================================================================================
; Подготовительные операции.
;--------------------------------------------------------------------------------
bcf Status,C
; Установка вбита регистра Status.
movf RegL,W
; Копирование содержимого регистра RegL
; в регистр W.
clrf RegH
; Сброс в 0 содержимого регистра RegH.
;--------------------------------------------------------------------------------
; Три последовательных умножения на 2 (умножение на 8).
;--------------------------------------------------------------------------------
rlf RegL,F
; Циклический сдвиг влево содержимого ; регистра RegL с сохранением результата ; в нем же.
btfsc Status,C
; Опрос состояния бита флага
С
.
rlf RegH,F
;
Если
С
=1, то циклический сдвиг влево ; содержимого регистра RegH c переносом в
его
; младший разряд 1 избита флага
С
, с ; сохранением результата в
нем же (в RegH).

;--------------------------------------------------------------------------------
rlf RegL,F
;
Если
С
=0 (а также после исполнения ; предшествующей команды, то циклический ; сдвиг влево содержимого регистра RegL с ; сохранением результата в
нем же.

btfsc Status,C
; Опрос состояния бита флага
С
.
rlf RegH,F
;
Если
С
=1, то циклический сдвиг влево ; содержимого регистра RegH с переносом в
его
; младший разряд 1 избита флага
С
, с ; сохранением результата в
нем же (в RegH).

;--------------------------------------------------------------------------------
rlf RegL,F
;
Если
С
=0 (а также после исполнения ; предшествующей команды, то циклический ; сдвиг влево содержимого регистра RegL, с ; сохранением результата в
нем же.

btfsc Status,C
; Опрос состояния бита флага
С
.
rlf RegH,F
;
Если
С
=1, то циклический сдвиг влево ; содержимого регистра RegH с переносом в
его
; младший разряд 1 избита флага
С
, с

212
; сохранением результата в
нем же (в RegH).

;
Если
С
=0 (а также после исполнения ; предшествующей команды, то программа ; исполняется далее (переход к
суммированиям
)
;--------------------------------------------------------------------------------
; 2 последовательных суммирования сохраненного в
регистре
W множимого, к результату умножения множимого на 8.
;--------------------------------------------------------------------------------
addwf RegL,F
; Сложить содержимое регистров RegL и W с ; сохранением результата в
регистре
RegL.
btfsc Status,C
; Опрос состояния бита флага
С
.
incf RegH,F
; Если бит
С
=1, то инкремент содержимого ; регистра RegH с сохранением результата ; в нем же.
addwf RegL,F
; Если бит
С
=0 (а также после исполнения ; предшествующей команды, то сложить ; содержимое регистров RegL и W, с ; сохранением результата в
регистре
RegL.
btfsc Status,C
; Опрос состояния бита флага
С
.
incf RegH,F
; Если бит
С
=1, то инкремент содержимого ; регистра RegH, с сохранением результата ; в нем же.
;--------------------------------------------------------------------------------
........................; Если бит
С
=0 (а также после исполнения предшествующей команды, то программа ; исполняется далее.
;********************************************************************************
end
; Конец программы. Примечание в конце
ПП
умножения
, вместо сценария "программа исполняется далее, можно использовать сценарий условного или безусловного перехода в
подпрограмму
, находящуюся в
любом
"месте" текста рабочей части программы.
В
этом случае, после команды последнего инкремента, должна быть исполнена команда или goto соответственно. Файл программы умножения нас неформализованными комментариями, называется (находится в
папке
1   ...   37   38   39   40   41   42   43   44   ...   57


написать администратору сайта