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

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


Скачать 3.49 Mb.
НазваниеСистема команд pic16F84A 26 Что такое программа иправила ее составленияПример создания программы автоколебательного мультивибратораДирективы.
АнкорСамоучитель по программированию PIC контроллеров для начинающих (Е.А. Корабельников,2008).pdf
Дата30.01.2017
Размер3.49 Mb.
Формат файлаpdf
Имя файлаСамоучитель по программированию PIC контроллеров для начинающих .pdf
ТипПрограмма
#1195
КатегорияПромышленность. Энергетика
страница15 из 57
1   ...   11   12   13   14   15   16   17   18   ...   57
decfsz SecL,F
; Декремент содержимого регистра SecL.
goto CYCLE
; Если результат декремента не, то переход ;
в
ПП
CYCLE.
; Если результат декремента =0, то программа ; исполняется далее.
decfsz SecH,F
; Декремент содержимого регистра SecH.
goto CYCLE
; Если результат декремента не, то переход ;
в
ПП
CYCLE.
; Если результат декремента =0, то программа ; исполняется далее.
bcf PortB,2
; Установить на выходе RB2 ноль.
;--------------------------------------------------------------------------------
; Уход рабочей точки программы в "вечное" кольцо и
выход из него после переключения р
/
станции с
передачи на прием.

;--------------------------------------------------------------------------------
PRD clrwdt
; Сброс сторожевого таймера WDT.
btfss PortB,0
; Передача включена
goto PRD
; Если да, то переход на
ПП
PRD.
; Если нетто программа исполняется далее.
; Еще одна проверка.
btfss PortB,0
; Передача включена
goto PRD
; Если да, то переход на
ПП
PRD.
; Если нетто программа исполняется далее.
goto START
; Конец полного цикла программы, переход на ; новый полный цикл программы.
;================================================================================
end
; Конец программы. Текст программы
cus_2.asm
выглядит так
;********************************************************************************
;
cus_2.asm
ВАРИАНТ
КОММЕНТАРИЯ

2
; Программа разработана для устройства тонального вызова с
частотой
1450 Гц.
;********************************************************************************
; Автор
Корабельников
Евгений
Александрович г
.
Липецк
, январь г.
; E-mail: karabea@lipetsk.ru http://ikarab.narod.ru
; Используется микроконтроллер PIC16F84A. Частота кварца кГц.
; Объем программы 46 слов в
памяти программ.

;********************************************************************************
; "ШАПКА" ПРОГРАММЫ
LIST p=16F84A
; Назначение типа
ПИКа
: PIC16F84A.
__CONFIG 03FF5H
; Установка битов конфигурации стандартный ; генератор, WDT включен, бит защиты не ; установлен, PWRT включен (1111 0101).
;================================================================================
; Определение адресов регистров специального назначения.
;================================================================================
OptionR equ 01h
; Регистр Option - банк
Status equ 03h
; Регистр Status
PortB equ 06h
; Порт B
TrisB equ 06h
; Регистр Tris B - Банк
IntCon equ 0Bh
; Регистр IntCon
;================================================================================
; Определение названия и
адресов регистров общего назначения.

;================================================================================
Sec equ 0Ch
; Счетчик времени полупериода.
SecH equ 0Dh
; Старший байт таймера.
SecL equ 0Eh
; Младший байт таймера.
;================================================================================

83
; Присвоение буквенного обозначения операции направления результата выполнения команды в
регистр
, с содержимым которого производится действие (для удобства восприятия текста программы.
;================================================================================
F equ 1
; Результат направить в
регистр
, с содержимым ; которого производится действие.
;================================================================================
; Присвоение биту выбора банка регистра STATUS (пятому) его стандартного названия для удобства восприятия текста программы.
;================================================================================
RP0 equ 5
; Присвоение 5-
му биту регистра STATUS

; названия RP0.
;================================================================================
; Определение точки входа в
программу
.
;================================================================================
org 0
; Установка нулевого адреса в
счетчике
; команд PC.
goto START
; Безусловный переход на подпрограмму START.
;********************************************************************************
;********************************************************************************
;----------------------------
РАБОЧАЯ
ЧАСТЬ
ПРОГРАММЫ
-------------------------
;********************************************************************************
; Подготовительные операции.
;--------------------------------------------------------------------------------
START clrf IntCon
; Сброс в
ноль всех битов регистра IntCon.

clrwdt
; Установка начала отсчета сторожевого ; таймера WDT.
bsf Status,RP0
; Установка го бита регистра Status
; в единицу.
movlw .65
; Запись в
регистр
W константы .65
; (.65 = 0100 0001)
movwf TrisB
; Установка нулевого иго бита регистра ; TrisB в единицу, а остальных - в ноль.
movlw .143
; Запись в
регистр
W константы .143
; (.143 = 1000 1111)
movwf OptionR
; Установка го битов регистра OptionR
; в ноль, а остальных - в единицу.
bcf Status,RP0
; Установка го бита регистра Status в ноль-
; Запись констант времени работы таймера.
;--------------------------------------------------------------------------------
movlw .15
; Запись в
регистр
W константы .15
movwf SecH
; Копирование константы .15 из регистра W
; в регистр SecH.
movlw .255
; Запись в
регистр
W константы .255
movwf SecL
; Копирование константы .255 из регистра W
; в регистр SecL.
;--------------------------------------------------------------------------------
; Проверка наличия включения на передачу (опрос клавиатуры.
;--------------------------------------------------------------------------------
CYCLE btfsc PortB,0
; Если нулевой бит регистра PortB равен 1, то ; выполняется следующая команда (goto START),
; а если равен 0, то следующая команда не ; выполняется (вместо нее - nop) и следующей ; активной командой будет btfss PortB,6
goto START
; Безусловный переход на подпрограмму START.
;--------------------------------------------------------------------------------
; Проверка режим тонального вызова включен или выключен ?
;--------------------------------------------------------------------------------
btfss PortB,6
; Если й бит регистра PortB равен 0, то ; выполняется следующая команда (goto PRD), а ; если равен 1, то следующая команда не ; выполняется (вместо нее - nop) и следующей ; активной командой будет bcf PortB,2

84
goto PRD
; Безусловный переход на подпрограмму PRD.
;--------------------------------------------------------------------------------
; Формирование времени отрицательного полупериода сигнала тонального вызова.
;--------------------------------------------------------------------------------
bcf PortB,2
; Установить й бит регистра PortB в 0.
nop
; Пустые машинные циклы.
nop
; ----------"-----------
nop
; ----------"-----------
movlw .85
; Запись в
регистр
W константы .85
movwf Sec
; Копирование константы .85 из регистра W
; в регистр Sec.
PAUSE_1 clrwdt
; Установка начала отсчета сторожевого ; таймера WDT.
decfsz Sec,F
; Декремент (-1) содержимого регистра Sec с ; сохранением результата декремента в
нем же.

; Если этот результат не, то выполняется ; следующая команда (goto PAUSE_1), а если =0,
; то следующая команда не выполняется (вместо ; нее - nop) и следующей активной командой ; будет bsf PortB,2
goto PAUSE_1
; Безусловный переход на подпрограмму PAUSE_1.
;--------------------------------------------------------------------------------
; Формирование времени положительного полупериода сигнала тонального вызова.
;--------------------------------------------------------------------------------
bsf PortB,2
; Тоже самое, что и
при формировании nop

; отрицательного полупериода, только nop
; й бит регистра PortB
nop
; устанавливается в 1.
movlw .83
; Тоже самое, что и
при формировании movwf Sec

; отрицательного полупериода, только в
регистр
; Sec записывается константа .83
PAUSE_2 clrwdt
; Установка начала отсчета сторожевого ; таймера WDT.
decfsz Sec,F
; Тоже самое, что и
при формировании goto PAUSE_2

; отрицательного полупериода, только ; безусловный переход осуществляется на ; подпрограмму PAUSE_2.
;--------------------------------------------------------------------------------
; "Очистка" (декремент) таймера.
;--------------------------------------------------------------------------------
decfsz SecL,F
; Декремент (-1) содержимого регистра SecL с goto CYCLE
; сохранением результата в
нем же.

; Если этот результат не, то выполняется ; следующая команда (goto CYCLE), а если =0,
; то следующая команда не выполняется (вместо ; нее - nop) и следующей активной командой ; будет decfsz SecH,F
decfsz SecH,F
; Тоже самое, что и
при декременте goto CYCLE

; содержимого регистра SecL, только ; применительно к
регистру
SecH.
bcf PortB,2
; Установить й бит регистра PortB в 0.
;--------------------------------------------------------------------------------
; Уход рабочей точки программы в "вечное" кольцо и
выход из него после переключения р
/
станции с
передачи на прием.

;--------------------------------------------------------------------------------
PRD clrwdt
; Установка начала отсчета сторожевого ; таймера WDT.
btfss PortB,0
; Если нулевой бит регистра PortB равен 0, то ; выполняется следующая команда (goto PRD), а ; если равен 1, то следующая команда не ; выполняется (вместо нее - nop) и следующей ; активной командой будет btfss PortB,0
goto PRD
; Безусловный переход на подпрограмму PRD.

85
; Еще одна проверка.
btfss PortB,0
; Тоже самое, что и
при первой проверке,

; только, при равенстве нулевого бита регистра ; PortB единице, следующей активной командой ; будет goto START.
goto PRD
; Безусловный переход на подпрограмму PRD.
goto START
; Безусловный переход на подпрограмму START.
;================================================================================
end
; Директива конца текста программы. Для того чтобы далее работать с
текстами этих программ, создайте проекты cus_1 и cus_2
, а
затем скопируйте в
них файлы
cus_1.asm
и
cus_2.asm
соответственно
О
том
, как это делается, рассказано в 5- м
разделе
Можете проассемблировать их и
убедиться в
отсутствии ошибок
Итак
, перед
Вами текст программы (так я
буду называть любую из них, оформленный по всем правилам составления текста программы
Ранее я
упоминал про "правило 12- ти пробелов ".
В
тексте программы
cus,
это правило использовано на практике
Давайте разбираться
Текст программы содержит комментарии, из которых можно многое узнать
Такого рода комментарии - достаточно большая редкость
По совокупности причин, разработчики программ редко себя этим утруждают
Отчасти этими объясняется то, что при наличии большого количества разнообразных текстов программ, большая их часть таки остается "тайной за семью печатями ". Для опытных программистов, владеющих приемами программно- аппаратного анализа, отсутствие комментариев не является непреодолимой преградой, нос начинающими сложнее c непривычки, можно "заполучить множество фингалов ". Чтобы уменьшить их количество, давайте потрудимся
Напоминаю
Вам снова и
снова
: движение рабочей точки программы, по тексту программы, никогда не останавливается (за исключением "уходов " в
спящий режим. Это означает то, что если необходимо задержать исполнение последующих команд, то рабочую точку программы обязательно нужно "закольцевать " (задержать) в
какой
- то подпрограмме, образно выражаясь, "поставленной на счетчик ". Выход рабочей точки программы, из этой подпрограммы, возможен либо после завершения, программно организованным счетчиком, своего счета, либо после поступления внешнего, управляющего сигнала
Любая программа это постоянная "вереница " такого рода колец, и
без глубокого понимания смысла и "технологии " этих "
закольцовок ", в
программировании делать нечего
Программа
cus
не является исключением
Если
Вы поймете ее работу, то найдете ответы на многие вопросы
"
Шапка
" программы. Напоминаю все что находится правее точек с
запятой
,
MPLAB
"не видит ", и
к программе, в
буквальном смысле этого слова, это не имеет отношения, так как программа, опять же, в
буквальном смысле этого слова, это то, что не заблокировано точками с
запятыми
Вверху "шапки " программы, обычно, помещается общая, пояснительная информация о
программе
, обустройстве, которое она обслуживает и
т п. (правило хорошего тона ". Необязательно, но желательно. Эта информация может быть изложена в
произвольной форме
То же самое относится и
к комментариям "Активная " часть "шапки " начинается с
директив
LIST
и
__CONFIG
Первая "подсказывает "
MPLAB
, какой именно файл, из весьма обширной библиотеки файлов, нужно извлечь из ее "недр " для того, чтобы "привязаться " к
конкретному типу
ПИКа
(
в нашем случае, ка при помощи второй директивы устанавливаются значения битов конфигурации
В
PIC16F84A
, битов конфигурации всего 5 и
поэтому
, из пяти двоичных разрядов 16- ричного

86 числа (в данном случае, 03FF5h), активными (в которых можно что- то менять) являются только 2 последних разряда, а
первые три всегда "прописываются " как 03F.
16- ричному числу F5h соответствует бинарное число Сверяемся с
распечаткой битов конфигурации
Получается
: переводим тактовый генератор
ПИКа в
режим стандартного, кварцевого генератора (
XT
), включаем сторожевой таймер, разрешаем работу таймера включения питания, отключаем бит защиты памяти программ и
EEPROM
памяти данных
Что касается, тона него, пока, можно не обращать внимания
Он не представляет собой нечто совершенно необходимое
Его можно включить, а
можно и
выключить
PWRT
, за счет формирования задержки, "нейтрализует " негативные последствия медленного нарастания питающего напряжения
Практически всегда, эта скорость настолько высока, что "услуг " не требуется
Далее необходимо определиться с
регистрами специального и
общего назначения
Порядок этого "определения " не имеет значения можно, сначала определиться с
регистрами общего, а
затем
, специального назначения или "перетасовать их как карты ". Так как "бардак ", в
тексте программы, совсем ненужен, то советую
Вам придерживаться того "порядка ", который "наведен " в "шапке " программы
cus
При "прописке " регистров специального (и общего) назначения, нужно "прописывать " только те регистры, которые задействованы при выполнении программы (к содержимому которых происходят обращения. Прописывать " те регистры, которые не задействуются при выполнении программы, можно, ноне нужно
Если возникают сомнения типа "
А
вдруг потребуется, можно "прописать " все (или часть) регистры специального назначения, а
потом
, когда программа будет отработана, убрать лишние
Лично я, в
подобных обстоятельствах, поступаю именно так
В
программе
cus,
Вы видите только те регистры специального назначения, которые задействуются при выполнении программы
Лишних нет "Прописка " происходит при помощи директивы
equ
с указанием адресов регистров специального назначения в
области оперативной памяти
Обратите внимание на то, что адрес регистра (1- й
банк
) дублирует адрес регистра (нулевой банк. Это то, о
чем говорилось ранее (кто забыл, вернитесь назад. Регистры общего назначения прописываются по адресам области оперативной памяти, не относящимся к
регистрам специального назначения
Можно выбрать любые из этих адресов
Это личное дело программиста
Регистрам общего назначения нужно присвоить какие- нибудь названия
Это тоже личное дело программиста
Ну и
соответственно
, "прописать " эти названия в "шапке " программы
Я
назвал их
1   ...   11   12   13   14   15   16   17   18   ...   57


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