# 7.Регистр для последовательного интерфейса USART (UDR, UCSRA, UCSRB, UCSRC, UBRRX)
[18. USART](/BwlGJ88fTHG0MM5dZCP3fg)
## КРАТКО:

**UDR** - dara register, туда кладешь, оттуда забираешь. На физическом уровне это 2 регистра (один для передачи, другой для приема)
**UCSRA** - управления (хотя в основном тут флаги)
RXC - флаг завершения приема
TXC - флаг завершения передачи
UDRE - буферный байт освободился, можно положить новое значение
FE - флаг = 1 если стоп бит кривой
DOR = 1, если новые данные пришли, а старые мы еще не забрали
PE - ошибка контроля четности
U2x - удваивает скорость передачи
MPCM - мультипроцессорный обмен (чего?)
**UCSRB** - разрешения
RXCIE - разрешение прерываний на прием
TXCIE - разрешение прерываний на передачу
UDRIE - Разрешение прерывания при очистке регистра данных UART
RXEN - Разрешение приема
TXEN Разрешение передачи
UCSZ2 - Количество битов в посылке.
RXB8 - 8-й разряд принимаемых данных.
TXB8 - 8-й разряд передаваемых данных.
**UCSRC** - настройки
URSEL выбор регистра, к которому идет обращение. 1 - UCSRC. 0 - UBRRH
UMSEL. 0 -асихнронно, 1 - синхронно
UPM1-UPM0 Режим работы контроля и формирования четности. функционирование схем контроля и формирования четности
USBS - количество стоп битов. 0 - 1, 1 - 2.
UCZ1, UCZ0 - вместе с UCZ2 задают количество бит в посылке
UCPOL Полярность тактового сигнала.
**UCRH|L** - 12битный регистр, задающий скорость.
## На всякий случай тоже попробовал написать кратко, но подробно
UDR
Данный регистр доступен как для записи, так и для чтения. Если мы записываем, то кладём в передатчик. Если мы считываем, то кладём в приёмник. Когда мы хотим что-то передать, мы записываем данные , они сваливаются в сдвигающий регистр и они пойдут на выход. Когда мы принимает, то после приёма мы читаем данные из UDR
Регистр - UCSRA - управления
RXC – флаг устанавливается в единицу, если на вход поступили данные. Данные поступили, мы закончили приём и положили их в UDR. Тогда появится 1.
TXC – появляется единица когда мы заканчиваем передачу байта. Мы записали данные в UDR, а записались они не скоро.
UDRE – UDR передатчика верхний регистр (буферный) он пустой и туда можно что-то записывать. Тоесть если 1, то USART готов к приёму следующего байта.
FE – ошибка фрейма. 1 если один байт на ложился на другой. Не успели считать один байт, а на вход уже пришёл следующий. Буфер ограниченный.
DOR – 1 , когда мы перезаписали существующие данные.
PE – если включена проверка чётности/нечётности и если бит не совпал, то идёт сигнализация об ошибки
U2x – включает двойную скорость работы.
MPCM – возможность соединять два процессора между собой по USART
Регистр - UCSRB - Разрешения
RXCIE – разрешение прерывания по окончанию приёму. Если записать 1, то включается автоматическая реакция на прерывания.
TXCIE – когда закончена передача байта, то можно разрешить прерывания. Мы заранее разрешаем.
UDRIE – Если мы работает по прерыванием, то можем включить прерывание по опустошению буферного регистра передатчика. Не дожидаясь когда закончитс передача последнего байта. Как только буфер опустел и мы можем класть следующий мы можем положить.
RXEN – 1, если мы хотим, чтобы Usart принимал данные
TXEN – 1, если мы хотим передавать данные
UCSZ2 – настраивают сколько бит данных передаётся
RXB8 – когда мы принимает, то вычитаем из RXB 9 бит и считываем остальные базовые биты из UDR
TXB8 - если мы используем 9 битную передачу, то возникает проблема, что udr 8 разрядный. Где взять 9 бит? Когда мы хотим передавать, то в TXB записываем 9 бит, а в UDR все остальные
Регистр - UCSRC - конфигурация форматов
URSEL - выбор регистра, к которому идет обращение. 1 - UCSRC. 0 - UBRRH
UMSEL - 0 -асихнронно, 1 - синхронно
UPM1-UPM0 – режим контроля чётности.
USBS – выбирает, сколько стоповых битов нужно использовать.
UCZ1, UCZ0 – указывают, сколько бит данных нужно передавать
UCPOL - Полярность тактового сигнала
UCRH|L - 12битный регистр, задающий скорость
## Регистр - UDR - ввод и вывод. Туда кладем и забираем

В действительности регистр UDR является двумя физически разделенными регистрами - регистром передачи данных и регистром приема данных, использующими одни и те же адреса I/O. При записи в регистр запись производится в регистр передачи данных UART, при чтении происходит чтение содержимого регистра приема данных UART.
Запись или чтение в udr происходит командами in, out
## Регистр - UCSRA - управления.

7-бит (RXC) - Флаг завершения приема. Флаг устанавливается в 1 при наличии непрочитанных данных в буфере приемника (регистр данных UDR).
Сбрасывается флаг аппаратно после опустошения буфера (в UART – после прочтения регистра данных). Если разряд RXCIE регистра UCSRB установлен, то при установке флага генерируется запрос на прерывание – «прием завершен»
6 - бит (TXC) - Флаг завершения передачи. Флаг устанавливается в 1 после передачи
всех разрядов посылки из сдвигового регистра передатчика при условии, что в регистр данных UDR не было загружено нового значения. Если разряд TXCIE регистра UCSRB (UCSRnB) установлен, то при установке флага генерируется прерывание «передача завершена». Флаг сбрасывается аппаратно при обработке прерывания или программно – записью в него логической 1.
5 - бит (UDRE) - Флаг опустошения регистра данных. Данный флаг устанавливается в 1 при пустом буфере передатчика (после пересылки байта из регистра данных UDR в сдвиговый регистр передатчика). Установленный флаг означает, что в регистр данных можно загружать новое значение. Если разряд UDRIE регистра UCR (UCSRB) установлен,генерируется запрос на прерывание – «регистр данных пуст». Флаг сбрасывается аппаратно при записи в регистр данных
4 - бит (FE) frame error - Флаг ошибки кадрирования. Флаг устанавливается в 1 при обнаружении ошибки кадрирования, если первый стоп-бит принятой посылки равен 0. Флаг сбрасывается при приеме стоп-бита, равного 1
3 - бит (DOR) - Флаг переполнения. В USART флаг устанавливается в 1, если в момент обнаружения нового старт-бита в сдвиговом регистре приемника находится последнее принятое слово, а буфер приемника полон. В
UART флаг устанавливается в 1, если новый кадр будет помещен в сдвиговый регистр приемника до того, как из регистра данных будет считано предыдущее слово. Флаг сбрасывается при пересылке принятых данных из сдвигового регистра приемника в буфер
2 - бит (PE) parity error - Флаг ошибки контроля четности. Флаг устанавливается в 1, если в данных, находящихся в буфере приемника, выявлена ошибка контроля четности
1 - бит (U2X) - Удвоение скорости обмена. Если этот разряд установлен в 1, коэффициент деления предделителя контроллера скорости передачи уменьшается с 16 до 8, удваивая тем самым скорость асинхронного обмена по последовательному каналу. В USART разряд U2X используется только при асинхронном режиме работы
0 - бит (MPCM) - Режим мультипроцессорного обмена. Если он установлен в 1, ведомый микроконтроллер ожидает приема кадра, содержащего адрес
## Регистр - UCSRB - Разрешения

7 - бит (RXCIE) - Разрешение прерывания по завершении приема. Если разряд установлен в 1, то при установке флага RXC регистра UCSRA генерируется прерывание «прием завершен» (если флаг I регистра SREG установлен в 1)
6 - бит (TXCIE) - Разрешение прерывания по завершении передачи. Если данный разряд установлен в 1, то при установке флага TXC регистра UCSRA генерируется прерывание «передача завершена» (если флаг I регистра SREG установлен в 1)
5 - бит (UDRIE) - Разрешение прерывания при очистке регистра данных UART. Если данный разряд установлен в 1, то при установке флага UDRE регистра UCSRA генерируется прерывание – «регистр данных пуст» (если флаг I регистра SREG установлен в 1)
4 - бит (RXEN) - Разрешение приема. При установке этого разряда в 1 разрешается работа приемника USART/UART и переопределяется функционирование вывода RXD (RXDn). При сбросе разряда RXEN работа приемника запрещается, а его буфер сбрасывается. Значения флагов TXC, DOR/OR и FE при этом становятся недействительными
3 - бит (TXEN) Разрешение передачи. При установке этого разряда в 1 разрешается работа передатчика UART и переопределяется функционирование вывода TXD. Если разряд сбрасывается в 0 во время передачи, выключение передатчика произойдет только после завершения передачи данных, находящихся в сдвиговом регистре и буфере
2 - бит (UCSZ2) - Формат посылок. Этот разряд используется для задания размера передаваемых слов данных. В модулях USART он используется совместно с разрядами UCSZ1:0 регистра UCSRC. В модулях UART,
если разряд CHR9 установлен в 1, осуществляется передача и прием девятиразрядных данных, если сброшен – восьмиразрядных
1 - бит (RXB8) - 8-й разряд принимаемых данных. При использовании девятиразрядных слов данных этот разряд содержит значение старшего разряда принятого слова. В случае USART содержимое этого разряда должно быть считано до прочтения регистра данных UDR.
0 - бит (TXB8) - 8-й разряд передаваемых данных. При использовании девятиразрядных слов данных содержимое этого разряда является старшим разрядом передаваемого слова. Требуемое значение должно быть занесено в этот разряд до загрузки байта данных в регистр UDR
## Регистр - UCSRC - конфигурация форматов

7 - бит (URSEL) Выбор регистра. Этот разряд определяет, в какой из регистров модуля производится запись. Если разряд установлен в 1, обращение производится к регистру UCSRC. Если же разряд сброшен в 0, обращение производится к регистру UBRRH. (такие пляски случились потоум что места не хватило в памяти на все адреса)
6 - бит (UMSEL) Режим работы USART. 0 – модуль USART работает в асинхронном режиме; 1 – модуль USART работает в синхронном режиме
5, 4 - биты UPM0, UPM1 - определяют работу бита паритета. комбинации 00 и 01 использовать нельзя, они зарезервированы. 10 - паритет формируется по четности, 11 - по нечетности
3 - бит (USBS) Этот разряд определяет количество стоп-битов, посылаемых передатчиком. Разряд в «0» – передатчик посылает 1 стоп-бит, если в 1, то 2 стоп-бита. Для приемника содержимое этого разряда безразлично
2, 1 - биты USBZ1, USBZ0. Вместе с USBZ2 из UCSRB кодируют количество бит в посылке

0 - бит (UCPOL) Полярность тактового сигнала. Значение этого разряда определяет момент выдачи и считывания данных на выводах модуля. Используется только в синхронном режиме. В асинхронном режиме разряд сброшен в 0
## Регистр UBRRX - скорость обмена

URSEL - просто выбирает регистр UBBRH. Оба регистра образуют 12битный регистр UBRR, который хранит скорость передачи данных.
В ассинхронном режиме, а также в синхронном режиме при работе в качестве ведущего скорость приема и передачи данных задается контроллером скорости передачи, функционирующим как делитель системного тактового сигнала с программируемым коэффициентом деления. Коэффициент определяется содержимым регистра контроллера UBRR. В блок приемника сформированный сигнал поступает сразу, а в блок передатчика – через дополнительный делитель, коэффициент деления которого (2, 8 или 16) зависит от режима работы модуля USART/UART. Регистр UBRR является 12-разрядным и физически размещается в двух регистрах ввода/вывода UBRRH и UBRRL.
При работе в асинхронном режиме скорость обмена определяется не только содержимым регистра UBRR, но и состоянием разряда U2X регистра UCSRA. Если этот разряд установлен в 1, коэффициент деления предделителя
уменьшается в два раза, а скорость обмена соответственно удваивается. При работе в синхронном режиме этот разряд должен быть сброшен.
Скорость обмена определяется следующими формулами:
– асинхронный режим (обычный, U2Xn = 0) BAUD = fCK/16(UBRR + 1);
– асинхронный режим (ускоренный, U2Xn = 1) BAUD = fCK/8(UBRR +1);
– синхронный режим ведущего BAUD = fCK/2(UBRR + 1).
Здесь BAUD – скорость передачи в бодах; fCK – тактовая частота
микроконтроллера; UBRR – содержимое регистра контроллера скорости
передачи (0–4095).
## Пример кода инициализации с даташита
```cp=
USART_Init:
; Set baud rate
out UBRRH, r17
out UBRRL, r16
; Enable receiver and transmitter
ldi r16, (1<<RXEN)|(1<<TXEN)
out UCSRB,r16
; Set frame format: 8data, 2stop bit
ldi r16, (1<<URSEL)|(1<<USBS)|(3<<UCSZ0)
out UCSRC,r16
ret
```
## Инициализация с рандомного сайта
```cp=
; Internal Hardware Init ======================================
.equ XTAL = 8000000
.equ baudrate = 9600
.equ bauddivider = XTAL/(16*baudrate)-1
uart_init: LDI R16, low(bauddivider)
OUT UBRRL,R16
LDI R16, high(bauddivider)
OUT UBRRH,R16
LDI R16,0
OUT UCSRA, R16
; Прерывания запрещены, прием-передача разрешен.
LDI R16, (1<<RXEN)|(1<<TXEN)|(0<<RXCIE)|(0<<TXCIE)|(0<<UDRIE)
OUT UCSRB, R16
; Формат кадра - 8 бит, пишем в регистр UCSRC, за это отвечает бит селектор
LDI R16, (1<<URSEL)|(1<<UCSZ0)|(1<<UCSZ1)
OUT UCSRC, R16
```
## Отправка и получение данных с рандомного сайта
```cp=
; Процедура отправки байта
uart_snt: SBIS UCSRA,UDRE ; Пропуск если нет флага готовности
RJMP uart_snt ; ждем готовности - флага UDRE
OUT UDR, R16 ; шлем байт
RET ; Возврат
```
```cp=
;Ожидание байта
uart_rcv: SBIS UCSRA,RXC ; Ждем флага прихода байта
RJMP uart_rcv ; вращаясь в цикле
IN R16,UDR ; байт пришел - забираем.
RET ; Выходим. Результат в R16
```
```cp=
;Посылка байта:
RCALL uart_init ; вызываем нашу процедуру инициализации.
Main: LDI R16,'E' ; загоняем в регистр код буквы «E»
RCALL uart_snt ; Вызываем процедуру отправки байта.
```