Основы микропроцессорной техники

Раздел 6. Проектирование устройств на микроконтроллерах


«Структура курса | Раздел 1 | Раздел 2 | Раздел 3 | Раздел 4 | Раздел 5 | Раздел 6 | Раздел 7 | Глава 8 | Дополнения

Раздел 6 - Страницы: «1 | 2 | 3 | 4 | 5 | 6 | 7

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
; OPTION
; TMR0
; INTF
; T0IF
PCL
STATUS
RP0
PORTA
PORTB
TRISA
TRISB
W
F
TEMPA
TEMPB
COUNT1
COUNT2
COUNT3
EQU
EQU
EQU
EQU
EQU
EQU
EQU
EQU
EQU
EQU
EQU
EQU
EQU
EQU
EQU
EQU
EQU
EQU
EQU
0x0B
0x81
0x01
1
5
0x02
0x03
5
0x05
0x06
0x05
0x06
0
1
0x0C
0x0D
0x0E
0x0F
0x10
;************************************************* *****
; * определения меток замены текста
;************************************************* *****
# DEFINE
# DEFINE
# DEFINE
# DEFINE
# DEFINE
# DEFINE
# DEFINE
# DEFINE
# DEFINE
# DEFINE
# DEFINE
# DEFINE
# DEFINE
# DEFINE
Z
BA1
VD2
SA1
SA2
SB1
SB2
HL1_A
HL1_B
HL1_C
HL1_D
HL1_E
HL1_F
HL1_G
STATUS, 2
PORTA, 0
PORTA, 1
PORTA, 2
PORTA, 3
PORTA, 4
PORTB, 0
PORTB, 1
PORTB, 2
PORTB, 3
PORTB, 4
PORTB, 5
PORTB, 6
PORTB, 7
; бит нулевого результата
; динамик BA1
; светодиод VD2
; тумблер SA1
; тумблер SA2
, кнопка SB1
, кнопка SB2
; индикатор-сегмент A
; индикатор-сегмент B
; индикатор-сегмент С
; индикатор-сегмент D
; индикатор-сегмент E
; индикатор-сегмент F
; индикатор-сегмент G
;************************************************* *****
; * Программа, выполняемая
;************************************************* *****
ORG

GOTO
ORG
0x000

BEGIN
0x005
; установка начального адреса по
; сбросу
; переход на начало программы
; установка начального адреса
; размещения программы
BEGIN
CALL INIT_PORTS ; вызов подпрограммы
; инициализации портов МК
;************************************************* ****
; * программа пользователя
;
;************************************************* ****
;
INIT_PORTS

MOVLW
MOVWF
MOVWF
BSF
MOVLW
MOVWF

MOVLW
MOVWF

BCF
RETURN
;
END


0xFF
PORTA
PORTB
STATUS, RP0
0x1C
TRISA

0x01
TRISB

STATUS, RP0
; подпрограмма инициализации
; портов
; установка линий портов
; A и B в единичный
; состояние
; переход на банк 1
; настройка линий RA0 и
; RA1 порта A на вывод --
; других - на ввод
; настройки линии RB0
; порта B на ввод --
; других - на вывод
возврат в банк 0
возврат из подпрограммы

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

Рассмотрим работу этой программы. Сначала она указывает ассемблера тип используемого МК и систему счисления по умолчанию. Дальнейшие ассемблерные директивы 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. При написании учебных задач будет по возможности использоваться метод структурного программирования, при котором приложение строится из некоторого набора программных модулей, каждый из которых реализует определенную процедуру обработки данных. При этом каждый из программных модулей имеет только одну точку входа и одну точку выхода. Введены один раз программные модули могут использоваться под своим именем в других приложениях.


«Структура курса Раздел 6 - Страницы:« 1 | 2 | 3 | 4 | 5 | 6 | 7 »