usart.txt 4.9 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384
  1. ; инитим USART
  2. ; при тактовой 1МГц и скорости 9600 бод мин погрешность 0.2% при U2X=1 и
  3. ; UBRR=12 (мануал стр.161-164). установим бодрейт:
  4. outi UBRRH,0
  5. outi UBRRL,12
  6. outi UCSRA,1<<U2X
  7. ; установим формат кадра: 8data, 1stop bit
  8. outi UCSRC,(1<<URSEL)|(0<<USBS)|(3<<UCSZ0)
  9. ; включим приёмник и передатчик
  10. outi UCSRB,(1<<RXEN)|(1<<TXEN)
  11. вероятно, включать передатчик стоит только на то время, пока передаём данные
  12. нужно нарисовать универсальные процедуры на прерываниях для приёма-передачи
  13. передавать или один символ в регистре
  14. или адрес строки в озу/еепром/пзу
  15. -=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-
  16. http://easyelectronics.ru/avr-uchebnyj-kurs-peredacha-dannyx-cherez-uart.html
  17. UCSRA
  18. биты RXC и TXC это флаги завершения приема и передачи, соответственно
  19. Биты UDRE сигнализирует о том, что регистр UDR приемника пуст и в него можно
  20. пихать новый байт
  21. U2X - это бит удвоения скорости при работе в ассинхронном режиме
  22. UCSRB
  23. биты RXEN и TXEN — разрешение приема и передачи. Стоит их сбросить как выводы UART
  24. тут же становятся обычными ножками I/O.
  25. Биты RXCIE, TXCIE, UDRIE разрешают прерывания по завершению приема, передачи
  26. и опустошении буфера передачи UDR
  27. UCSRC
  28. Самый прикол тут — это бит селектора URSEL дело в том, что по неизвестной
  29. причине создаетели решили сэкономить байт адреса и разместили регистры UCSRC
  30. и UBRRH в одной адресном пространстве. А как же определять куда записать? А
  31. по старшему биту! Поясню на примере. Если мы записываем число у которого
  32. седьмой бит равен 1, то оно попадет в UCSRC, а если 0 то UBRRH. Причем этот
  33. бит есть не во всех AVR в новых моделях его нет, а регистры имеют разные
  34. адреса. Так что надо смотреть в даташите этот момент — есть там бит URSEL или
  35. нет.
  36. Остальные биты задают число стопов, наличие и тип контроля четности. Если
  37. оставить все по дефолту то будет стандартный режим. Надо только выставить
  38. формат посылки. Делается это битами UCSZ0, UCSZ1 и UCSZ2 (этот бит тусуется в
  39. регистре UCSRB). Для стандартной 8ми битной посылки туда надо записать две
  40. единички.
  41. Скорость обмена.
  42. Тут все зависит от пары UBBRx
  43. Вычисляется требуемое значение по формуле:
  44. UBBR=XTAL/(16*baudrate)-1 для U2X=0
  45. UBBR=XTAL/(8*baudrate)-1 для U2X=1
  46. Где:
  47. XTAL - рабочая тактовая частота контроллера.
  48. baudrate - требуемая скорость, чем медленней тем надежней,
  49. 9600 в большинстве случаев хватает
  50. вариант обработчика на приём:
  51. -----------------------------------------------------------------------------
  52. RX_OK: PUSHF ; Макрос, пихающий в стек SREG и R16
  53. IN R16,UDR ; Тут главное забрать байт из UDR иначе
  54. ; флаг прерывания не снимется
  55. ; Дальше, если время позволяет, можно и обработать
  56. CPI R16,Value ; Например, разобрать по байтам и выполнить действие
  57. BRNE NXT ; Обычным CASE оператором.
  58. Action1 ; Делаем что нибудь ценное. Главное не забыть в стеке
  59. ; Регистры попрятать. А то будет тебе упячка.
  60. ; здесь можно обрабатывать команды
  61. NXT: CPI R16,Value2
  62. BRNE RX_Exit
  63. Action2 ; Делаем что нибудь ценное2
  64. ; а здесь, если не команда, сохранять байты в буффер
  65. Rx_Exit:
  66. POPF ; Достаем SREG и R16
  67. RETI
  68. -----------------------------------------------------------------------------