
Разработка управляющей программы
Программа (с подробными комментариями) управления PIC-контроллером, написанная на ассемблере и проверенная в интегрированной среде MPLAB приведена ниже:
;--------------------------------- "ШАПКА" ПРОГРАММЫ ----------------------------------------
;*********************************************************************************************
; Файл текста программы: generic.asm
; Программа разработана для генератора специальных сигналов(1Гц)
;*********************************************************************************************
; Автор: Сергеенко Артём Константинович БГУИР гр.700102(2010)
;*********************************************************************************************
; Используется микроконтроллер PIC16F84A. Частота кварца 4кГц.
;*********************************************************************************************
; Объем программы: 46 слов в памяти программ.
;*********************************************************************************************
;=============================================================================================
; В "шапке" программы используются директивы: LIST, __CONFIG, equ, org.
;=============================================================================================
LIST p=16F84A ; Назначение типа ПИКа: PIC16F84A.
__CONFIG 03FF5H ; Установка битов конфигурации: стандартный XT-генератор,
; WDT включен, бит защиты не установлен, PWRT
; включен (1111 0101).
;=============================================================================================
; Определение адресов регистров специального назначения.
;=============================================================================================
OptionR equ 01h ; Регистр Option - банк1
Status equ 03h ; Регистр Status
PortA equ 05h ; Порт А
TrisA equ 05h ; Регистр Tris A - банк1
PortB equ 06h ; Порт B
TrisB equ 06h ; Регистр Tris B - Банк1
IntCon equ 0Bh ; Регистр IntCon
;=============================================================================================
; Определение названия и адресов регистров общего назначения.
;=============================================================================================
Sec equ 0Ch ; Счетчик времени полупериода.
SecL equ 0Eh ; Байт таймера.
;=============================================================================================
; Присвоение буквенного обозначения операции направления результата выполнения команды в
; регистр, с содержимым которого производится действие (для удобства восприятия текста
; программы).
;=============================================================================================
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 ; Установка 5-го бита регистра Status в единицу.
movlw .7 ; Запись в регистр W константы .7
movwf TrisA ; Установка 0, 1 и 2-го битов регистра TrisА
; в единицу, а остальных - в ноль.
movlw .0 ; Запись в регистр W константы .0
movwf TrisB ; Установка всех битов регистра TrisB
; в ноль.
movlw .143 ; Запись в регистр W константы .143
movwf OptionR ; Установка 4,5,6-го битов регистра OptionR
; в ноль, а остальных - в единицу.
bcf Status,RP0 ; Установка 5-го бита регистра Status в ноль.
;--------------------------------------------------------------------------------------------
; Проверка наличия включения кнопок.
;--------------------------------------------------------------------------------------------
btfsc PortA,0 ; Если нулевой бит регистра PortA равен 1, то выполняется
goto Five ; следующая команда (goto Five), а если равен 0, то сле-
; дующая команда не выполняется (вместо нее - nop) и
; следующей активной командой будет btfsc PortA,1
btfsc PortA,1 ; Если первый бит регистра PortA равен 1, то выполняется
goto Sex ; следующая команда (goto Sex), а если равен 0, то сле-
; дующая команда не выполняется (вместо нее - nop) и
; следующей активной командой будет btfsc PortA,2
btfsc PortA,2 ; Если второй бит регистра PortA равен 1, то выполняется
goto Seven ; следующая команда (goto Seven), а если равен 0, то сле-
; дующая команда не выполняется (вместо нее - nop) и
; следующей активной командой будет goto START
goto START ; Безусловный переход на подпрограмму START.
;--------------------------------------------------------------------------------------------
; Запись констант времени работы таймера.
;--------------------------------------------------------------------------------------------
Five movlw .6 ; Запись в регистр W константы .6
movwf SecL ; Копирование константы .6 из регистра W в регистр SecL.
goto PRD ; Безусловный переход на подпрограмму PRD.
;--------------------------------------------------------------------------------------------
Sex movlw .7 ; Запись в регистр W константы .7
movwf SecL ; Копирование константы .7 из регистра W в регистр SecL.
goto PRD ; Безусловный переход на подпрограмму PRD.
;--------------------------------------------------------------------------------------------
Seven movlw .8 ; Запись в регистр W константы .8
movwf SecL ; Копирование константы .8 из регистра W в регистр SecL.
goto PRD ; Безусловный переход на подпрограмму PRD.
;--------------------------------------------------------------------------------------------
; Формирование импульса(положительный).
;--------------------------------------------------------------------------------------------
CYCLE bsf PortA,3 ; Установить 0-й бит регистра PortB в 1.
incf PortB,F
nop
movlw .124 ; Запись в регистр W константы .124
movwf Sec ; Копирование константы .124 из регистра W в регистр Sec.
PAUSE_1 clrwdt ; Установка начала отсчета сторожевого таймера WDT.
decfsz Sec,F ; Декремент (-1) содержимого регистра Sec с сохранением
; результата декремента в нем же.
; Если этот результат не=0, то выполняется следующая коман-
; да (goto PAUSE_1), а если =0, то следующая команда не
; выполняется (вместо нее - nop) и следующей активной
; командой будет bsf PortB,0
goto PAUSE_1 ; Безусловный переход на подпрограмму PAUSE_1.
;--------------------------------------------------------------------------------------------
; Формирование импульса(отрицательный).
;--------------------------------------------------------------------------------------------
bcf PortA,3 ; То же самое, что и при формировании
nop ; отрицательного полупериода, только
nop ; 0-й бит регистра PortB
nop ; устанавливается в 0.
movlw .123 ; То же самое, что и при формировании отрицательного полу-
movwf Sec ; периода, только в регистр Sec записывается константа .123
PAUSE_2 clrwdt ; Установка начала отсчета сторожевого таймера WDT.
decfsz Sec,F ; То же самое, что и при формировании отрицательного полу-
goto PAUSE_2 ; периода, только безусловный переход осуществляется
; на подпрограмму PAUSE_2.
;--------------------------------------------------------------------------------------------
; "Очистка" (декремент) таймера.
;--------------------------------------------------------------------------------------------
PRD decfsz SecL,F ; Декремент (-1) содержимого регистра SecL с сохранением
goto CYCLE ; результата в нем же.
; Если этот результат не=0, то выполняется следующая коман-
; да (goto CYCLE), а если =0, то следующая команда не
; выполняется (вместо нее - nop) и следующей активной
; командой будет decfsz SecH,F
bsf PortA,4 ; Установить 3-й бит регистра PortA в 1.
bcf PortA,4 ; Установить 3-й бит регистра PortA в 0.
goto START ; Безусловный переход на подпрограмму START
;============================================================================================
end ; Директива конца текста программы.