123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384 |
- ; инитим 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
- -----------------------------------------------------------------------------
|