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

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


Скачать 3.49 Mb.
НазваниеСистема команд pic16F84A 26 Что такое программа иправила ее составленияПример создания программы автоколебательного мультивибратораДирективы.
АнкорСамоучитель по программированию PIC контроллеров для начинающих (Е.А. Корабельников,2008).pdf
Дата30.01.2017
Размер3.49 Mb.
Формат файлаpdf
Имя файлаСамоучитель по программированию PIC контроллеров для начинающих .pdf
ТипПрограмма
#1195
КатегорияПромышленность. Энергетика
страница30 из 57
1   ...   26   27   28   29   30   31   32   33   ...   57
; Объем программы 40 слов в
памяти программ.

; Используется микроконтроллер PIC16F84A. Частота кварца кГц.
;********************************************************************************
LIST p=16F84a
; Используется PIC16F84A.
__CONFIG 03FF5H
; WDT включен, бит защиты не установлен.
;================================================================================
; Определение положения регистров специального назначения.
;================================================================================
OptionR equ 01h
; Option - банк
Status equ 03h
; Регистр Status
PortB equ 06h
; Порт B
TrisB equ 06h
; Tris B - Банк
IntCon equ 0Bh
; Регистр IntCon
;================================================================================
; Определение названия и
положения регистров общего назначения.

;================================================================================
Trigg equ 0Ch
; Переключатель направления ретрансляции.
SecH equ 1Eh
; Старший байт счетчика времени сканирования.
SecL equ 1Fh
; Младший байт счетчика времени сканирования.
SecH_1 equ 1Ch
; Старший байт счетчика защитного интервала ; времени.
SecL_1 equ 1Dh
; Младший байт счетчика защитного интервала ; времени.
;================================================================================
; Определение места размещения результатов операций.
;================================================================================
F equ 1
; Результат направить в
регистр
.
;================================================================================
; Определение положения бита выбора банка.
;================================================================================
RP0 equ 5
; Бит выбора банка.
;================================================================================
; Точка входа в
программу
.
;================================================================================
org 0
; Начать выполнение программы с
нулевого
goto START
; адреса PC
;********************************************************************************

157
;********************************************************************************
;
РАБОЧАЯ
ЧАСТЬ
ПРОГРАММЫ
;********************************************************************************
; Подготовительные операции.
;--------------------------------------------------------------------------------
START clrf IntCon
; Запретить все прерывания.
clrwdt
; Сбросить сторожевой таймер WDT.
bsf Status,RP0
; Установить банк 1.
movlw .1
; RB0 работает на вход,
movwf TrisB
; остальные - на выход.
movlw .0
; Включить подтягивающие резисторы порта
В
.
movwf OptionR
; Остальное - несущественно Установить банк 0.
;--------------------------------------------------------------------------------
; Выбор направления ретрансляции.
;--------------------------------------------------------------------------------
TRIGGER btfsc Trigg,0
; Проверка значения нулевого бита ; регистра Trigg.
goto Metka148
; Если это значение =1, то переход ; наметку Если это значение =0, то программа ; исполняется далее.
movlw .251
; Закладка константы .251 (1111 1011)
; в регистр W.
movwf PortB
; Копирование .251 из регистра W
; в регистр PortB (выбор прямого направления ; ретрансляции
ПРМ
-X,
ПРД
-Y).
goto Metka_1
; Безусловный переход наметку Закладка константы .255 (1111 1111)
; в регистр W.
movwf PortB
; Копирование .255 из регистра W
; в регистр PortB (выбор обратного направления ; ретрансляции
ПРМ
-Y,
ПРД
-X).
;--------------------------------------------------------------------------------
; Формирование защитного интервала времени (ожидание окончания переходных процессов, возникающих при смене направлений ретрансляции) равного,
; примерно, 60 мс.
;--------------------------------------------------------------------------------
Metka_1 movlw .197
; Закладка в
регистр
W константы .197
movwf SecH_1
; Копирование константы .197 из регистра W
; в регистр SecH_1.
movlw .121
; Закладка в
регистр
W константы .121
movwf SecL_1
; Копирование константы .121 из регистра W
; в регистр SecL_1.
PAUSE_D clrwdt
; Сброс WDT.
decfsz SecL_1,F
; Декремент содержимого младшего разряда ; счетчика SecL_1.
goto PAUSE_D
; Если результат декремента не, то переход ;
в
ПП
PAUSE_D.
incfsz SecH_1,F
; Если результат декремента =0, то инкремент ; старшего разряда счетчика SecH_1.
goto PAUSE_D
; Если результат инкремента не, то переход ;
в
ПП
PAUSE_D.
; Если результат инкремента =0, то программа ; исполняется далее.
;================================================================================
; Формирование интервала времени сканирования.
;================================================================================
movlw .245
; Закладка константы .245 в регистр W.
movwf SecH
; Копирование .245 из регистра W
; в регистр SecH.
movlw .255
; Закладка константы .255 в регистр W.
movwf SecL
; Копирование .255 из регистра W
; в регистр SecL.

158
;--------------------------------------------------------------------------------
PAUSE clrwdt
; Сброс WDT.
btfss PortB,0
; Несущая есть
goto PAUSE
; Да.
btfss PortB,0
; Нет. Программа выполняется далее.
; Несущая есть ?
goto PAUSE
; Да.
decfsz SecL,F
; Нет. Декремент содержимого младшего разряда ; счетчика SecL.
goto PAUSE
; Если результат декремента не, то переход ;
в
ПП
PAUSE.
incfsz SecH,F
; Если результат декремента =0, то инкремент ; старшего разряда счетчика SecH.
goto PAUSE
; Если результат инкремента не, то переход ;
в
ПП
PAUSE.
; Если результат инкремента =0, то программа ; исполняется далее.
;--------------------------------------------------------------------------------
; Изменение направления ретрансляции.
;--------------------------------------------------------------------------------
incf Trigg,F
; Увеличение на 1 (
инкремент
)
содержимого
; переключателя направления ретрансляции.
goto START
; Переход на новый цикл сканирования.
;********************************************************************************
end
; Конец программы
.
Сравните тексты программ
Retr_1.asm
и
Retr_3.asm
Если
Вы хорошо усвоили предыдущую информацию, то текст программы
, а
также и
его отличия от текста программы, не будут вызывать у
Вас затруднений
Если это не так, то вернитесь назад и
найдите там ответы на
Ваши вопросы
Программу
Retr_3.asm
можно использовать как некую "лакмусовую бумажку ": пока
Вам в
ней что- тоне понятно, тоне стОит переходить к
изучению следующих разделов, а
лучше разобраться с
предыдущими
В
идеале
, программа
Retr_3.asm
должна быть
Вам понятна "от и
до ". Замечания по прерываниям
Целью "вышележащих разборок " с
прерываниями является только формирование общих понятий о
них
Описанное выше устройство неидеально в
том смысле, что имеется достаточно большая "зона " запрета прерываний
Хотя
, в
данном случае, специфика работы ретранслятора Vertex-7000VXR такова, что допускает наличие такой "зоны ", но при создании программ под другие устройства, такой подход может быть неприемлем
Более детальные "разборки " с
прерываниями будут произведены позднее
Дополнительно
Разберемся стой "мутью ", которая подпортила нервы тем, кто ее заметил (5 баллов за внимательность) и
выдал сигналы SOS. Открываем проект
Retr_1
При этом, выставит совершенно однозначные настройки по умолчанию
Нас интересует регистр, ив частности, его бит с 0. По умолчанию, он установлен в 0 (см окно.
Пошагово исполняем программу до момента установки единицы в
бите

0 регистра
TrisB
(
перевод вывода
RB0
на работу "на вход "). После этого смотрим, не изменилось ли состояние нулевого бита регистра Не изменилось
Как был 0, так они осталсяВывод:на выводе порта, настроенном на работу как "на выход ", таки "на вход ", по умолчанию, выставляет 0.
Пошагово исполняем программу далее, обращая внимание только на то, что связано с
командами
, которые обращаются к
содержимому регистра

159 Походу исполнения программы, первой такой командой является команда копирования содержимого регистра
W
в регистр (
movwf PortB
).
В
аккумуляторе
(
W
) находится число .251, и
казалось бы, именно оно должно скопироваться в
порт
В
Исполняем команду Смотрим в
окно
SFR
А
скопировалось
- тоне, а .250.
??? Ради "спортивного интереса ", можете поподставлять
, вместо .251, другие числовые значения констант и
убедиться в
том
, что все нечетные числа "превращаются " в
четные
, ас четными числами проблем нет
О
чем это говорит Это говорит о
том
, что в
бите

0 регистра "намертво застолблён " ноль, выставленный
MPLAB
по умолчанию
Дело в
том
, что
MPLAB
отражает состояния выводов порта
То есть, если вывод порта настроен на работу "на выход, то по причине того, что в
этом случае, выход защелки подключается к
выводу порта, состояние вывода порта будет соответствовать состоянию его "персональной"

защелки
.
Что же тогда мы видим в
бите

0? Мы видим уровень, выставленный
MPLAB
по умолчанию, для вывода порта работающего
"
на вход. Вот и
весь сказ
Свидетельствует ли это о
какой
- то ошибке в
работе программы
/"
железяки "? Нет, не свидетельствует
Образно выражаясь, откуда
MPLAB
у знать, какой уровень выставит внешнее устройство Вот он, не мудрствуя лукаво, по умолчанию, и
выставляет на тех выводах порта, которые работают "на вход ", нулевые уровни
С
помощью функций стимула, на выводе порта, который работает "на вход ", можно сымитировать единицу (
в
MPLAB
это можно сделать, нов данном случае, проще узнать "в чем собака порылась " и
сделать соответствующие выводы, чем что- то имитировать
От этого "извилина крепчает " и
прибавляется опыт
"
Самоучитель по программированию PIC контроллеров для начинающих"

http://ikarab.narod.ru E-mail: karabea@lipetsk.ru

160 12. Организация вычисляемого перехода
Работа с EEPROM памятью данных
В
предыдущих разделах я
стремился объяснить
Вам некоторые фундаментальные основы программирования микроконтроллеров (любых. На данный момент
Вы должны отчетливо представлять себе общие принципы составления текста программы, движения рабочей точки программы по командам текста программы, и
самое главное, Вы должны понять зачем нужны подпрограммы задержек, их предназначение и
основные функции, так как программирование без задержек это все- равно что машина без мотора
Все циклические подпрограммы "базируются " на задержках и
такой термин, как "
закольцовка ", тоже "из этой же оперы ". Именно задержки составляют основу программы.
И
сама программа представляет собой одно большое "кольцо, внутри которого может быть какое
-
то количество "колец рангом пониже, а в
этих
"кольцах, в свою очередь, может находиться какое
-
то количество "колец рангом еще ниже" и т
.
д
. Движение рабочей точки программы по полному циклу программы можно сравнить со взлетом и
посадкой самолета, между которыми он совершает несколько "мертвых петель ".
В
идеале
, программист должен четко и
ясно представлять себе функцию каждого кольца, его "конструкцию " и
правила его функционирования
Есть еще и
другие
, несомненно, важные "вещи ", на которые, до конца не разобравшись с "кольцевой природой " программ, "клюют " начинающие программисты, совершая тем самым серьезную, стратегическую ошибку
Это вполне может привести к
трудностям в
представлении общей "картины " работы программы, даже если человек неплохо разбирается с
ее составными частями
Так что не жалейте времени на "разборки " с
задержками
(кольцами "). Этот труд однозначно окупится
И
еще один добрый совет если
Вы хотите разобраться с
работой программы, тоне пожалейте времени на ее общий анализ и
составление
, по его результатам, блок- схемы программы
В
дальнейшем
, это сэкономит много времени и
нервов
А
теперь начинаем разбираться с
другими важными "вещами ". Организация вычисляемого перехода
Понятие вычисляемого перехода было вкратце сформулировано во 2- м
разделе
Теперь
, подробнее
Нам уже известно, что команды ветвления "порождают " 2 сценария работы программы
А
как быть, если нужно "компактно разветвиться ", например, наиболее сценариев Это можно сделать при помощи вычисляемого перехода (стандартное название операции. Вычисляемый переход осуществляется при помощи команды PC,F

, которая формально описывается так сложить содержимое регистров
W
и
PC
, с
сохранением результата сложения в
регистре
PC
(имеется ввиду младший разряд счетчика команд с
названием
PCL
). Неформально, эта команда описывается так увеличить (прирастить) текущее значение содержимого счетчика команд PC на величину содержимого регистра Тоже самое можно сказать и
о формальном толковании команды Разница только в
том
, что результат сложения будет сохранен в
регистре
W
Таким образом, из- за того, что результат операции сохранится в
регистре
W
, будет осуществлено приращение не счетчика команда аккумулятора
По этой причине, команду нельзя использовать в
качестве команды вычисляемого перехода
Итак
, для организации вычисляемого перехода, применяется команда Эта команда, в
тексте программы, может располагаться где угодно (там, куда ее вставит программист, и
соответственно
, адрес этой команды, в
памяти программ
,
может быть различным
Так вот, для вычисляемого перехода, этот адрес является как бы начальной точкой отсчета
Пример
: программист составляет программу
Он "дошел до того ее места ", где нужно "разветвить " программу, например, на 4 сценария (для того чтобы впоследствии "уйти " на исполнение того или иного из этих 4- х
сценариев
).

161 Можно организовать серию последовательных проверок, а
можно организовать и
вычисляемый переход
В
последнем случае, можно обойтись количеством команд меньшим, чем в
первом случае, ив мозги это ложится " более комфортно
Такого рода выигрыш тем заметнее, чем на большее количество сценариев нужно "разветвиться ". Прежде чем вставить в
текст программы команду PC,F

, необходимо определиться с
критерием перехода, то есть, с
содержимым чего- то, что определяет, какой именно из 4- х
сценариев будет далее исполняться
Это "чего- то " есть регистра критерием перехода является его содержимое, то есть, число, находящееся в
регистре
W
на момент исполнения команды Это число и
есть приращение счетчика команд
PC
Еще раз повторяю, что команда PC,F

, в
памяти программ, может иметь любой адрес, ив случае организации вычисляемого перехода, этот адрес определяет только положение этой команды в
памяти программ и
не влияет на выбор дальнейших сценариев работы программы
Этот выбор зависит от приращения счетчика команд
PC
Какие числа должны быть записаны в
регистр
W
? Для того чтобы процедура вычисляемого перехода получилась "компактной ", значения этих чисел, в
данном случае (4 сценария, должны быть равны 0, 1, 2, 3 (почему именно такие значения, а
не
1, 2, 3, 4, Вы поймете позже. Если сценариев большее чем 4, то этот числовой ряд нужно продолжить (количество этих чисел должно быть равно количеству сценариев. После осуществления одного из нескольких возможных приращений содержимого счетчика команд, будет осуществлен переход (стек не задействован) на одну из команд начала исполнения сценариев программы, которая и
будет исполнена в
последующих машинных циклах
Командами начала исполнения сценариев могут быть
-
Команды
goto
Последним сценарием, может быть (а может и
не быть
Зависит от задумки) сценарий "программа исполняется далее. Такой вычисляемый переход применяется в
тех случаях, когда выбор того или иного сценария работы программы нужно поставить в
зависимость от внешнего управления
(
например
, от состояния клавиатуры) или от результатов работы программы (
например
,
от результата вычисления
).
1   ...   26   27   28   29   30   31   32   33   ...   57


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