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

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


Скачать 3.49 Mb.
НазваниеСистема команд pic16F84A 26 Что такое программа иправила ее составленияПример создания программы автоколебательного мультивибратораДирективы.
АнкорСамоучитель по программированию PIC контроллеров для начинающих (Е.А. Корабельников,2008).pdf
Дата30.01.2017
Размер3.49 Mb.
Формат файлаpdf
Имя файлаСамоучитель по программированию PIC контроллеров для начинающих .pdf
ТипПрограмма
#1195
КатегорияПромышленность. Энергетика
страница54 из 57
1   ...   49   50   51   52   53   54   55   56   57
, в старший разряд которого записывается количество переполнений, произошедших за интервал времени счета, в средний разряд записывается число,
зафиксировавшееся в
TMR0
на момент окончания счета, в младший разряд записывается число,

зафиксировавшееся в
байте предделителя на момент окончания счета
.
Для детального разбирательства с
механизмом высокоскоростного счета, используется файл (находится в
папке
"
Тексты программ. Это выглядит так
;********************************************************************************
;
Tmr0.asm
ИЛЛЮСТРАЦИЯ
ПРИНЦИПА
ВЫСОКОСКОРОСТНОГО
СЧЕТА
ИМПУЛЬСОВ
;
ОТ
ВНЕШНЕГО
ИСТОЧНИКА
ИМПУЛЬСОВ
С
ИСПОЛЬЗОВАНИЕМ
ТАЙМЕРА
TMR0
;********************************************************************************
; "Заготовка" "программы, в которой осуществляется высокоскоростной счет импульсов от внешнего источника импульсов с
использованием таймера TMR0.

; Используется PIC16F84A.
;
Корабельников
Е
.
А
.
г
.
Липецк
http://ikarab.narod.ru E-mail: karabea@lipetsk.ru
;********************************************************************************
; "
ШАПКА
ПРОГРАММЫ
"
;********************************************************************************
;.............................................................
;.............................................................
;================================================================================
; Определение положения регистров специального назначения.
;================================================================================
Tmr0 equ 01h
; Регистр TMR0.
OptionR equ 01h
; Регистр Option - банк 1.
Status equ 03h
; Регистр Status.
PortA equ 05h
; Регистр PortA.
TrisA equ 05h
; Регистр TrisA - банк 1.
IntCon equ 0Bh
; Регистр IntCon.
;.............................................................
;================================================================================
; Определение названия и
положения регистров общего назначения.

;================================================================================
TimerL equ 1Bh
; Регистр младшего разряда 3-
байтного
; двоичного числа.
TimerM equ 1Ch
; Регистр среднего разряда 3-
байтного
; двоичного числа.
TimerH equ 1Dh
; Регистр старшего разряда 3-
байтного
; двоичного числа.
;.............................................................
;================================================================================
; Определение места размещения результатов операций.
;================================================================================
W equ 0
; Результат направить в
аккумулятор
.
F equ 1
; Результат направить в
регистр
.
;================================================================================

269
; Присваивание битам названий.
;================================================================================
Z equ 2
; Флаг нулевого результата.
RP0 equ 5
; Выбор банка.
;.............................................................
;================================================================================
org 0
; Начать выполнение программы goto START
; с подпрограммы START.
;********************************************************************************
;********************************************************************************
;
РАБОЧАЯ
ЧАСТЬ
"ПРОГРАММЫ"
;********************************************************************************
START .....................................
; .....................................
;.... .....................................
; .....................................
;.... .....................................
; .....................................
;================================================================================
; Подготовительные операции.
;================================================================================
clrf IntCon
; Запрет всех прерываний.
clrf Tmr0
; Сброс в 0 содержимого регистра TMR0.
clrf TimerH
; Сброс в 0 содержимого регистра TimerH.
bsf Status,RP0
; Переход в й банк.
movlw b'00100111'
;
Предделитель с
коэффициентом деления 256

movwf OptionR
; включен перед TMR0, выбор внешнего тактового сигнала с
вывода
RA4/TOCKI,
; приращение TMR0 - по переднему фронту.
;================================================================================
; Начало счета (обозначено меткой On).
;================================================================================
movlw b'00011000'
; Запись в
регистр
W константы b'00011000'
; (выводы RA3 и RA4/TOCKI работают "на вход,
; остальные - "на выход.
On movwf TrisA
; Копирование содержимого регистра W в регистр ; TrisA (начало счета.
bcf Status,RP0
; Переход в й банк.
;********************************************************************************
;
НАЧАЛО
ГРУППЫ
ПП
ДИНАМИЧЕСКОЙ
ИНДИКАЦИИ
(вход в
малое и
большое кольцо динамической индикации.

;********************************************************************************
; .....................................
;.... .....................................
; .....................................
;.... .....................................
; .....................................
;================================================================================
; Первая проверка на переполнение TMR0
;================================================================================
btfss IntCon,2
; TMR0 переполнен или нет
goto DoNothing
; Нет, не переполнен --> безусловный переход ;
в
ПП
DoNothing.
incf TimerH,F
; Да, переполнен --> инкремент содержимого ; регистра TimerH с сохранением результата ; инкремента в
нем же.

bcf IntCon,2
; Сброс флага переполнения TMR0.
goto O_K
; Безусловный переход в
ПП
O_K.
DoNothing nop
; Выравнивающий NOP.
nop
; Выравнивающий NOP.
nop
; Выравнивающий NOP.
O_K .....................................
; .....................................
;.... .....................................

270
; .....................................
;********************************************************************************
;
НИЖНЯЯ
ГРАНИЦА
МАЛОГО
КОЛЬЦА
ДИНАМИЧЕСКОЙ
ИНДИКАЦИИ
.
;********************************************************************************
; .....................................
;********************************************************************************
;
НИЖНЯЯ
ГРАНИЦА
БОЛЬШОГО
КОЛЬЦА
ДИНАМИЧЕСКОЙ
ИНДИКАЦИИ
.
;********************************************************************************
; Группа команд точной "доводки" величины интервала времени основного счета до расчетного значения.
;================================================================================
; .....................................
; .....................................
;================================================================================
; Конец счета (обозначен меткой Off).
;================================================================================
clrw
; Сброс в 0 содержимого регистра W.
movwf PortA
; Копирование нуля из регистра W
; в регистр PortA.
bsf Status,RP0
; Переход в й банк.
movlw b'00010000'
; Запись в
регистр
W константы b'00010000'
; (вывод RA4/TOCKI работает "на вход,
; остальные - "на выход.
Off movwf TrisA
; Копирование содержимого регистра W в регистр ; TrisA (конец счета.
bcf Status,RP0
; Переход в й банк.
;================================================================================
; Вторая проверка на переполнение TMR0
;================================================================================
btfss IntCon,2
; TMR0 переполнен или нет
goto Analyse
; Нет, не переполнен --> безусловный переход ;
в
ПП
Analyse.
incf TimerH,F
; Да, переполнен --> инкремент содержимого ; регистра TimerH, с сохранением результата ; инкремента в
нем же.

bcf IntCon,2
; Сброс флага переполнения TMR0.
;================================================================================
; Копирование содержимого регистра TMR0 в регистр TimerM.
;================================================================================
Analyse movf Tmr0,W
; Копирование содержимого регистра TMR0
; в регистр W.
movwf TimerM
; Копирование содержимого регистра W
; в регистр TimerM.
;================================================================================
; Сброс в 0 содержимого регистра TimerL.
;================================================================================
clrf TimerL
; Сброс в 0 содержимого регистра TimerL.
;================================================================================
; Подпрограмма досчета
.
;================================================================================
CountIt incf TimerL,F
; Инкремент содержимого регистра TimerL с ; сохранением результата инкремента в
нем же.

;--------------------------------------------------------------------------------
; Кратковременная разблокировка счетного входа TMR0.
;--------------------------------------------------------------------------------
bsf PortA,3
; Формирование на выводе RA3 единицы.
nop
; Временной "зазор.
bcf PortA,3
; Формирование на выводе RA3 нуля.
nop
; Временной "зазор.
;--------------------------------------------------------------------------------
;
Досчет
.
;--------------------------------------------------------------------------------
movf Tmr0,W
; Копирование содержимого регистра TMR0
; в регистр W.
bcf Status,Z
; Сброс флага нулевого результата Z.
subwf TimerM,W
; Вычесть из содержимого регистра TimerM

271
; содержимое регистра W.
btfsc Status,Z
; Результат операции вычитания равен ; или нет нулю
goto CountIt
; Да, равен ---> переход в
ПП
CountIt.
comf TimerL,F
; Нет, неравен инвертировать все биты регистра TimerL, с сохранением результата ; инвертирования в
нем же.

incf TimerL,F
; Инкремент содержимого регистра TimerL, c
; сохранением результата инкремента в
нем же.

;================================================================================
; На данный момент, в 3-
байтном регистре TimerH/TimerM/TimerL сформирован результат подсчета в
виде
3-
байтного двоичного числа, которое, далее, можно обрабатывать в
группе подпрограмм преобразования двоичных чисел в
двоично
-
; десятичные или в
группах подпрограмм другого предназначения (в зависимости от специфики разрабатываемого устройства.

; .....................................
; .....................................
;.... .....................................
; .....................................
;.... .....................................
; .....................................
;********************************************************************************
end
; Конец программы. Разбираем текст программы
Tmr0.asm
Группа команд счета начинается с
команд подготовительных операций, сразу же после которых следуют команды начала счета
Группа команд подготовительных операций состоит из команды запрета прерываний IntCon

), команды сброса в 0 содержимого регистра (
clrf Tmr0
), команды сброса в 0 содержимого регистра (
clrf TimerH
) и
двух команд записи константы в
регистр специального назначения
OPTION
Регистр
OPTION
"лежит " в 1- м
банке
, следовательно, перед работой с
ним
, нужно перейти в- й
банк
(
bsf Status,RP0
). После исполнения команды Option

,
- вывод
RA4/TOCKI
подключится к
входу предделителя
, а
выход предделителя подключится к
входу
TMR0
,
- коэффициент деления предделителя будет равен 256,
- приращение содержимого
TMR0
будет происходить по перепаду от 0 к 1. Есть 2 способа обозначения перепадов импульса.

-
смена
0
на
1
передний фронт импульса,
смена
1
на
0
задний фронт импульса.
-
смена
0
на
1
фронт импульса,
смена
1
на
0
спад импульса. После исполнения команд подготовительных операций, начинается формирование интервала времени счета
Для этого необходимо, чтобы вывод (счетный вход
ПИКа
/ вход предделителя
) и
вывод блокировки
RA3
работали "на вход ".
В
этом случае, сопротивление между выводом
RA3
и корпусом велико (
разблокировка счета. Регистр "лежит " также в 1- м
банке
, поэтому банк менять ненужной банк был установлен ранее. Константа, через регистр, "переправляется " в
регистр
TrisA
, после чего, выводы
RA3
и
RA4/TOCKI
настраиваются на работу "на вход ", а
все остальные выводы порта
А
, на работу "на выход ". Так как далее будут производиться операции с
регистрами
0- го банка, в
конце группы команд начала счета, необходимо "вернуться " в 0- й
банк
(
bcf Status,RP0
). Убедитесь, что в
тексте программы
Tmr0.asm,
эта последовательность действий соблюдается
Счет разрешается после того, как константа будет записана в
регистр
TrisA
, то есть, после исполнения команды TrisA
В
тексте программы, для удобства, я
пометил эту команду меткой (начало основного счета. Если эта метка ненужна, то ее можно убрать, так как в
тексте программы, обращений к
ней нет

272 Тоже самое относится и
к метке, которой помечен конца основного счета
Примечание
:
установка метки (меток, к
которой нет обращения, не является ошибкой, и
работа программы от этого не нарушится
Ошибкой является обращение к
метке
, которой нет (которая не установлена. Итак, перед входом рабочей точки программы в
ПП
динамической индикации, произведены подготовительные операции и
разрешен счет
В
соответствии со сказанным выше, далее, должна быть произведена первая проверка на переполнение
TMR0
Она должна "врезана " в
малое кольцо динамической индикации
В
этом случае, обеспечивается периодичность проверок, гарантирующая безошибочный подсчет количества переполнений (см сказанное ранее. Первая проверка на переполнение
TMR0
начинается с
опроса состояния флага прерывания по переполнению (
btfss IntCon,2
), поднятие которого не зависит оттого, разрешены прерывания или нет, а
зависит только от факта переполнения
TMR0
Ранее
, в
подготовительных операциях, все биты регистра
IntCon
были сброшены в 0, следовательно, на момент разрешения счета, флаг прерывания по переполнению) будет опущен
Напоминаю
, что флаг
T0IF
это флаг 2- й
группы
, и
если он поднялся, то опускать его нужно программно
Команда ветвления IntCon,2
"разветвляет " программу на 2 сценария, которые, ниже по тексту программы, снова сходятся на первой команде
ПП
с условным названием
О
_
К
(или на команде, помеченной меткой
О
_
К
, если это считать меткой.
В
случае наличия подобного рода "разветвления " на 2 сценария, с
последующим их "схождением " (а это и
имеет место быть, необходимо принять меры по "затяжке " времени исполнения сценария с
меньшим временем исполнения (выравнивание. То есть, интервал времени исполнения этого сценария нужно сделать в
точности равным интервалу времени исполнения другого сценария (о такой необходимости говорилось ранее. Оба этих сценария исполняются внутри такого "
важняка ", как малое кольцо динамической индикации, и
поэтому они сильно влияют на процесс формирования калиброванного интервала времени счета
Следовательно
, выравнивание необходимо
Что
Вы и
видите в
тексте программы
(
см выравнивающие
1   ...   49   50   51   52   53   54   55   56   57


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