; инитим USART
; при тактовой 1МГц и скорости 9600 бод мин погрешность 0.2% при U2X=1 и
; UBRR=12 (мануал стр.161-164). установим бодрейт:
	outi	UBRRH,0
	outi	UBRRL,12
	outi	UCSRA,1<<U2X
; установим формат кадра: 8data, 1stop bit
	outi	UCSRC,(1<<URSEL)|(0<<USBS)|(3<<UCSZ0)

; включим приёмник и передатчик
	outi	UCSRB,(1<<RXEN)|(1<<TXEN)

вероятно, включать передатчик стоит только на то время, пока передаём данные

нужно нарисовать универсальные процедуры на прерываниях для приёма-передачи
передавать или один символ в регистре
или адрес строки в озу/еепром/пзу

-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-
http://easyelectronics.ru/avr-uchebnyj-kurs-peredacha-dannyx-cherez-uart.html

UCSRA
биты RXC и TXC это флаги завершения приема и передачи, соответственно
Биты UDRE сигнализирует о том, что регистр UDR приемника пуст и в него можно
пихать новый байт
U2X - это бит удвоения скорости при работе в ассинхронном режиме


UCSRB
биты RXEN и TXEN — разрешение приема и передачи. Стоит их сбросить как выводы UART
тут же становятся обычными ножками I/O.
Биты RXCIE, TXCIE, UDRIE разрешают прерывания по завершению приема, передачи
и опустошении буфера передачи UDR

UCSRC
Самый прикол тут — это бит селектора URSEL дело в том, что по неизвестной
причине создаетели решили сэкономить байт адреса и разместили регистры UCSRC
и UBRRH в одной адресном пространстве. А как же определять куда записать? А
по старшему биту! Поясню на примере. Если мы записываем число у которого
седьмой бит равен 1, то оно попадет в UCSRC, а если 0 то UBRRH. Причем этот
бит есть не во всех AVR в новых моделях его нет, а регистры имеют разные
адреса. Так что надо смотреть в даташите этот момент — есть там бит URSEL или
нет.
Остальные биты задают число стопов, наличие и тип контроля четности. Если
оставить все по дефолту то будет стандартный режим. Надо только выставить
формат посылки. Делается это битами UCSZ0, UCSZ1 и UCSZ2 (этот бит тусуется в
регистре UCSRB). Для стандартной 8ми битной посылки туда надо записать две
единички.


Скорость обмена.
Тут все зависит от пары UBBRx
Вычисляется требуемое значение по формуле:
	UBBR=XTAL/(16*baudrate)-1 для U2X=0
	UBBR=XTAL/(8*baudrate)-1 для U2X=1
Где:
XTAL - рабочая тактовая частота контроллера.
baudrate - требуемая скорость, чем медленней тем надежней,
	9600 в большинстве случаев хватает


вариант обработчика на приём:
-----------------------------------------------------------------------------
RX_OK:	PUSHF			; Макрос, пихающий в стек SREG и R16

	IN	R16,UDR		; Тут главное забрать байт из UDR иначе
				; флаг прерывания не снимется
				; Дальше, если время позволяет, можно и обработать

	CPI	R16,Value	; Например, разобрать по байтам и выполнить действие
	BRNE	NXT		; Обычным CASE оператором.
	Action1			; Делаем что нибудь ценное. Главное не забыть в стеке
				; Регистры попрятать. А то будет тебе упячка.
	; здесь можно обрабатывать команды

NXT:	CPI	R16,Value2
	BRNE	RX_Exit
	Action2			; Делаем что нибудь ценное2
	; а здесь, если не команда, сохранять байты в буффер

Rx_Exit:
	POPF			; Достаем SREG и R16
	RETI
-----------------------------------------------------------------------------
