Опубликован: 25.07.2003 | Уровень: для всех | Доступ: платный | ВУЗ: Национальный исследовательский ядерный университет «МИФИ»
Лекция 12:

Разработка программного обеспечения для PIC-микроконтроллеров

< Лекция 11 || Лекция 12: 12345 || Лекция 13 >

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

< Лекция 11 || Лекция 12: 12345 || Лекция 13 >
Татьяна Фёдорова
Татьяна Фёдорова
Виктор Радкевич
Виктор Радкевич

Ответил на все тесты и сдал экзамен по курсу "Основы микропроцессорной техники". Результаты на сайе в зачетке не отображаются. Синхронизацию выполнял. 

Ирина Ткаченко
Ирина Ткаченко
Россия, Москва
Николай Ткаченко
Николай Ткаченко
Россия