Работа №6 цифровые системы на базе микроконтроллера atmega103: Организация последовательного обмена данными 


Мы поможем в написании ваших работ!



ЗНАЕТЕ ЛИ ВЫ?

Работа №6 цифровые системы на базе микроконтроллера atmega103: Организация последовательного обмена данными



Цель работы: изучение функционирования последовательных портов микроконтроллера ATmega103, получение практических навыков программирования микроконтроллера для реализация последовательного обмена.

Введение

Микроконтроллер ATmega103 имеет два последовательных порта: SPI (Serial Peripheral Interface) и UART(Universal Asynchronous Receiver and Transmitter).

Последовательный периферийный интерфейс - SPI

Последовательный интерфейс SPI обеспечивает высокоскоростной синхронный обмен данными. Основные характеристики интерфейса:

· Дуплексный 3-проводный синхронный обмен данными;

· Режим работы ведущий/ведомый;

· Обмен с передаваемыми первыми старшим или младшим битами;

· Четыре программируемые скорости обмена данными;

· Флаг прерывания по окончании передачи;

· Активизация из Idle режима (только в режиме ведомого).

Соединение между ведущим и ведомым процессорами с использованием SPI интерфейса, показано на рисунке  6.1. Вывод PB1(SCK) является выходом тактового сигнала ведущего микроконтроллера и входом тактового сигнала ведомого. По записи ведущим процессором данных в SPI регистр начинает работать тактовый генератор SPI и записанные данные сдвигаются через вывод выхода РВ2 (MOSI) ведущего микроконтроллера на вывод РВ2 (MOSI) входа ведомого микроконтроллера. После сдвига одного байта тактовый генератор SPI останавливается, устанавливается флаг окончания передачи (SPIF). Если в регистре SPCR установлен бит разрешения прерывания SPI (SPIE), то произойдет запрос прерывания. Вход выбора ведомого РВ0 (SS#), для выбора индивидуального SPI устройства в качестве ведомого, устанавливается в низкий уровень. При установке высокого уровня на выводе РВ0 (SS#) вывод РВ2 (MOSI) может быть использован в качестве вывода входа. Режим ведущий/ведомый может быть установлен и программным способом установкой или очисткой бита MSTR в регистре управления SPI.

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

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

При разрешенном SPI-обмене направления данных на выводах MOSI, MISО, SCK и SS# настраиваются в соответствии со следующей таблицей:

 

Таблица 6.1 – Настойка  выводов SPI

Вывод Направление ведущего Направление ведомого
MOSI Определяется пользователем Вход
MISO Вход Определяется пользователем
SCK Определяется пользователем Вход
SS Определяется пользователем Вход

 

Функционирование входа SS#

Когда SPI определен как ведущий (бит MSTR регистра SPCR установлен), пользователь имеет возможность определить рабочее направление вывода SS#. Если вывод SS# определен как выход, то он является выводом общего назначения и он не участвует в работе системы SPI. Если же вывод SS# определен как вход, то для обеспечения работы ведущего SPI он должен удерживаться на высоком уровне. Если в режиме ведущего вывод SS# является входом и внешней схемой на него подан низкий уровень, то SPI воспримет его как обращение другого ведущего SPI к себе как к ведомому. Чтобы избежать конфликтной ситуации на шине, система SPI выполняет следующие действия:

1. Бит MSTR в регистре SPCR очищается и система SPI становится ведомой. В результате выводы MOSI и SCK становятся входами;

2. Устанавливается флаг SPIF регистра SPSR и, если разрешено прерывание SPI, начинается выполнение процедуры обработки прерывания.

Таким образом, когда управляемый прерыванием передающий SPI используется в режиме ведущего и существует вероятность подачи на вывод SS# активного сигнала низкого уровня, прерывание должно всегда проверять, установлен ли еще бит MSR. Если же бит MSTR был очищен выбором режима ведомого, то он должен быть установлен пользователем для переназначения ведущим.

Если порт SPI является ведомым, то вывод SS# постоянно работает как вход. Если на вывод SS# подан низкий уровень, то SPI активируется и MISO, если это определено пользователем, становится выходом. Все остальные выводы являются входами. Если вывод SS# удерживается на высоком уровне, то все выводы являются входами, SPI пассивен, и это означает, что он не будет получать входящих данных.

Существует четыре варианта комбинации фазы и полярности SCK относительно данных, определяемые управляющими битами СРНА и CPOL. Форматы передачи данных SPI показаны на рисунке

 

 

 

Рисунок 6.1 – Регистр  управления SPI - SPCR

            

Bit 7 - SPIE: Разрешение прерывания SPI. Установка бита SPIE приводит к прерыванию, если установлен бит SPIF регистра SPSR и все прерывания разрешены.

Bit 6 - SPE: Разрешение SPI. Установка бита SPE разрешает работу порта SPI и подключение SS, MOSI, MISO и SCK к выводам РВ4, РВ5, РВ6 и РВ7.

Bit 5 - DORD: Порядок данных. При установленном бите DORD передача слова данных происходит вперед младшим битом. При очищенном бите DORD первым передается старший бит слова данных.

Bit 4 - MSTR: Выбор режима ведущий/ведомый. При установленном бите MSTR порт SPI работает в режиме ведущего, а при очищенном бите - в режиме ведомого. Если SS# определен как вход и на него подан низкий уровень при установленном MSTR, то MSTR будет сброшен и будет установлен бит SPIF в регистре SPSR. Чтобы вновь разрешить ведущий режим SPI, пользователь должен установить MSTR.

Bit 3 - CPOL: Полярность тактового сигнала. При установленном бите CPOL сигнал SCK в режиме Idle находится на высоком уровне, при сброшенном бите CPOL - на низком уровне.

Bit 2 - СРНА: Фаза тактового сигнала.

Bits 1,0 - SPR1, SPR0: Выбор частоты тактового сигнала. Эти два бита управляют частотой тактового сигнала прибора, работающего в режиме ведущего. В режиме ведомого состояния битов влияния не оказывают. Состояния битов и устанавливаемый коэффициент деления частоты fCL показаны в таблице:

 

SPR1 SPR0 Тактовая частота SCK
0 0 fcl/4
0 1 fcl/16
     
1 0 fcl/64
1 1 fcl/128

Таблица 6.2 – Соотношения  между частотой SCK и частотой генератора

 

 

Рисунок 6.2 – Регистр состояния SPI – SPSR

 

Bit 7 - SPIF: Флаг прерывания no SPI. По завершении обмена последовательными данными бит SPIF устанавливается и, если бит SPIE в регистре SPCR установлен и разрешено глобальное прерывание, прерывания по SPI обрабатывается. Бит SPIF очищается аппаратно при выполнении процедуры обработки соответствующего вектора прерывания. Бит SPIF может быть очищен также при первом чтении регистра состояния SPSR при установленном бите SPIF с последующим обращением к регистру данных SPDR.

Bit 6 - WCOL: Флаг ошибки при записи. Бит WCOL устанавливается, если в процессе передачи данных выполнялась запись в регистр данных SPDR. Бит WCOL (и бит SPIF) аппаратно очищаются при первом чтении регистра SPSR с установленным WCOL и последующим обращением к регистру данных SPDR.

Bit5..0 - Res: Зарезервированные биты.

 

Рисунок 6.3 – Регистр данных SPI – SPDR

 

Регистр данных SPDR представляет собой регистр с возможностью чтения/записи и предназначен для пересылки данных между регистровым файлом и сдвиговым регистром SPI. Запись в регистр SPDR инициирует передачу данных, считывание регистра приводит к чтению сдвигового регистра приемника.

UART - универсальный асинхронный приемопередатчик

Микроконтроллеры ATmega103 оснащены дуплексным универсальным приемопередатчиком (UART). Его основные возможности:

· Генератор обеспечивает любую скорость передачи информации в бодах.

· Высокая скорость передачи при низкой частоте XTAL.

· 8-разрядный или 9-разрядный форматы данных.

· Фильтрация шума.

· Обнаружение переполнения.

· Обнаружение ошибок формирования кадров.

· Детектирования бита ложного старта.

· Три отдельных прерывания: по завершению передачи (Тх Complete), по пустому регистру передаваемых данных (Тх Data Register Empty) и по завершению приема (Rx Complete).

Передача данных

Передача данных инициируется записью передаваемых данных в регистр данных UDR. Данные пересылаются из UDR в сдвиговый регистр передатчика в следующих случаях:

· Новый символ записан в UDR после того как был выведен из регистра стоповый бит предшествовавшего символа. Сдвиговый регистр загружается немедленно;

· Новый символ записан в UDR прежде, чем был выведен стоповый бит предшествовавшего символа. Сдвиговый регистр загружается после выхода стопового бита передаваемого символа, находящегося в сдвиговом регистре.

Если 10 (11)-разрядный сдвиговый регистр передатчика пуст, данные из регистра UDR передаются в сдвиговый регистр. При этом устанавливается бит UDRE регистра USR. При установленном UDRE UART готов принять следующий символ. Запись в UDR очищает бит UDRE. Когда данные переданы из UDR в сдвиговый регистр, бит 0 сдвигового регистра сбрасывается (состояние 0 - стартовый бит) а старший бит устанавливается (состояние 1 - стоповый бит). Если в регистре управления UCR установлен бит CHR9 (т.е. выбран режим 9-разрядного слова данных), то бит ТхВ8 регистра UCR пересылается в бит 9 сдвигового регистра передатчика.

Сразу после пересылки данных в сдвиговый регистр импульсом синхросигнала стартовый бит выдвигается на вывод TxD. За ним следуют биты данных, младший бит первым. Когда будет выдвинут стоповый бит, сдвиговый регистр загружается новыми данными, если байт был записан в регистр UDR во время передачи. В процессе загрузки бит UDRE находится в установленном состоянии. Если новые данные не будут загружены в UDR до выдачи стопового бита, флаг UDRE остается установленным. В этом случае, после того как стоповый бит будет присутствовать на выводе TxD в течение одного такта, в регистре статуса UART (USR) устанавливается флаг завершения передачи ТхС.

Установленный бит TxEN регистра UCR разрешает передачу. При очищенном бите TxEN вывод РЕ1 может быть использован в качестве вывода I/O общего назначения. При установленном бите TxEN передатчик UART подключается к выводу РЕ1 и использует его выхода, независимо от установки бита DDE1 в регистре DDRE.

Прием данных

Логика приемника проверяет состояние сигнала на выводе RxD с частотой в 16 раз большей, чем частота передачи. При пассивном состоянии линии одиночная выборка логического уровня 0 интерпретируется как падающий (передний) фронт стартового бита и запускается последовательность детектирования стартового бита. Считается, что первая выборка обнаружила первый нулевой логический уровень вероятного стартового бита. Вслед за переходом 1-0 на выборках 8, 9 и 10 приемник вновь тестирует вывод RxD на изменение логических состояний. Если две или более из этих трех выборок обнаружат логические 1, то данный вероятный стартовый бит отвергается как шумовой всплеск и приемник начнет выявлять и анализировать следующие переходы из 1 в 0.

Если же был обнаружен действительный стартовый бит, то принимаются следующие за стартовым битом информационные биты. Эти биты также тестируются на выборках 8, 9 и 10. Логическое состояние бита определяется по двум и более (из трех) одинаковым состояниям выборок. Все биты вводятся в сдвиговый регистр приемника с тем значением, которое было определено на основе выборок.

При поступлении стопового бита необходимо чтобы не менее двух выборок из трех подтвердили прием стопового бита (показали уровень 1). Если же две или более выборок покажут состояние 0, то при пересылке принятого байта в UDR, в регистре статуса USR устанавливается бит ошибки кадра FE. Пользователь перед чтением регистра UDR должен проверять состояние бита FE. Флаг FE очищается при чтении содержимого регистра данных UDR. Вне зависимости от того, принят правильный стоповый бит или нет, данные пересылаются в регистр UDR и устанавливается флаг RxC в регистре статуса USR. Регистр UDR фактически объединяет два физически отдельных регистра, один из которых служит для передачи данных, а другой для приема. При чтении UDR обращение ведется к регистру приема данных, при записи обращение ведется к регистру передачи. Если выбран режим обмена 9-разрядными словами данных (установлен бит CHR9 регистра UCR), при пересылке данных в UDR бит RxB8 регистра UCR загружается в бит 9 сдвигового регистра передачи. Если после получения символа к регистру UDR не было обращения, начиная с последнего приема, в регистре UCR устанавливается флаг переполнения OR. Это означает, что новые данные, принятые в сдвиговый регистр, не могут быть переданы в UDR и потеряны. Бит OR буферизирован и доступен тогда, кода из UDR прочитан байт достоверных данных. Пользователю, для обнаружения переполнения, необходимо всегда проверять флаг OR после чтения регистра UDR.

При очищенном бите RxEN регистра UCR приемник запрещен. Это означает, что вывод РЕ0 может использоваться в качестве вывода I/O общего назначения. При установленном бите RxEN приемник UART подключается к выводу РЕ0, который работает как входа, вне зависимости от установки бита DDE0 в регистре DDRE. При определении вывода РЕ0 как входа, бит PORTE0 может использоваться для управления нагрузочным резистором вывода.

Управление UART

 

 

Рисунок 6.4 – Регистр данных UART – UDR и Регистр статуса - UART - (UART Status Register)

 

В действительности имя UDR представляет два физически разделенных регистра - регистр передачи данных и регистр приема данных, использующих один и той же адрес. При записи в регистр запись производится в регистр передачи данных UART, а при чтении выполняется чтение содержимого регистра приема данных UART.

Регистр USR обеспечивает чтение информации о состоянии UART.

Bit 7 - RxC: Прием завершен. Этот бит устанавливается при пересылке принятого символа из сдвигового регистра приемника в регистр UDR. Бит устанавливается вне зависимости от отсутствия или наличия ошибок приема кадра. При установленном в UCR бите RxCIE и установленном бите RxC выполняется прерывание по завершению приема UART. Бит RxC очищается при чтении UDR. При приеме данных по прерыванию, процедура обработки прерывания по завершении приема должна прочитать UDR с тем, чтобы очистить RxC, иначе по ее окончании произойдет новое прерывание.

Bit 6 - ТхС: Передача завершена. Этот бит устанавливается, когда весь символ (включая стоповый бит) выведен из сдвигового регистра передачи, а в регистр UDR не записаны новые данные. Этот флаг используется при полудуплексном протоколе обмена, когда оборудование передачи должно установить режим приема и освободить коммуникационную шину сразу после завершения передачи.

При установленном в регистре UCR бите TxCIE установка ТхС приведет к выполнению прерывания по завершению передачи UART. Флаг ТхС очищается аппаратно при переходе по соответствующему вектору прерывания. Очистить бит ТхС молено записью в бит логической 1.

Bit 5 - UDRE: Регистр данных пуст. Этот бит устанавливается, когда весь символ, записанный в UDR, пересылается в сдвиговый регистр передатчика. Установка этого бита означает, что передатчик готов к получению нового символа.

Когда бит UDRIE в UCR установлен, до тех пор, пока установлен UDRE, существует запрос прерывания по завершению передачи UART. Бит UDRE очищается при записи в UDR. При приеме данных по прерыванию, процедура обработки прерывания по пустому регистру данных должна прочитать UDR с тем, чтобы очистить UDRE, иначе по окончании процедуры прерывания произойдет новое прерывание. Во время сброса бит UDRE устанавливается с тем, чтобы индицировать готовность передатчика.

Bit 4 - FE: Ошибка кадра. Этот бит устанавливается при обнаружении условий ошибочного приема кадра, т.е. когда при приеме стопового бита обнаружено состояние 0. Бит FE очищается при приеме стопового бита с логическим уровнем 1.

Bit 3 - OR: Переполнение данных. Бит OR устанавливается при обнаружении условий переполнения, т.е. когда символ, уже находящийся в регистре UDR, не прочитан перед пересылкой нового символа из сдвигового регистра приема. Бит OR буферирован, т.е. он будет оставаться установленным, пока не будут считаны правильные данные из UDR. Бит OR очищается, когда данные приняты и пересланы в UDR.

Bit 2..0 - Res: Зарезервированные биты.

 

 

Рисунок 6.5 – Регистр управления UART - UCR - (UART Control Register)

Bit 7 - RxCIE: Разрешение прерывания no завершению, приема. При установленном 1 бите RxCIE и разрешении глобального прерывания установка бита RxC в регистре USR приведет к прерыванию по завершению приема.

Bit 6 - TxCIE: Разрешение прерывания по завершению передачи. При установленном бите TxCIE и разрешении глобального прерывания установка бита ТхС в регистре USR приведет к выполнению прерывания по завершению передачи.

Bit 5 - UDRIE: Разрешение прерывания по пустому регистру данных. При установленном бите UDRIE и разрешении глобального прерывания установка бита UDRE в регистре USR приведет к прерыванию по пустому регистру данных UART.

Bit 4 - RxEN: Разрешение приемника. Установленный бит RxEN разрешает приемник UART. Если приемник запрещен, то флаги статуса ТХС, DOR и FE установить невозможно. Если эти флаги установлены, то очистка бита RxEN не приведет к очистке этих флагов.

Bit 3 - TxEN: Разрешение передатчика. Установленный бит TxEN разрешает передатчик UART. При запрещении передатчика во время передачи символа, передатчик не будет заблокирован прежде, чем будут полностью переданы символ в сдвиговом регистре плюс любой находящийся в UDR следующий символ.

Bit 2 - CHR 9: Режим 9-разрядных символов. При установленном бите CHR9 передаются и принимаются 9-разрядные символы плюс стартовый и стоповый биты. Девятые биты читаются и записываются с использованием битов RxB8 и ТхВ8 регистра UCR. Девятый бит данных может использоваться как дополнительный стоповый бит или бит контроля четности.

Bit 1 - RxB 8: Прием 8-разрядных данных. При установленном бите CHR9 бит RxB8 является девятым битом данных принятого символа.

Bit 0 - ТхВ8: Передача 8-разрядных данных. При установленном бите CHR9 бит ТхВ8 является девятым битом данных передаваемого символа.

 

Формирователь синхросигнала последовательного обмена

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

BAUD = fCK /16(UBRR+1) где:

BAUD - частота в бодах;

fCK- частота кварцевого генератора;

UBRR= содержимое регистра UBRR (Baud Rate register =0 - 255).

 

 

Рисунок 6.6 –  Регистр формирователя синхросигнала UART - UBRR

 

Регистр UBRR является 8-разрядным регистром, с возможностью чтения/записи. Значение в нем определяет скорость UART.

 

ВЫПОЛНЕНИЕ РАБОТЫ

1. Изучите функционирование последовательных портов микроконтроллера ATmega103.

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

Запустите на инструментальном компьютере интегрированную систему программирования «AVR Studio», создайте новый проект и его файл исходного текста сохраните с именем demo6_r.asm. В этот файл поместите исходный текст программы приемника:

 

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

;*                                        Лабораторная работа № 6 (приемник)                            *;

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

.Include "m103DEF.INC";

; *************************** Константы **********************************************

.EQU Stack=$0FFF;     Вершина стека

.EQU Ind_Port=PortC; Порт индикатора

 

;**************************** * Регистры ******************************************

;Переименование регистров (для удобства)

.Def   Zero=R3;          Нулевой регистр

.Def   Acc=Rl6;                                                     

.Def   Bcc=R17;

 

;*********** ****** ****************** Таблица прерываний *************************

 

.ORG $0

rjmp Start

.ORG $24

rjmp RX_COM

.ORG $30

 

;********* ****************** Процедуры обработки прерываний **********************

 

;         Завершение приема UART            

RX_COM:

set;   Установка бита Т (признак принятого байта)

in Bcc, UDR;     Считывание принятого по UART байта

reti

;******************************** Основной цикл программы ************************

;         Инициализация 

Start:

Ldi Acc, high (Stack); инициализация стека

Out SPH, Acc

Ldi Acc, low (Stack)

Out SPL, Acc

Clr Zero;                   Очистка нулевого регистра

Ldi Acc, 1

Out UBRR, Acc;         Установка скорости UART и прерывания по завершению приема UART

Sei;                                разрешить все прерывания

 

 

MainCycle:

brtc MainCycle; Если флаг Т очищен

clt;    Очищаем флаг Т и ждем приема очередного байта

rcall ToDigits;  Перевод в сегментный вид индикатора

rjmp MainCycle;

 

;**************************Процедура вывода на индикатор**************************

ToDigits:

ldi      R30, low (DigitTab*2); загружаем в Z адрес таблицы преобразования

ldi      R31, high (DigitTab*2)

add    R30, Bcc;        Прибавляем к адресу полученный байт

adc     R31, Zero;

lpm; Считываем из памяти программ байт

mov    Acc,R0;          Разряд в сегментном виде

 out       Ind_Port,Асс; Выдаем код на шину данных индикаторов

ret;

;* * * * * * * * * * * * * * * *** * * * **** Таблицы * *. * * * * * * * * * * * * * * * * * * * * * * * DigitTAB:

;       0,   1,     2,  3, 4,   5,    6,     7,       8,      9,   А,    В,     С

. db $C0, $F9, $A4, $B0, $99, $92, $82, $F8,   $80,         $90, $88,       $83, $C6

 

Создайте новый проект и его файл исходного текста сохраните с именем demo6_t.asm. В этот файл поместите исходный текст программы передатчика:

 

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

;*                                                                                                                                                                        *

;*                                            Лабораторная работа №6 (передатчик)                                           *

;*                                                                                                                                                                        *

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

 . Include "m103DEF.INC";

 

;****************************** Константы *************** * * ****** ****************    

  

.EQU      Stack=$0FFF;

               .Equ       KB_Port=PortD;

               .Equ       KB_DDR=DDRD;

               .Equ       KB_PIN=PIND;

 

;.****************************** Регистры ********************************************

;Переименование регистров (для удобства)

.Def       Zero=R3;

.Def       Acc=R16;

.Def       Bcc=R17;

.Def       Ccc=Rl8;

.Def        Dcc=R19;

.Def        Ecc=R20;

 

;***************************** Переменные **************************************

 

.EOU     KeyFlags=$100; Сдвиговый регистр клавиатуры

 

;                 X7 | X6 | X5| X4 | X3 | X2 | X1 | X0

 

 

;************************* Таблица прерываний **********************************

.ORG $0

rjmp Start

;********************************* Основной цикл программы ************************

 

;         Инициализация 

Start:

Ldi R16, high (Stack); инициализация стека

Out SPH, Acc

Ldi R16, low (Stack)

Ldi Acc, $0;                                            PD0-3 выходы, PD4-6 входы

Out  KB_Port, Acc;

Out  KB_DDR, Acc;

Clr Zero;

Ldi Acc, 1

Out UBRR, Acc;                   установка скорости (1-115200)

Sbi UCR, 3;                    расзрешение работы передатчика по UART

Ldi Dcc, $0D;

Sei;                           разрешить все прерывания

 

;--------------------------------------------------Рабочий цикл программы---------------------------------------

MainCycle:

                rcall       AskKey;   Опрос KB

brtc       MainCycle; Если флаг T очищен

ср     Bcc, Dcc

breq      MainCycle

mov      Dcc, Bcc

rcall    U_SEND                                                     Передача байта N клавиши по UART

rjmp     MainCycle;

 

;********************************Процедура сканирования клавиатуры*****************

AskKey:

              clr         Bcc;

              clt         ;                                                                                            очищаем флаг T

              sbi        KB_DDR,0;

              rcall      Check;                                              проверка на нажатие в 0-ой строке

             cbi         KB_DDR,0;

             brcc       Checkout;                          если было нажатие переходим на CheckOut

             sbi         KB_DDR,1;

             rcall      Check;

             cbi        KB_DDR,1;

             brcc      Checkout;

             sbi         KB_DDR, 2;

             rсall    Check;

             cbi        KB_DDR,2;

             brcc      Checkout;

             sbi        KB_DDR,3;

             rcall      Check;

              cbi          KB_DDR,3;

СheckOut:

               rjmp         Dreb;                                          проверка на дребезг                            

Сheck:     in        Acc, KB_Pin;           снимаем значения с выходов порта клавиатуры

               swap    Acc;                                                                  переворачиваем тетрады

               ldi         Ccc, 4;                                                     устанавливаем счетчик цикла

Сheck01:

              dec         Ccc;                                                               уменьшаем счетчик цикла

              breg       Check02;              если прошли 3 столбца то на выход (нажатия нет)

               inc         Bcc;                                                                                      номер кнопки

               lsr          Acc;                                                               поиск нажатой клавиши

               brcs           Check01;                                       если флаг С=0 было нажатие и мы

              set          ;                                                                        устанавливаем флаг Т

Сheck02:

              ret;

 

Dreb:

lds         Ccc, KeyFlags;        считываем значение из сдвигового per. клавиатуры

lsl          Ccc;                                                                         сдвигаем его влево

bld         Ccc, 0;                                Записываем в 0-ой бит Ссс значение флага Т

                 sts         KeyFlags,Ссс;                     запоминаем сдвиговый регистр клавиатуры

cpi        Ссс, $FF;                                             если точно было нажатие то на выход

breq       Check02;

clt       ;                                если не было нажатия то очищаем флаг Т и на выход

ldi        Dcc, $0D;

ret        ;

;********************** Процедура отправки байта по UART *************************** U_SEND:

out          UDR, Bcc

clt                                ;очищаем флаг T

 Ret;

 

Программы demo6_r и demo6_t иллюстрируют работу последовательного асинхронного интерфейса (UART) на примере передачи кода нажатой клавиши от передатчика к приемнику. Передатчик выполняет сканирование клавиатуры (см. работу 3) и осуществляет пересылку кода нажатой клавиши по UART. Приемник получает этот код и отображает его на семисегментном индикаторе.

Рассмотрим подробнее работу передатчика. Программа demo6_t начинается с объявления констант, переменных и регистров с помощью директив EQU и DEF. Затем идет блок инициализации, в котором указывается вершина стека, режимы работы портов. Здесь же инициализируется последовательный интерфейс UART. Командами

ldi     Асс,1

out    UBRR, Асс

производится установка скорости передачи данных (в данном случае 115200 бит\с), а команда

     sbi      UCR,3

разрешает работу передатчика. Теперь любой байт записанный, например, командой

   out     UDR,R16

в регистр ввода\вывода UDR будет немедленно передан по последовательному интерфейсу.

В рабочем цикле программы происходит опрос клавиатуры (см. работу 3) и в случае, если какая-либо клавиша нажата, номер ее сравнивается с предыдущим номером нажатой клавиши и, если они не совпадают (т.е. имеет место новое нажатие), вызывается процедура U_SEND посылки номера нажатой клавиши по UART.

 

Программа приемника demo6_r выполняет отображение принятого по UART кода нажатой клавиши на семисегментном индикаторе. Для отслеживания события приема данных используется прерывание Rx COM, которое вызывается при получении байта по UART. Инициализация последовательного интерфейса осуществляется командами

       ldi     Асс, 1

       out    UBRR, Асс

которые устанавливают скорость передачи данных (в данном случае 115200 бит\с) равную скорости передачи передатчика, а команды

       ldi    Асс,$90

       out   UCR,Асс

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

Подключить к двум компьютерам платы лабораторных макетов, соединить кабелем последовательные порты (разъем ХР12) двух плат. Выполнить трансляцию программ и загрузить исполняемые модули во flash-память контроллеров, наблюдать на семисегментном индикаторе платы приемника номер нажатой клавиши.

Задания

1. Составить программу передачи с заданной скоростью обмена через порт RS232 кода нажатых клавиш в символьном формате (например, для передачи цифр от 0 до 9 нужно прибавить к их значению в двоичном коде смещение 30h. Таким образом формируется код символа цифры в таблице ASCII.). В качестве приемника использовать персональный компьютер с запущенной программой HiperTerminal (Программы | Стандартные | Связь | HiperTenninal). Установить эту программу в режим приема данных; установить скорость приема, равную скорости передачи микроконтроллера (например 9600 бод, 8 бит данных, один стоповый бит, четность не проверяется). После нажатия клавиши на контроллере наблюдать ее номер на экране компьютера.

2. Составить программы асинхронного приема и передачи данных с контролем четности. Нарушение четности контролировать путем реализации прерывания с индикацией ошибки приема с помощью светодиода или семисегментного индикатора (зажигание символа Е - error).

Провести отладку разработанных программ на лабораторных макетах с использованием интегрированной среды программирования. Результаты выполнения продемонстрировать преподавателю.



Поделиться:


Последнее изменение этой страницы: 2019-11-02; просмотров: 103; Нарушение авторского права страницы; Мы поможем в написании вашей работы!

infopedia.su Все материалы представленные на сайте исключительно с целью ознакомления читателями и не преследуют коммерческих целей или нарушение авторских прав. Обратная связь - 18.119.131.178 (0.192 с.)