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

7.5.2 Написание исходного текста программы

Написание исходного текста программы осуществляется с помощью встроенного в MPLAB редактора Fditor. Для того, чтобы войти в оболочку редактора, необходимо выполнить следующие действия:

1. Осуществить запуск интегрированной среды MPLAB, выбрав в среде Windowsпиктограмму с надписью MPLAB;

2. Выбрать в главном меню пункт Option;

3. Выбрать в меню OptionопциюDevelopmentModeи в ней задать режим «MPLAB-SIMSimulator» и тип используемого процессора (например,PIC16F84);

4. Нажать кнопку RESET(запомнить внесенные изменения);

5. Выбрать в основном меню MPLAB пункт File;

6. Выбрав в меню FileопциюNew(CTRL+N), создать новый файл, при этом открывается диалоговое окно с предупреждением об отсутствии проекта и с вопросом о необходимости создания проекта. На этом этапе (до создания исходного файла) можно ответить “NO”.

7. С помощью кнопки смены инструментальной панели (swaptoolbar) MPLAB выбрать окно редактирования – встроке состояния (крайнее правое окно строки состояния) появляется название инструментальной панели –“Edit”. Эта инструментальная панель содержит кнопки, позволяющие создавать и редактировать исходный текст программы, написанной на языке Ассемблера. Возможности редактора аналогичны возможностям текстовых редакторов для WINDOWS.

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

Текст программы, реализующей алгоритм (рис. 7.13), может быть таким:

(EXAMPLE\IZMER.ASM)

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

LIST P=16F84 ; задать распечатку процессора

#INCLUDE <p16f84.inc> ; задать спецификации процессора

;задать слово конфигурации

__CONFIG _CP_OFF & _WDT_OFF & _PWRTE_ON & _HS_OSC

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

; ИСПОЛЬЗУЕМЫЕ В ПРОГРАММЕ КОНСТАНТЫ

INITA = B'00000010' ;направлени бит порта A

;RA0 - ВЫВОД,

;RA1 - ВВОД

INITB = B'00000000' ;направлени бит порта В

;RB0,...,RB7 - ВЫВОД

;***** ОЗУ ******************************************

CBLOCK 0x20

; ПАМЯТЬ ДАННЫХ

; БАЙТЫ BD0,...,BD4 РАСПОЛОЖЕНЫ В ПОСЛЕДОВАТЕЛЬНЫХ

; ЯЧЕЙКАХ ОЗУ (РЕГИСТРАХ), НАЧИНАЯ С

; ШЕСТНАДЦАТИРИЧНОГО АДРЕСА 20

BD0 ;БАЙТ ДАННЫХ

BD1 ;БАЙТ ДАННЫХ

BD2 ;БАЙТ ДАННЫХ

BD3 ;БАЙТ ДАННЫХ

BD4 ;БАЙТ ДАННЫХ

W_TEMP ; рабочие ячейки для запоминания

S_TEMP ; состояния рабочих

FSR_T ; регистров при

PCLH_T ; обработке прерывания

END

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

; Code sections

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

ORG 0x000 ; установить начальный адрес

CLRF PCLATH

GOTO START ; передать управление на

; начало программы

ORG 0x004 ; вектор обр. прерывания

MOVWF W_TEMP

SWAPF STATUS,W ; сохранить

MOVWF S_TEMP ; состояние

MOVF FSR,W ; рабочих

MOVWF FSR_T

MOVF PCLATH,W ; регистров

MOVWF PCLH_T

CLRF PCLATH ; процессора

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

;

;

;

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

MOVF FSR_T,W ; восстановить

MOVWF FSR

MOVF PCLH_T,W ; состояние

MOVWF PCLATH

SWAPF S_TEMP,W ; рабочих

MOVWF STATUS ; регистров

SWAPF W_TEMP,F

SWAPF W_TEMP,W ; процессора

Retfie ; выход из подпр

; обработки прер

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

START:

INIT:

BSF STATUS,RP0 ;установить Page 1 ОЗУ

BCF STATUS,RP1

BCF STATUS,IRP

MOVLW INITA ; установить

MOVWF TRISA ; направление

MOVLW INITB ; ввода/вывода

MOVWF TRISB

;УСТАНОВИТЬ TMR0 НА СЧЕТ ОТ ВНУТРЕННЕЙ ЧАСТОТЫ (ЗАПУСК)

BCF OPTION_REG,T0CS

;ПОДКЛЮЧИТЬ ПРЕДДЕЛИТЕЛЬ К WDT (ОТКЛЮЧИТЬ ОТ TMR0)

BSF OPTION_REG,PSA

BCF STATUS,RP0 ;установить Page 0 ОЗУ

BCF STATUS,RP1

BCF STATUS,IRP

BLOCK2:

BTFSC PORTA,1 ;PORTA,1 = 0?

; НЕТ, PORTA,1 = 1

GOTO BLOCK2

; PORTA,1 = 0

; ОЖИДАНИЕ ФРОНТА 0/1

BLOCK3:

BTFSS PORTA,1 ;PORTA,1 = 1?

; НЕТ, PORTA,1 = 0

GOTO BLOCK3

; PORTA,1 = 1

;СБРОСИТЬ СТРОБИРУЮЩИЙ СИГНАЛ НА ВЫХОДЕ RA0

BLOCK4:

BCF PORTA,0

; СБРОСИТЬ ТАЙМЕР TMR0 В СОСТ 0

BLOCK5:

CLRF TMR0

BLOCK6:

BTFSC PORTA,1 ;PORTA,1 = 0?

; НЕТ, PORTA,1 = 1

GOTO BLOCK6

; PORTA,1 = 0

; ОЖИДАНИЕ ФРОНТА 0/1

BLOCK7:

BTFSS PORTA,1 ;PORTA,1 = 1?

; НЕТ, PORTA,1 = 0

GOTO BLOCK7

; PORTA,1 = 1

; ПРОЧИТАТЬ НАКОПЛЕННЫЙ КОД ИЗ TMR0

BLOCK8:

MOVF TMR0,W

; ВЫДАТЬ НАКОПЛЕННЫЙ КОД В ПОРТ В

BLOCK9:

MOVWF PORTB

; УСТАНОВИТЬ СТРОБИР. ИМПУЛЬС НА ВЫХОДЕ RA0

BLOCK10:

BSF PORTA,0

GOTO BLOCK2

END

После набора текста файл необходимо запомнить на жестком диске в некоторой пользовательской папке (директории). Для этого в основном меню MPLAB нужно выбрать пункт File– Save As... и с помощью открывшегося диалогового окна задать имя папки для хранения файла и имя файла (обязательно с расширением.asm!) и сохранить файл.

Рассмотрим, что означают эти ассемблерные строки.

Строка

LIST P=16F877,

расположенная в начале текста, задает тип микроконтроллера, для которого будет производиться ассемблирование и получена распечатка кодов – "листинг" программы.

Следующая строка

#INCLUDE <p16f877.inc>,

включает в исходный текст программы файл p16f877.inc,в котором заданы предопределенные величины для микроконтроллера PIC 16f877.В среде MPLAB для каждого из поддерживаемых микроконтроллеров существует такой файл.

Строка

__CONFIG . . . .,

задает используемую конфигурацию микроконтроллера.

Далее заданы идентификаторы и значения используемых в программе постоянных величин и рабочих ячеек (регистров общего назначения – РОН).

Директивой EQU или = задаются значения определяемых идентификаторов.

Начало области РОН, используемых в программе, задано директивой

CBLOCK 0x20,

это означает, что описанные далее регистры будут расположены, начиная с шестнадцатиричного адреса 20.

Окончание области РОН задано директивой

ENDC

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

Директива ENDзавершает текст исходной программы.

Между директивами ORG и END расположен исходный текст программы, описывающей представленный на рис. 7.13 алгоритм. С целью установления соответствия между текстом программы и алгоритмом в тексте программы введены названия меток, соотвествующие номерам блоков алгоритма. Так, например, фрагмент текста расположенный после метки BLOCK7, реализует действия, описываемые блоком 7 алгоритма.

После этого для продолжения работы с программой необходимо создать проект. Проект можно создать, выбрав в главном меню подменю PROJECT и далее опцию New Project.... В открывшемся диалоге выбрать папку для хранения проекта и задать его имя. Для того чтобы избежать возможных осложнений в дальнейшей работе с проектом папка должна быть той же, в которой сохранен ассемблерный файл, а имя проекта должно совпадать с именем ассемблерного файла (с другим расширением –.pjt).

В результате диалога создается проект, в котором указан исходный ассемблерный файл и создается имя файла результата ассемблирования – файл с расширением .hex, который используется для дальнейшей отладки и записи в микроконтроллер с помощью программатора.

После этого можно сменить инструментальную строку (кнопка SwapToolbar) на окно работы с проектом (Projв крайнем правом окошке строки состояния) и выполнить ассемблирование исходного текста программы. Ассемблирование производится нажатием кнопкиBuildFullProjectинструментальной строки.

Результатом ассемблирования является получение файлов с расширением .COD, .LST, .HEX, .ERR,которые используются для дальнейшей отладки и записи в микроконтроллер с помощью программатора.

Кроме того, текст файла сообщений, предупреждений и ошибок (с расширением .ERR)появляется в виде текстового окна с именемBuildResultна экране.

Файл листинга (с расширением.LST) имеет следующий вид:

MPASM 02.30.07 Intermediate IZMER.ASM 8-5-2001 19:01:23 PAGE 1

LOC OBJECT CODE LINE SOURCE TEXT

VALUE

00001 ;*******************************************

00002

00003 LIST P=16F84 ; задать распечатку процессора

00004 #INCLUDE <p16f84.inc>; задать спецификац процессора

00001 LIST

00002 ; P16F84.INC Standard Header File, Version 2.00 Microchip Technology, Inc.

00136 LIST

00005 ;задать слово конфигурации

2007 3FF2 00006 __CONFIG _CP_OFF & _WDT_OFF & _PWRTE_ON & _HS_OSC

00007 ;****************************************

00008 ; ИСПОЛЬЗУЕМЫЕ В ПРОГРАММЕ КОНСТАНТЫ

00000002 00009 INITA = B'00000010' ;направлени бит порта A

00010 ;RA0 - ВЫВОД,

00011 ;RA1 - ВВОД

00000000 00012 INITB = B'00000000' ;направлени бит порта В

00013 ;RB0,...,RB7 - ВЫВОД

00014

00015 ;***** ОЗУ **********************************

00016

00017 CBLOCK 0x20

00018 ; ПАМЯТЬ ДАННЫХ

00019 ; БАЙТЫ BD0,...,BD4 РАСПОЛОЖЕНЫ В ПОСЛЕДОВАТЕЛЬНЫХ

00020 ; ЯЧЕЙКАХ ОЗУ (РЕГИСТРАХ), НАЧИНАЯ С

00021 ; ШЕСТНАДЦАТИРИЧНОГО АДРЕСА 20

00022

00000020 00023 BD0 ;БАЙТ ДАННЫХ

00000021 00024 BD1 ;БАЙТ ДАННЫХ

00000022 00025 BD2 ;БАЙТ ДАННЫХ

00000023 00026 BD3 ;БАЙТ ДАННЫХ

00000024 00027 BD4 ;БАЙТ ДАННЫХ

00028

00000025 00029 W_TEMP ; рабочие ячейки для запоминания

00000026 00030 S_TEMP ; состояния рабочих

00000027 00031 FSR_T ; регистров при

00000028 00032 PCLH_T ; обработке прерывания

00033 ENDC

00034

00035

00036 ******************************************

00037 ; Code sections

00038

00039

0000 00040 ORG 0x000 ; установить начальный адрес

0000 018A 00041 CLRF PCLATH

0001 2815 00042 GOTO START ; передать управление на

00043 ; начало программы

00044

0004 00045 ORG 0x004 ; вектор обр. прерывания

0004 00A5 00046 MOVWF W_TEMP

0005 0E03 00047 SWAPF STATUS,W ; сохранить

0006 00A6 00048 MOVWF S_TEMP ; состояние

0007 0804 00049 MOVF FSR,W ; рабочих

0008 00A7 00050 MOVWF FSR_T

MPASM 02.30.07 Intermediate IZMER.ASM 8-5-2001 19:01:23 PAGE 2

LOC OBJECT CODE LINE SOURCE TEXT

VALUE

0009 080A 00051 MOVF PCLATH,W ; регистров

000A 00A8 00052 MOVWF PCLH_T

000B 018A 00053 CLRF PCLATH ; процессора

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

00055 ;

00057 ;

00058 ;ВЫХОД ИЗ ПП ОБРАБОТКИ ПРЕРЫВАНИЯ

000C 0827 00059 MOVF FSR_T,W ; восстановить

000D 0084 00060 MOVWF FSR

000E 0828 00061 MOVF PCLH_T,W ; состояние

000F 008A 00062 MOVWF PCLATH

0010 0E26 00063 SWAPF S_TEMP,W ; рабочих

0011 0083 00064 MOVWF STATUS ; регистров

0012 0EA5 00065 SWAPF W_TEMP,F

0013 0E25 00066 SWAPF W_TEMP,W ; процессора

0014 0009 00067 retfie ; выход из подпр обр прер

0015 00070 START:

0015 00071 INIT:

0015 1683 00072 BSF STATUS,RP0 ;установить Page 1 ОЗУ

0016 1303 00073 BCF STATUS,RP1

0017 1383 00074 BCF STATUS,IRP

0018 3002 00075 MOVLW INITA ; установить

Message[302]: Register in operand not in bank 0. Ensure that bank bits are correct.

0019 0085 00076 MOVWF TRISA ; направление

001A 3000 00077 MOVLW INITB ; ввода/вывода

Message[302]: Register in operand not in bank 0. Ensure that bank bits are correct.

001B 0086 00078 MOVWF TRISB

00079 ;УСТАНОВИТЬ TMR0 НА СЧЕТ ОТ ВНУТР ЧАСТОТЫ (ЗАПУСК)

Message[302]: Register in operand not in bank 0. Ensure that bank bits are correct.

001C 1281 00080 BCF OPTION_REG,T0CS

00081 ;ПОДКЛЮЧИТЬ ПРЕДДЕЛИТЕЛЬ К WDT (ОТКЛЮЧИТЬ ОТ TMR0)

Message[302]: Register in operand not in bank 0. Ensure that bank bits are correct.

001D 1581 00082 BSF OPTION_REG,PSA

00083

001E 1283 00084 BCF STATUS,RP0 ;установить Page 0 ОЗУ

001F 1303 00085 BCF STATUS,RP1

0020 1383 00086 BCF STATUS,IRP

0021 00087 BLOCK2:

0021 1885 00088 BTFSC PORTA,1 ;PORTA,1 = 0?

00089 ; НЕТ, PORTA,1 = 1

0022 2821 00090 GOTO BLOCK2

00091 ; PORTA,1 = 0

00092 ; ОЖИДАНИЕ ФРОНТА 0/1

0023 00093 BLOCK3:

0023 1C85 00094 BTFSS PORTA,1 ;PORTA,1 = 1?

00095 ; НЕТ, PORTA,1 = 0

0024 2823 00096 GOTO BLOCK3

00097 ; PORTA,1 = 1

00098 ;СБРОСИТЬ СТРОБИРУЮЩИЙ СИГНАЛ НА ВЫХОДЕ RA0

0025 00099 BLOCK4:

MPASM 02.30.07 Intermediate IZMER.ASM 8-5-2001 19:01:23 PAGE 3

LOC OBJECT CODE LINE SOURCE TEXT

VALUE

0025 1005 00100 BCF PORTA,0

00101 ; СБРОСИТЬ ТАЙМЕР TMR0 В СОСТ 0

0026 00102 BLOCK5:

0026 0181 00103 CLRF TMR0

0027 00104 BLOCK6:

0027 1885 00105 BTFSC PORTA,1 ;PORTA,1 = 0?

00106 ; НЕТ, PORTA,1 = 1

0028 2827 00107 GOTO BLOCK6

00108 ; PORTA,1 = 0

00109 ; ОЖИДАНИЕ ФРОНТА 0/1

0029 00110 BLOCK7:

0029 1C85 00111 BTFSS PORTA,1 ;PORTA,1 = 1?

00112 ; НЕТ, PORTA,1 = 0

002A 2829 00113 GOTO BLOCK7

00114 ; PORTA,1 = 1

00115 ; ПРОЧИТАТЬ НАКОПЛЕННЫЙ КОД ИЗ TMR0

002B 00116 BLOCK8:

002B 0801 00117 MOVF TMR0,W

00118 ; ВЫДАТЬ НАКОПЛЕННЫЙ КОД В ПОРТ В

002C 00119 BLOCK9:

002C 0086 00120 MOVWF PORTB

00121 ; УСТАНОВИТЬ СТРОБИР. ИМПУЛЬС НА ВЫХОДЕ RA0

002D 00122 BLOCK10:

002D 1405 00123 BSF PORTA,0

002E 2821 00124 GOTO BLOCK2

00125

00126 END

MPASM 02.30.07 Intermediate IZMER.ASM 8-5-2001 19:01:23 PAGE 4

SYMBOL TABLE

LABEL VALUE

BD0 00000020

BD1 00000021

BD2 00000022

BD3 00000023

BD4 00000024

BLOCK10 0000002D

BLOCK2 00000021

BLOCK3 00000023

BLOCK4 00000025

BLOCK5 00000026

BLOCK6 00000027

BLOCK7 00000029

BLOCK8 0000002B

BLOCK9 0000002C

C 00000000

DC 00000001

EEADR 00000009

EECON1 00000088

EECON2 00000089

EEDATA 00000008

EEIE 00000006

EEIF 00000004

F 00000001

FSR 00000004

FSR_T 00000027

GIE 00000007

INDF 00000000

INIT 00000015

INITA 00000002

INITB 00000000

INTCON 0000000B

INTE 00000004

INTEDG 00000006

INTF 00000001

IRP 00000007

NOT_PD 00000003

NOT_RBPU 00000007

NOT_TO 00000004

OPTION_REG 00000081

PCL 00000002

PCLATH 0000000A

PCLH_T 00000028

PORTA 00000005

PORTB 00000006

PS0 00000000

PS1 00000001

PS2 00000002

PSA 00000003

RBIE 00000003

RBIF 00000000

RD 00000000

RP0 00000005

RP1 00000006

MPASM 02.30.07 Intermediate IZMER.ASM 8-5-2001 19:01:23 PAGE 5

SYMBOL TABLE

LABEL VALUE

START 00000015

STATUS 00000003

S_TEMP 00000026

T0CS 00000005

T0IE 00000005

T0IF 00000002

T0SE 00000004

TMR0 00000001

TRISA 00000085

TRISB 00000086

W 00000000

WR 00000001

WREN 00000002

WRERR 00000003

W_TEMP 00000025

Z 00000002

_CP_OFF 00003FFF

_CP_ON 0000000F

_HS_OSC 00003FFE

_LP_OSC 00003FFC

_PWRTE_OFF 00003FFF

_PWRTE_ON 00003FF7

_RC_OSC 00003FFF

_WDT_OFF 00003FFB

_WDT_ON 00003FFF

_XT_OSC 00003FFD

__16F84 00000001

MEMORY USAGE MAP ('X' = Used, '-' = Unused)

0000 : XX--XXXXXXXXXXX XXXXXXXXXXXXXXX XXXXXXXXXXXXXX- ---------

2000 : -------X------ --------------- --------------- ----------

All other memory blocks unused.

Program Memory Words Used: 45

Program Memory Words Free: 979

Errors : 0

Warnings : 0 reported, 0 suppressed

Messages : 4 reported, 0 suppressed

В этом тексте первые три страницы (PAGE1,…,PAGE3) содержат машинные и мнемонические коды программы, а последующие страницы (PAGE4,PAGE5) – определения всех идентификаторов, стандартных для специфированного микроконтроллера и введенных программистом.

Формат текста имеет следующий вид:

В первой строке каждой страницы расположены имя программы и версия, дата, время, и номер страницы.

В первом столбце представлен адрес ячейки памяти, в которой размещается код. Во втором столбце отображается 32-разрядное значение символов, созданных директивами Ассемблера SET,EQU,VARIABLE,CONSTANT,CBLOCK.

В третьем столбце размещен исполняемый код машинной команды.

В четвертом столбце представлен номер строки исходного теста.

Остальная часть строки отведена для исходного текста, из которого сгенерирован машинный код.

В тексте листинга между исходными строками размещаются также сообщения об ошибках, предупреждениях и сообщениях. Они относятся к следующей за строкой сообщения исходной строке.

В таблице идентификаторов в алфавитном порядке перечислены все символические именастандартные для специфицированного микроконтроллера и определенные в транслированной программе.

На последней странице листинга приведена карта заполнения программной памяти, количество использованных и свободных слов программной памяти и количество сформированных Ассемблером сообщений об ошибках и предупреждений по типам.

Карта заполнения памяти дает графическое представление использования памяти.

'X' отмечает используемые слова;

'- ' отмечает слова, которые не используются программой.

Карта памяти не создается, если объектный файл не сгенерирован.

Ассемблер по умолчанию генерирует файл ошибок с именем расширением .ERR. Этот файл полезен при отладке программы. Формат сообщений в файле ошибок имеет такой вид:

<type> [<number>] < file > < line > <description>

< тип > [<номер >] < файл > <строка > < описание >

Например:

Message[302] C:\PROGRA~1\MPLAB\EXAMPLE\IZMER.ASM 76 : Register in operand not in bank 0. Ensure that bank bits are correct.

Сообщения об ошибках вписываются также в листинг программы непосредственно после ошибочной строки в сокращенном виде, без указания имени файла и номера строки. Так, например, приведенное сообщение, относящееся к строке 76, в листинге выглядит следующим образом:

Message[302]: Register in operand not in bank 0. Ensure that bank bits are correct.

В рассмотренной программе на период следования импульсов наложены ограничения (7.1), при которых максимальное значение периода составляет не более 255 единиц (емкость регистра таймера/счетчика). Увеличения возможной величины этого кода можно добиться каскадным подключением программных счетчиков.