Добавил:
Опубликованный материал нарушает ваши авторские права? Сообщите нам.
Вуз: Предмет: Файл:
Программируемые контроллеры для систем управления ч2. Г.И.Загарий, В.С. Коновалов В.С., Н.О. Ковзель, В.И. Поддубняк, А.И. / Программируемые контроллеры для систем управления ч2. Г.И.Загарий, В.С. Коновалов В.С., Н.О. Ковзель, В.И. Поддубняк, А.И. .doc
Скачиваний:
317
Добавлен:
08.08.2013
Размер:
15.9 Mб
Скачать

7.3.2 Структура рабочей программы

Рабочая программа для ОМК PIC16/17 состоит из трех основных секций:

– секция заголовка;

– рабочая секция;

– секция окончания.

В секции заголовка определяются имена всех используемых в программе ресурсов: портов, битовых и байтовых переменных, регистров. Это начальная часть исходной программы до строки с выражением ORG 0 (для PIC 16F84). Для других типов микроконтроллеров семейств PIC 16/17 адрес начала следующей секции (сегмента) рабочей программы можт быть другим (см. организацию памяти программ конкретного типа ОМК).

Рабочая секция программы начинается с выражения ORG 0, которое является указателем для Ассемблера о том, что код, следующий за этим выражением, начинается с нулевого адреса памяти программ. Пример исходного текста рабочей программы для PIC 16F84 приведен ниже.

; ЗАГОЛОВОК ПРОГРАММЫ

TITLE "ПРИМЕР ПРОГРАММЫ ДЛЯ PIC16F84"

LIST P=16F84 ;ОПРЕДЕЛИТЬ ПРОЦЕССОР

RADIX DEC ;ОПРЕДЕЛИТЬ СИСТЕМУ СЧИСЛЕНИЯ

;ПО УМОЛЧАНИЮ - ДЕСЯТИЧНАЯ

#include <P16F84.INC> ;ВКЛЮЧИТЬ ФАЙЛ СПЕЦИФИКАЦИЙ ПРОЦЕССОРА

; ЗАДАТЬ СЛОВО КОНФИГУРАЦИИ

__CONFIG _CP_OFF & _WDT_OFF & _HS_OSC

;****************************************************

; ЗАДАТЬ КОНСТАНТЫ

;****************************************************

; 76543210 БИТЫ

INITA EQU B'11111111' ;ОПРЕДЕЛИТЬ НАСТРОЙКУ

;ПОРТА A НА ВВОД

INITB EQU B'00000000' ;ОПРЕДЕЛИТЬ НАСТРОЙКУ

;ПОРТА В НА ВЫВОД

CONST0 EQU 0 ;КОНСТАНТА 0

CONST1 EQU 255 ;КОНСТАНТА 1

; ОПРЕДЕЛИТЬ БИТЫ РЕГИСТРА СОСТОЯНИЯ - STATUS

#DEFINE _Z STATUS,Z

#DEFINE _C STATUS,C

#DEFINE _DC STATUS,DC

#define _PD STATUS,3

#define _TO STATUS,4

#define _RP0 STATUS,5

#define _PA0 STATUS,5

#define _RP1 STATUS,6

#define _PA1 STATUS,6

#define _IRP STATUS,7

#define _PA2 STATUS,7

;***** ОПРЕДЕЛИТЬ ПЕРЕМЕННЫЕ

Cblock 0x10

Count1

Count2

Count3

endc

;****************************************************

; СЕКЦИЯ КОДА ПРОГРАММЫ

;****************************************************

ORG 0x000 ;НАЧАЛЬНЫЙ АДРЕС ПРОГРАММНОЙ

;ПАМЯТИ

GOTO START ;ПЕРЕДАТЬ УПРАВЛЕНИЕ НА

;НАЧАЛО ПРОГРАММЫ

ORG 0x004 ; ПОДПР. ОБРАБОТКИ ПРЕРЫВАНИЯ

; НАЧИНАЯ С АДРЕСА 004 МОЖЕТ БЫТЬ РАЗМЕЩЕНА

; ПОДПРОГРАММА ОБРАБОТКИ ПРЕРЫВАНИЯ

retfie ; ВЫХОД ИЗ ПОДПРОГРАММ

; ОБРАБОТКИ ПРЕРЫВАНИЯ

;****************************************************

; СОБСТВЕННО ПРОГРАММА

;****************************************************

START:

BSF STATUS,RP0 ;УСТАНОВИТЬ 1-ю СТАНИЦУ ОЗУ

MOVLW INITA

MOVWF TRISA ;PORT A НАСТРОИТЬ НА ВВОД

MOVLW INITB

MOVWF TRISB ;PORT B НАСТРОИТЬ НА ВЫВОД

BCF STATUS,RP0 ;УСТАНОВИТЬ 0-ю СТАНИЦУ ОЗУ

ST1:

MOVLW CONST0 ; W := CONST0

BTFSC PORTA,0 ; ЕСЛИ PORTA,0 = 0,

; ПРОПУСТИТЬ СЛЕДУЮЩУЮ

; КОМАНДУ

MOVLW CONST1 ; W := CONST1

MOVWF PORTB ;ВЫДАТЬ W В ПОРТ В

MOVWF Count1 ;ЗАПИСАТЬ W В РЕГИСТР Count1

MOVF PORTA,W ;СОДЕРЖИМОЕ PORTA ПЕРЕСЛАТЬ В W

MOVWF Count2 ; ЗАПИСАТЬ W В РЕГИСТР Count2

GOTO ST1 ;ЗАВЕРШИТЬ ЦИКЛ

END ; ДИРЕКТИВА'end of program'

На приведенном примере объясним основные особенности и правила написания исходных текстов программ для ОМК PIC на языке Ассемблера. Для этого будем анализировать строку за строкой приведенной программы. После ассемблирования исходного текста, кроме исполняемого кода, Ассемблером создается также листинг, в котором отображаются все произведенные преобразования. Листингом удобно пользоваться при отладке и анализе программы.

Все строки, которые начинаются со знака ";", воспринимаются Ассемблером как комментарии.

Директивой TITLE Ассемблеру задан текст"ПРИМЕР ПРОГРАММЫ ДЛЯ PIC16F84", который будет повторен во второй строке на каждой странице листинга.

Следующая директива LIST P=16F84 задает Ассемблеру тип микроконтроллера, для которого производится ассемблирование исходного текста.

Директива RADIX DEC задает Ассемблеру использование по умолчанию десятичной системы счисления при задании числовых величин.

Директива #include <P16F84.INC> подключает файл спецификаций (определений) стандартных идентификаторов для микроконтроллера типаPIC16F84.

Директива __CONFIG _CP_OFF & _WDT_OFF & _HS_OSC задает ассемблеру биты слва конфигурации.

Следующие далее строки с директивой EQUприсваивают идентификаторамINITA,INITB,CONST0 иCONST1 числовые значения. Во всех местах программы, где используются эти идентификаторы, при ассемблировании будут подставлены заданные числовые значения.

Строки с директивой #DEFINEопределяют идентификаторы замены. Например, директива#DEFINE _Z STATUS,Zопределяет замену идентификатора бита состоянияSTATUS,Zидентификатором_Z, и программист в программе вместо идентификатораSTATUS,Zможет вписывать более короткий и удобный идентификатор_Z.

Далее директивы CBLOCKиENDCопределяют список адресных констант Count1, Count2, Count3, которые соответствуют адресам ОЗУ:Count1 –0x10, Count2 – 0x11, Count3 - 0x12. Таким образом, во всех местах, где в программе встречается идентификаторCount1, Ассемблер подставляет вместо него адрес0x10, а вместоCount2– адрес0x11 и т.д.

Директива ORG 0x000задает начальный адрес размещения программных кодов.

Первая инструкция, выполняемая процессором, это команда GOTO START, которая передаст управление на адрес, соответствующий меткеSTARTи дальнейшая работа продолжится с этого адреса.

Блок команд, расположенных начиная с метки START, до метки ST1 выполняет настройку портов: порта А – на ввод информации, а порта В – на вывод. Для этого с помощью команды BSF STATUS,RP0 бит STATUS,RP0 регистра состояния устанавливается в единичное состояние (для того, чтобы можно было обратиться к первому банку данных). Затем последовательным выполнением команд MOVLW INITA (регистру W присваивается значение INITA) и MOVWF TRISA (регистру TRISA присваивается значение W) регистр TRISA устанавливается в состояние, описываемое величиной INITA. Состояние регистра TRISA после этого станет равным в двоичном представлении "11111" с учетом того, что регистры PORTA и соответствующий ему регистр настройки TRISA – пятиразрядные (см. структурную схему микроконтроллера). Аналогично – установкой регистра TRISB в состояние "00000000" производится настройка порта В на вывод двоичной информации.

Команда BCF STATUS,RP0устанавливает битSTATUS,RP0регистра состояния в нулевое состояние. Нулевое состояние битаSTATUS,RP0регистра состояния считается исходным потому, что ОЗУ пользователя микроконтроллераPIC16F84 размещается в нулевом банке данных, начиная с адреса0x0C.

Команда MOVLW CONST0установит регистрWв состояние, равное величинеCONST0(в программе она определена равной "0").

Если разряд 0 порта А равен нулю, то следующая команда пропускается (это проверяется и исполняется командой BTFSC PORTA,0). Если разряд 0 порта А равен единице, то выполняется следующая команда –MOVLW CONST1,которая заменяет содержимое регистраWвеличинойCONST1.

Следующая выполняемая команда MOVWF PORTB выведет содержимое регистра W в порт В. Будет выведено значение CONST0 или CONST1 в соответствии с тем, введен 0 в нулевом разряде порта А или 1.

Команда MOVWF Count1запомнит значение выведенной величины в ячейкеCount1,а следующие две командыMOVF PORTA,WиMOVWF Count2запомнят значение порта А в ячейкеCount2.

Команда GOTO ST1завершает цикл опроса – анализа – вывода передачей управления на начало этого цикла.