Добавил:
Upload Опубликованный материал нарушает ваши авторские права? Сообщите нам.
Вуз: Предмет: Файл:
ОМТ (на редактировании).doc
Скачиваний:
31
Добавлен:
17.05.2015
Размер:
3.86 Mб
Скачать

Порядок выполнения работы

В данной лабораторной работе необходимо разработать и отладить программу, реализующую передачу данных между микроконтроллером PIC16F873A и персональным компьютером. Конкретное задание выдается преподавателем.

В качестве примера рассмотрим следующее задание. В исходном состоянии все светодиоды погашены, передача по USART отсутствует. После ввода в Hyher Terminalе номера светодиода (с первого по шестой) загорается соответствующий светодиод (с HL1 по HL2) на печатной плате макета. При вводе цифры «ноль» все светодиоды гаснут. При нажатии одной из кнопок с SA2 по SA6 на печатной плате в окне Hyher Terminalа высвечивается ее номер.

Постановка задачи

Представим исходную словесную форму в виде таблиц.

Таблица 4.1

Таблица включения светодиодов

Принимаемые символы

HL1

HL2

HL3

HL4

HL5

HL6

1

1

~

~

~

~

~

2

~

1

~

~

~

~

3

~

~

1

~

~

~

4

~

~

~

1

~

~

5

~

~

~

~

1

~

6

~

~

~

~

~

1

0

0

0

0

0

0

0

Любой другой символ

~

~

~

~

~

~

Таблица 4.2

Таблица передаваемых символов

SA2

SA3

SA4

SA5

SA6

Передаваемые символы

1

1

1

1

1

-

0

1

1

1

1

2

1

0

1

1

1

3

1

1

0

1

1

4

1

1

1

0

1

5

1

1

1

1

0

6

Разработка алгоритма программы

Укрупненный алгоритм основной программы приведен на рис. 4.5. Алгоритм подпрограммы передачи символа приведен на рис. 4.6, а драйвера прерываний от приемника на рис. 4.7.

Рис. 4.5. Блок-схема алгоритма основной программы

В первом блоке алгоритма подключается текстовый файл с символьными обозначениями РСН. Присваиваются символьные наименования трем регистрам общего назначения, первый из которых предназначен для хранения принятого символа, а еще два для организации программного стека.

Порты А и С, к которым подключены светодиоды, настраиваются на вывод информации, а порт В, к которому подключены контакты кнопок, – на ввод. К выводам порта В подключаются внутренние подтягивающие резисторы.

Разрешается прерывание от приемника USART. USART настраивается на высокоскоростной асинхронный режим работы со скоростью передачи 19200 бит/с.

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

В блоках с двенадцатого по двадцать пятый анализируется принятая через USART информация. При обнаружении символа соответствующего цифрам от 1-го до 6-ти осуществляется включение соответствующего светодиода, а при обнаружении символа «0» – гашение всех светодиодов.

Далее программа возвращается к опросу состояния кнопок.

Рис. 4.6. Блок-схема алгоритма подпрограммы передачи символа

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

Рис. 4.7. Блок-схема алгоритма драйвера прерываний

Обработка прерываний, вызываемых приемником USART производится в блоках с тридцатого по тридцать третий. В тридцать первом блоке проверяется отсутствие ошибок, если ошибок нет, то принятый символ сохраняется в ОЗУ, если есть ошибки, то принятый символ игнорируется.

Необходимо обратить внимание на то, что в подпрограмме драйвера прерываний изменяется содержимое рабочего регистра W и флагов признаков, располагающихся в регистре STATUS. Поскольку вызов прерывания происходит в произвольный момент времени, такое изменение может вызвать сбой в работе основной программы. Для предотвращения этого содержимое регистров W и STATUS в начале обработчика прерываний сохраняется в ОЗУ, а к конце считывается обратно.

Написание текста программы на языке Ассемблер

Исходный текст программы приведен далее:

;предварительные настройки

#include p16f873a.inc

__CONFIG _HS_OSC ;

RCV_S: SET H'20' ;принятый символ

STEK_0: SET H'21' ;программный стек данных

STEK_1: SET H'22' ;|

ORG H'000' ;вектор сброса

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

ORG H'004' ;вектор прерывания

GOTO INT ;переход к обработчику прерываний

;начало основной программы

BEGIN: BCF STATUS,RP1 ;выбираем банк регистров 1

BSF STATUS,RP0 ;|

;задаем режимы работы параллельных портов

MOVLW B'00001110' ;задаем аналоговый вход PORTA,0

MOVWF ADCON1 ;программируем регистр АЦП 1

MOVLW B'00000001' ;PORTA, 7-1 выходы, PORTA, 0 вход

MOVWF TRISA ;программируем регистр направления PORTA

MOVWF OPTION_REG;включаем подтягивающие резисторы PORTB

MOVLW B'11111111' ;PORTB, 7-0 входы

MOVWF TRISB ;программируем регистр направления PORTB

MOVLW B'10000000' ;PORTC, 7 вход, PORTC, 6-0 выходы

MOVWF TRISC ;программируем регистр направления PORTC

;разрешаем прерывания от приемника USART

MOVLW B'11000000' ;биты GIE и PEIE = 1

MOVWF INTCON ;программируем регистр управления прерываниями

BSF PIE1,RCIE ;разрешение прерываний от приемника USART

;задаем режим работы последовательного порта

MOVLW D'12' ;скорость передачи по USART 19200

MOVWF SPBRG ;программируем регистр скорости обмена

MOVLW B'00100100' ;разрешение передачи, высокоскоростной асинхронный режим

MOVWF TXSTA ;программируем регистр статуса передатчика

BCF STATUS,RP1 ;выбираем банк регистров 0

BCF STATUS,RP0 ;|

MOVLW B'10010000' ;включение USART, разрешение приема

MOVWF RCSTA ;программируем регистр статуса приемника

;проверка кнопок и передача символов

M10: BCF STATUS,RP1 ;выбираем банк регистров 0

BCF STATUS,RP0 ;|

BTFSC PORTB,5 ;скачек,если нажата кнопка SA2

GOTO M20 ;переход к опросу SA3

MOVLW A'2' ;загружаем в аккумулятор ASCII символ "2"

CALL TSMIT ;вызов подпрограммы передачи посылки

M20: BTFSC PORTB,4 ;скачек,если нажата кнопка SA3

GOTO M30 ;переход к опросу SA4

MOVLW A'3' ;загружаем в аккумулятор ASCII символ "3"

CALL TSMIT ;вызов подпрограммы передачи посылки

M30: BTFSC PORTB,2 ;скачек,если нажата кнопка SA4

GOTO M40 ;переход к опросу SA5

MOVLW A'4' ;загружаем в аккумулятор ASCII символ "4"

CALL TSMIT ;вызов подпрограммы передачи посылки

M40: BTFSC PORTB,1 ;скачек,если нажата кнопка SA5

GOTO M50 ;переход к опросу SA6

MOVLW A'5' ;загружаем в аккумулятор ASCII символ "5"

CALL TSMIT ;вызов подпрограммы передачи посылки

M50: BTFSC PORTB,0 ;скачек,если нажата кнопка SA6

GOTO M60 ;переход к ожиданию и приему посылок

MOVLW A'6' ;загружаем в аккумулятор ASCII символ "6"

CALL TSMIT ;вызов подпрограммы передачи посылки

;ожидание и прием символа

M60: MOVLW A'1' ;1 сравниваем

XORWF RCV_S,W ;с принятым символом

BTFSC STATUS,Z ;скачек, если не равно

BSF PORTA,5 ;включаем HL1

MOVLW A'2' ;2 сравниваем

XORWF RCV_S,W ;с принятым символом

BTFSC STATUS,Z ;скачек, если не равно

BSF PORTC,0 ;включаем HL2

MOVLW A'3' ;3 сравниваем

XORWF RCV_S,W ;с принятым символом

BTFSC STATUS,Z ;скачек, если не равно

BSF PORTC,1 ;включаем HL3

MOVLW A'4' ;4 сравниваем

XORWF RCV_S,W ;с принятым символом

BTFSC STATUS,Z ;скачек, если не равно

BSF PORTC,3 ;включаем HL4

MOVLW A'5' ;5 сравниваем

XORWF RCV_S,W ;с принятым символом

BTFSC STATUS,Z ;скачек, если не равно

BSF PORTC,4 ;включаем HL5

MOVLW A'6' ;6 сравниваем

XORWF RCV_S,W ;с принятым символом

BTFSC STATUS,Z ;скачек, если не равно

BSF PORTC,5 ;включаем HL6

MOVLW A'0' ;0 сравниваем

XORWF RCV_S,W ;с принятым символом

BTFSS STATUS,Z ;скачек, если равно

GOTO M10 ;возврат к началу программы если нет

BCF PORTA,5 ;гасим HL1

CLRF PORTC ;гасим остальные светодиоды

GOTO M10 ;возврат к началу программы если нет

;подпрограмма передачи символа

TSMIT: MOVWF TXREG ;инициируем передачу

NOP

T10: BTFSS PIR1,TXIF ;скачек,если буфер освободился

GOTO T10 ;иначе, ждем освобождения буфера

BCF PIR1,TXIF ;сброс флага освобождения буфера

RETURN ;возврат в основную программу

;драйвер прерываний от приемника USART

INT: MOVWF STEK_0 ;сохраняем аккумулятор в ОЗУ

MOVF STATUS,W ;сохраняем регистр статуса в ОЗУ

MOVWF STEK_1 ;|

BTFSC RCSTA,OERR;проверка ошибки переполнения буфера

GOTO I10 ;переход, если есть ошибка

BTFSC RCSTA,FERR ;проверка ошибки кадра

GOTO I20 ;переход, если есть ошибка

MOVF RCREG,W ;считываем принятый символ

MOVWF RCV_S ;и сохраняем его в ОЗУ

GOTO I30 ;переход к выходу из драйвера прерывания

I10: MOVF RCREG,W ;очистка буфера

MOVF RCREG,W ;|

GOTO I30 ;переход к выходу из драйвера прерывания

I20: BCF RCSTA,CREN;сброс флага ошибки кадра

BSF RCSTA,CREN;|

I30: MOVF STEK_1,W ;извлекаем регистр статуса из ОЗУ

MOVWF STATUS ;|

MOVF STEK_0,W ;извлекаем аккумулятор из ОЗУ

RETFIE ;возврат в основную программу

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

Трансляция текста программы в машинные коды

Процесс создания нового проекта и компиляции программы подробно описан в лабораторной работе 1.

Тестирование и отладка

На этапе отладки программы необходимо выявить и устранить все возникшие на предыдущих этапах ошибки. Описание процесса программирования микроконтроллера и запуска программы приведен в лабораторной работе 1.

Сопровождение

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