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

КУРС ЛЕКЦИЙ ПО МИКРОПРОЦЕССОРНОЙ ТЕХНИКЕ. Курс лекций по микропроцессорной технике. Введение


Скачать 1.34 Mb.
НазваниеКурс лекций по микропроцессорной технике. Введение
АнкорКУРС ЛЕКЦИЙ ПО МИКРОПРОЦЕССОРНОЙ ТЕХНИКЕ.doc
Дата16.03.2017
Размер1.34 Mb.
Формат файлаdoc
Имя файлаКУРС ЛЕКЦИЙ ПО МИКРОПРОЦЕССОРНОЙ ТЕХНИКЕ.doc
ТипКурс лекций
#3832
страница21 из 22
1   ...   14   15   16   17   18   19   20   21   22

6.3. Практика программирования PIC-микроконтроллеров

6.3.1. Описание лабораторного макета


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

Макет питается от источника стабилизированного напряжения +5В. Тактовая частота МК задается RC-цепью и составляет около 2 МГц. К линии RA0 порта А подключен биполярный транзистор в ключевом режиме, нагруженный на динамик ВА1. Звучание динамика обеспечивается подачей на выход RA0 изменяющегося сигнала в звуковом диапазоне. К линии RA1 порта А подключен светодиод VD2, светящийся при высоком напряжении на выходе. Тумблеры SA1 и SA2, а также кнопки SB1 и SB2 подключены, соответственно, к линиям RA2 и RA3 порта А, а также к линии RA4 порта А и линии RB0 порта В. Исходное состояние кнопок – разомкнутое, что обеспечивает подачу на соответствующие входы МК высокого уровня сигнала.

Линии RB1 – RB7 порта B обслуживают семисегментный индикатор HL1 с общим анодом. Поэтому свечение сегмента индикатора обеспечивается при низком уровне сигнала на соответствующем выходе порта B. Макет также содержит средства программирования и связи с компьютером, которые на схеме не показаны.


Рис. 6.3.  Схема лабораторного макета.

6.3.2. Инициализация микроконтроллера макета


Прежде чем переходить к созданию простейших пользовательских программ, необходимо описать используемые в дальнейшем переменные и настроить МК на работу с выбранным макетом. С этой целью мы напишем и подробно рассмотрим листинг исходной программы init.asm, в состав которой будут включаться все остальные программы пользователя.

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

;*листинг исходной программы

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

LIST P=16C84, R=HEX ;директива, определяющая тип

;процессора и систему счисления

;по умолчанию

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

;*описание используемых переменных и назначения адресов

;*ячеек для хранения переменных пользователя

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

; INTCON EQU 0x0B

; OPTION EQU 0x81

; TMR0 EQU 0x01

; INTF EQU 1

; T0IF EQU 5

PCL EQU 0x02

STATUS EQU 0x03

RP0 EQU 5

PORTA EQU 0x05

PORTB EQU 0x06

TRISA EQU 0x05

TRISB EQU 0x06

W EQU 0

F EQU 1

TEMPA EQU 0x0C

TEMPB EQU 0x0D

COUNT1 EQU 0x0E

COUNT2 EQU 0x0F

COUNT3 EQU 0x10

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

;*определение меток замены текста

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

#DEFINE Z STATUS,2 ;бит нулевого результата

#DEFINE BA1 PORTA,0 ;динамик BA1

#DEFINE VD2 PORTA,1 ;светодиод VD2

#DEFINE SA1 PORTA,2 ;тумблер SA1

#DEFINE SA2 PORTA,3 ;тумблер SA2

#DEFINE SB1 PORTA,4 ;кнопка SB1

#DEFINE SB2 PORTB,0 ;кнопка SB2

#DEFINE HL1_A PORTB,1 ;индикатор-сегмент A

#DEFINE HL1_B PORTB,2 ;индикатор-сегмент B

#DEFINE HL1_C PORTB,3 ;индикатор-сегмент C

#DEFINE HL1_D PORTB,4 ;индикатор-сегмент D

#DEFINE HL1_E PORTB,5 ;индикатор-сегмент D

#DEFINE HL1_F PORTB,6 ;индикатор-сегмент E

#DEFINE HL1_G PORTB,7 ;индикатор-сегмент F

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

;*исполняемая программа

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

ORG 0x000 ;установка начального адреса по

;сбросу

GOTO BEGIN ;переход на начало программы

ORG 0x005 ;установка начального адреса

;размещения программы

BEGIN

CALL INIT_PORTS ;вызов подпрограммы

;инициализации портов МК

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

;*программа пользователя

;

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

;

INIT_PORTS ;подпрограмма инициализации

;портов

MOVLW 0xFF ;установка линий портов

MOVWF PORTA ;A и B в единичное

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

BSF STATUS,RP0 ;переход на банк 1

MOVLW 0x1C ;настройка линий RA0 и

MOVWF TRISA ;RA1 порта A на вывод –

;остальных – на ввод

MOVLW 0x01 ;настройка линии RB0

MOVWF TRISB ;порта B на ввод -

;остальных – на вывод

BCF STATUS,RP0 ;возврат в банк 0

RETURN ;возврат из подпрограммы

;

END ;конец программы

Листинг 12.1. Программа init.asm

Рассмотрим работу этой программы. Вначале она указывает ассемблеру тип используемого МК и систему счисления по умолчанию. Идущие далее ассемблерные директивы EQU определяют ассемблерные константы, используемые в этой и последующих программах. Они позволяют использовать в тексте программы более удобные мнемонические метки, привязанные к структуре конкретного МК, вместо корректных, но более сложных ассемблерных выражений. Указатели TEMPA, TEMPB, COUNT1 и COUNT2 назначают адреса ячеек памяти для хранения промежуточных данных (текущих состояний, переменных циклов и т.п.).

Ассемблерные директивы #define задают строку, замещающую соответствующую метку, каждый раз, когда та будет встречаться в исходном тексте. В нашем случае эти директивы позволяют использовать символические имена, привязанные к схеме макета, вместо физических адресов соответствующих разрядов портов и регистров. При этом необходимо иметь в виду, что символы, которые определены директивой #DEFINE, не могут быть просмотрены симулятором. Поэтому для просмотра необходимо использовать физические адреса портов и регистров.

Директива ORG 0x00 устанавливает стартовый адрес программного кода равным 0, т.е. соответствующим начальному состоянию счетчика команд МК после сброса. Команда GOTO BEGIN вместе с ассемблерной директивой ORG 0x005 и меткой BEGIN обеспечивают переход на адрес памяти программ 0x005, начиная с которого и размещается основная часть программы. Это необходимо для того, чтобы обойти адрес 0x004, используемый в качестве вектора прерывания, и тем самым зарезервировать его для возможных будущих применений.

Затем с помощью команды CALL INIT_PORTS производится вызов подпрограммы инициализации портов. Вначале подпрограмма инициализации устанавливает в высокое (единичное) состояние выходные триггеры данных. Эта операция рекомендуется разработчиком МК для того, чтобы исключить неопределенность в состояниях регистров портов. Затем командой BSF STATUS,RP0 производится переключение на банк 1 памяти данных, где расположены регистры управления направлением передачи информации TRISA и TRISB. С помощью команд MOVLW 0x1C и MOVWF TRISA линии RA0 и RA1 порта A настраиваются на вывод, а остальные – на ввод. Команды MOVLW 0x01 и MOVWF TRISB настраивают линию RB0 порта B на ввод, а остальные – на вывод. С помощью команды BCF STATUS,RP0 производится возврат в банк 0, где располагаются необходимые для работы программы регистры и порты.

Поскольку в процессе работы с макетом перенастройка портов не производится, и введенных переменных достаточно для работы всех рассматриваемых учебных задач, они будут далее рассматриваться включенными по умолчанию в состав исходной программы init.asm. При написании учебных задач будет по возможности использоваться метод структурного программирования, при котором прикладная программа строится из некоторого набора программных модулей, каждый из которых реализует определенную процедуру обработки данных. При этом каждый из программных модулей имеет только одну точку входа и одну точку выхода. Введенные однажды программные модули могут использоваться под своим именем в других прикладных программах.
1   ...   14   15   16   17   18   19   20   21   22


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