Добавил:
Upload Опубликованный материал нарушает ваши авторские права? Сообщите нам.
Вуз: Предмет: Файл:
USART.docx
Скачиваний:
4
Добавлен:
01.03.2025
Размер:
171.66 Кб
Скачать

USART

USART (Universal Synchronous/Asynchronous Receiver/Transmitter) - полнодуплексный универсальный синхронный/асинхронный приёмопередатчик, с помощью которого осуществляется приём и передача информации, представленной последовательным кодом, с другими устройствами.

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

Поток данных, передаваемых по USART, представляет собой совокупность посылок и кадров. Каждый кадр содержит

  • 1 стартовый бит

  • 5, 6, 7, 8 или 9 битов данных

  • бит чётности

  • 1 или 2 стоповых бита

Передача начинается со стартового бита, за которым следует младший бит данных. За ним следуют остальные биты данных, которые заканчиваются самым старшим. Если установлен соответствующий флаг, то после данных вставляется бит чётности. Фрейм заканчивается стоповым битом.

USART способен распознавать два вида ошибок и вызывать три прерывания

  • приём завершён, номер прерывания $0009, – USART, Rx Complete

  • регистр данных передатчика пуст, номер прерывания $000a, – USART Data Register Empty

  • передача завершена, номер прерывания $000b, – USART, Tx Complete

Рассмотри каждое из этих прерываний. Все они так или иначе связаны с регистром данных UDR (USART DATA REGISTER). В этом регистре хранятся и передаваемый, и принимаемый байт данных. Пользователь при работе с USART видит только один регистр, но физически он состоит из двух регистров, обращение к которым происходит по одному и тому же адресу, один из них используется для передачи, другой – для приема. При чтении из UDR происходит обращение к входному регистру, а при записи – к передающему.

При передаче байта данных от микроконтроллера этот байт записывается в регистр UDR, при чтении байт данных из него считывается.

При передаче из регистра UDR данные передаются в сдвиговый регистр. Уже из сдвигового регистра происходит побитная отправка байта, младшим битом вперед. При приеме в UDR данные записываются из сдвигового регистра.

Прерывание «регистр данных пуст», означает, что значение регистра UDR равно 0x00. Оно происходит, когда байт данных из UDR был перемещен в сдвиговый регистр. После этого флаг UDRE в регистре UCSRA устанавливается в 1. При передаче последовательности байт каждый следующий символ можно записывать в UDR только после того, как будет установлен разрядUDRE После того, как был в UDR был записан следующий байт, флаг UDRE сброситься в 0.

Для того чтобы разрешить прерывание «регистр данных пуст», следует установить флаг UDRIE регистра UCSRB. Флаг общего разрешения прерываний I регистра SREG то же должен быть установлен в 1 командой sei.

Работать с флагом UDRE можно и без прерывания. В этом случае в цикле проверяется установлен ли данный флаг. Когда UDRE станет равным 1, выйти из цикла и записать новый байт данных.

Например:

WAITUDRIE:

sbis UCSRA,UDRE ;если разряд установлен, то пропускаем ;следующую команду и переходим к передаче ;(метка OUPUT)

rjmp WAITUDRIE

OUTPUT:

out UDR,r0

Прерывание «передача завершена» происходит поле того как все данные были переданы из сдвигового регистра. В это же время устанавливается в 1 флаг TXC регистра UCSRA. Для того чтобы разрешить это прерывание следует установить в 1 флаг TXCIE регистра UCSRB.

sbi UCSRB,TXCIE

Когда байт данных получен, и его можно считать из регистра UDR приемопередатчиком устанавливается в 1 флаг RXC регистра UCSRA, после чего, если установлены в 1 флаг разрешения прерывания RXCIE регистра UCSRB и флаг общего разрешения прерываний I регистра SREG, происходит прерывание «прием завершен».

Для работы с прерывания от USART сначала следует определить обработчик для соответствующего прерывания. Для этого:

.org 0x0009

RECEIVE

Где функция RECEIVE является обработчиком прерывания «прием завершен». А 0x0009 – номер прерывания «регистр данных пуст». Номер прерывания можно найти в файле m8515def.inc.

Для работы с USART сначала следует установить разряды TXEN и RXEN, для разрешения передачи и приема данных соответственно.

ldi temp,(1<<TXEN | 1<<RXEN)

out UCSRB,temp

Следующим шагом определяются параметры обмена данными: скорость, наличие бита честности, количество стоп-битов, количество бит в каждом кадре.

Скорость определяется регистром UBBR(USART Baud Rate Register – регистр скорости передачи данных).

Этот регистр является шестнадцати разрядным и для него справедливы те же правила записи, что и для регистра TCNT1 (см. «Таймеры»).

Скорость передачи данных может быть вычислена по следующей формуле:

Где BAUD – скорость передачи данных в бодах, UBRR – содержимое регистра UBRR, – тактовая частота микроконтроллера.

Для ряда значений скоростей передачи содержимое регистра UBRR приведено в таблице .

Скорость, бод

2400

95

4800

47

9600

23

14400

15

19200

11

28800

7

38400

5

57600

3

76800

2

115200

1

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

Например, чтобы задать скорость 38400 бод, следует в регистр UBRR записать 5.

clr temp

out UBRRH,temp

ldi temp,0x05

out UBRRL,temp

Теперь определим формат кадра. За количество бит в кадре, наличие бита четности и другие параметры кадра отвечает регистр UCSRC.

За проверку четности отвечает разряды UPM1 и UPM0. Чтобы отключить проверку четности в оба этих разряда нужно записать 0.

Количество стоп-битов определяется разрядом USBS. Чтобы стоп-бит в каждом кадре был только 1, следует сбросить разряд в 0. Для двух стоп-битов в кадре – установить в 1.

Количество битов данных в кадре устанавливается с помощью разрядов UCZ0, USZ1, USZ2. Чтобы в каждом кадре передавалось по 8 бит нужно установить следующие значения UCZ0 = 0, USZ1 = 1, USZ2 = 1.

Значение этих флагов для другого формата кадров см. табл.

UCSRС – USART Control and Status Register С

URSEL

R/W

Register Select. Выбор между UCSRC и UBBRH. При чтении и записи в UCSRC URSEL должен быть установлен в 1.

UMSEL

R/W

USART Mode Select. Выбор синхронного или асинхронного режима. 0 -асинхронный, 1 - синхронный.

UPM1

UPM0

R/W

Parity Mode. Режим проверки битов чётности

UPM1

UPM0

Режим

0

0

Отключено

0

1

*

1

0

Вкл. Чётный

1

1

Вкл. Нечётный

USBS

R/W

Stop Bit Select. Число стоповых битов передатчика. Приёмник игнорирует этот флаг. 0 - 1 бит, 1 - 2 бита.

UCSZ1

UCSZ0

R/W

Character Size. Вместе с UCSZ0 регистра UCSRB определяют размер символа (число битов данных кадра)

UCSZ2

UCSZ1

UCSZ0

Размер

0

0

0

5

0

0

1

6

0

1

0

7

0

1

1

8

1

0

0

*

1

0

1

*

1

1

0

*

1

1

1

9

UCPOL

R/W

Clock Polarity. Выбор фронта, по которому будет происходить приём/передача

UCPOL

Выход пина TxD

Вход пина TxD

0

На рост

На спад

1

На спад

На рост

Пример:

ldi temp, ((1<<URSEL)|(3<<UCSZ0))

out UCSRC,temp ; 1 стоп бит USBS=0, контроль четности ;отсутствует UPM1,UPM0 = 0

;USZ=3(USZ0-0,USZ1-1,USZ2-1) - посылается 8 бит за 1 раз

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

Для разрешения прерывания «регистр данных пуст»: sbi UCSRB, UDRIE

Для разрешения прерывания «прием завершен»: sbi UCSRB, RXCIE

Для разрешения прерывания «передача завершена»: sbi UCSRB, TXCIE

UCSRB – USART Control and Status Register B

RXCIE

R/W

RX Complete Interrupt Enable. Разрешает прерывание на флаг RXC. Прерывание сработает тогда, когда установлены в 1 RXCIE, Global Interrupt Flag в SREG и RXC в UCSRA.

TXCIE

R/W

TX Complete Interrupt Enable. Разрешает прерывание на флаг TXC. Прерывание сработает тогда, когда установлены в 1 TXCIE, Global Interrupt Flag в SREG и TXC в UCSRA.

UDRIE

R/W

USART Data Register Empty Interrupt Enable. Разрешает прерывание на флаг UDRE. Прерывание сработает тогда, когда установлены в 1 UDRIE, Global Interrupt Flag в SREG и UDR в UCSRA.

RXEN

R/W

Receiver Enable. Включить приёмник. Приёмник заблокирует обычные операции с выводом RxD порта D.

TXEN

R/W

Transmitter Enable. Включить передатчик. Приёмник заблокирует обычные операции с выводом TxD порта D.

UCSZ2

R/W

Character Size. Вместе с битом UCSZ1 регистра UCSRC задают длину символа (число битов данных в кадре).

RXB8

R

Receive Data Bit 8. Это 9-й бит принятых данных при передаче 9 бит. Должен быть считан первым, до младших битов данных кадра.

TXB8

R/W

Transmit Data Bit 8. Это 9-й бит переданных данных при передаче 9 бит. Должен быть записан первым, до младших битов данных кадра.

С USART можно работать и без его прерываний. Так как каждое прерывание сопровождается установкой флага регистра UCSRA, можно просто проверять значение этих флагов. Например, чтобы принять байт данных необходимо в цикле проверять, не установлен ли флаг RXC, и если он установлен вызвать функцию RECEIVE.

sbic UCSRA,RXC ; если флаг RXC=0, то пропускаем следующую команду

rcall RECEIVE ; если RXC=1, то считываем из регистра UDR байт, полученный ;по USART

RECEIVE:

In temp, udr ; считываем данные, переданные по usart ;микроконтроллеру (байт содержаться в регистре udr)

ret

Чтобы передать байт данных, не используя прерывания USART, следует в цикле проверять значение либо флага UDRE, либо TXC, аналогично выше рассмотренному случаю.

TRANSMIT:

sbis UCSRA,UDRE ;если UDRE=0, то переходим снова на TRANSMIT

;иначе считываем байт из UDR

rjmp TRANSMIT

out UDR,temp

Где temp – регистр, куда записывается полученный байт.

Для управления работой USART используются следующие регистры:

UCSRA – USART Control and Status Register A

RXC

R

USART Receive Complete. Этот флаг устанавливается, когда буфер приёма не пуст, и очищается, когда буфер пуст (т.е. не содержит непрочитанных данных). Если передатчик отключен, то данный флаг также равен нулю. RXC флаг может быть использован для генерации $0009 прерывания (см. RXCIE)

TXC

R/W

USART Transmit Complete. Этот флаг устанавливается, когда весь фрейм был вытолкнут из сдвигового регистра передачи (Transmit Shift Register). TXC автоматически обнуляется при прерывании $000b (см. TXCIE).

UDRE

R

USART Data Register Empty. Этот флаг показывает, готов ли буфер передачи (UDR) получить новые данные. Если UDRE == 1, то буфер пуст. Используется при прерывании $000a (см. UDRIE). UDRE устанавливается в 1 при сбросе.

FE

R

Frame Error. Флаг ошибки фрейма. Всегда устанавливайте его в 0, когда пишете в UCSRA.

DOR

R

Data OverRun. Этот бит устанавливается при OverRun. OverRun – случается, когда буфер приёма заполнен (2 символа), в TSR находится ещё один символ, и при этом обнаруживается новый стартовый бит. Всегда устанавливайте его в 0, когда пишете в UCSRA.

UPE

R

USART Parity Error. Ошибка бита чётности (UPM1 = 1, т.е. установлена проверка чётности). Всегда устанавливайте его в 0, когда пишете в UCSRA.

U2X

R/W

Double the USART Transmission Speed. Этот бит устанавливается в 1 только при асинхронной передаче. Он устанавливает делитель скорости с 16 на 8, позволяя ускорить передачу. При синхронном режиме устанавливайте в 0.

MPCM

R/W

Multi-processor Communication Mode. Этот разряд позволяет организовывать простейшую мультипроцессорную систему. При MPCM == 1 приёмник принимает кадры, у которых 9-й бит равен 1 и игнорирует кадры с 9-м битом, равным 0. При MPCM == 0 приёмник принимает любой 9-й бит

Пример программы передачи данных по каналу USART.

В первом примере по нажатию кнопки 0 макета в окно Hyper Terminal выводиться символ ‘e’, если нажата кнопка на клавиатуре, то ASCII код этого символа выводиться на светодиоды.

Прием символа осуществляется по прерыванию «прием закончен», которое происходит, если в регистр UDR уже считан байт. В этом случае устанавливается флаг RXC. Чтобы разрешить это прерывание, в функции инициализации USART устанавливаем флаг RXCIE в 1 (sbi UCSRB, RXCIE).

Если нажата кнопка 0 макета, то разрешаем прерывание «регистр данных пуст», которое происходит, если установлен флаг UDRE, т. е. передача предыдущего байта завершена и регистр UDR пуст. Обнуляем регистр flag и запрещаем прерывание «прием закончен», установив в 0 флаг RXCIE (сbi UCSRB, RXCIE) . В бесконечном цикле ожидаем прерывание, чтобы после завершения обработки прерывания выйти из этого цикла, проверяем не установлен ли в 1 flag, если установлен, то обработчик прерывания уже был выполнен и байт выведен на светодиоды и необходимо выйти из цикла loop в основной цикл main . В обработчике прерывания USART_TRANSMIT устанавливаем в 1 flag и записываем в регистр UDR байт данных. Устанавливаем снова флаг RXCIE в 1 (sbi UCSRB, RXCIE), чтобы разрешить прерывание «прием закончен».

Из цикла ожидания прерывания loop переходим к основному циклу main по команде ret.

С основами работы с портами ввода/вывода можно ознакомиться в Приложении 1.

.include "m8515def.inc"

.dseg

.def temp = r16

.def flag = r17

.cseg

.org 0x0000

rjmp INIT

.org 0x0009

rjmp RECEIVE

.org 0x000a

rjmp TRANSMIT

INIT:

ldi temp,low(RAMEND) ;инициализация стека

out SPL,temp

ldi temp,high(RAMEND)

out SPH,temp

sei ;установка флага общего ;разрешения прерываний

ser temp

out DDRB,temp ;портВ - светодиоды, в DDRB 1111111 - ;порт на вывод

clr temp

out DDRA,temp ;портА - на ввод, кнопки

ser temp

out PINA,temp

out PORTA,temp

rcall INIT_USART ;инициализация USART

MAIN:

sbis PINA,0x00 ;если нулевой разряд установлен (кнопка ;не нажата), то пропускаем следующую ;команду

rcall USART_TRANSMIT ; иначе передаем байт

rjmp MAIN

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

;цикл ожидания прерывания при опустошении регистра данных UDR (регистр данных UDR пуст), прерывание происходит, если UDRIE устанавливается в 1

LOOP:

cpi flag,0x01 ;если флаг равен 1, то прерывание уже ;произошло и мы выходим из цикла ожидания

breq END_LOOP ;переход на метку END_LOOP, если выполняется ;равенство flag==0x01

rjmp LOOP

END_LOOP:

cbi UCSRB,UDRIE ;запрещаем прерывания регистр данных UDR ;пуст

ret

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

Соседние файлы в предмете [НЕСОРТИРОВАННОЕ]