usart.s 2.5 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118
  1. ;Incs and Defs---------------------------------------------------------
  2. .include "atm328p.inc"
  3. .include "global.inc"
  4. ;USART-Initialize------------------------------------------------------
  5. .global usart_init
  6. usart_init:
  7. sts UDR0, false ;clear Registers
  8. sts UCSR0A, false
  9. sts UCSR0B, false
  10. sts UCSR0C, false
  11. ldi usart_r, hi8(Baud) ;set Baudrate to 19.2k
  12. sts UBRR0H, usart_r
  13. ldi usart_r, lo8(Baud)
  14. sts UBRR0L, usart_r
  15. ldi usart_r, (1<<UCSZ01)|(1<<UCSZ00) ;8-Bit Character
  16. sts UCSR0C, usart_r ;Aysnchonous USART
  17. ldi usart_r, 0x41 ;init 'ACK'
  18. sts ack_A, usart_r
  19. ldi usart_r, 0x43
  20. sts ack_C, usart_r
  21. ldi usart_r, 0x4B
  22. sts ack_K, usart_r
  23. ldi usart_r, 0x52 ;init 'REQ'
  24. sts req_R, usart_r
  25. ldi usart_r, 0x45
  26. sts req_E, usart_r
  27. ldi usart_r, 0x51
  28. sts req_Q, usart_r
  29. ret
  30. ;RXC-Interrupt-Handler-------------------------------------------------
  31. .global usart_RX
  32. usart_RX:
  33. push usart_r
  34. lds data, UDR0 ;harvest Data
  35. lds usart_r, pagemode ;check for Pagemode
  36. cpse usart_r, true
  37. rjmp RX_req
  38. RX_page: ;Receive Page
  39. st X+, data ;store Data
  40. cpi X_l, 0x40 ;check for End of Page
  41. brne RX_def
  42. sts pagemode, false
  43. rjmp RX_def
  44. RX_req: ;Receive Request
  45. ld usart_r, X
  46. cp usart_r, data ;check for Request
  47. brne RX_def
  48. adiw X_l, 1 ;increment Pointer-pos
  49. cpi X_l, 0x26 ;check for REC-complete
  50. brne RX_def
  51. sts req_complete, true
  52. RX_def:
  53. lds usart_r, UCSR0B
  54. cbr usart_r, 1<<RXCIE0 ;RXCI disable
  55. sbr usart_r, 1<<UDRIE0 ;UDREI enable
  56. sts UCSR0B, usart_r
  57. pop usart_r
  58. reti
  59. ;UDRE-Interrupt-Handler------------------------------------------------
  60. .global usart_UDRE
  61. usart_UDRE:
  62. push usart_r
  63. lds usart_r, UCSR0B
  64. cbr usart_r, 1<<UDRIE0 ;disable UDREI
  65. sbrc usart_r, RXEN0 ;choose USART-Mode
  66. rjmp UDRE_receive
  67. sbrc usart_r, TXEN0
  68. rjmp UDRE_transmit
  69. rjmp UDRE_def
  70. UDRE_receive:
  71. sbr usart_r, 1<<RXCIE0 ;enable RXCI
  72. rjmp UDRE_def
  73. UDRE_transmit:
  74. ld data, X
  75. sbr usart_r, 1<<TXCIE0 ;enable TXCI
  76. sts UDR0, data ;send Data
  77. adiw X_l, 1
  78. cpi X_l, 0x23 ;check for ACK-send
  79. brne UDRE_def
  80. sts ack_complete, true
  81. rjmp UDRE_def
  82. UDRE_def:
  83. sts UCSR0B, usart_r
  84. pop usart_r
  85. reti
  86. ;TXC-Interrupt-Handler-------------------------------------------------
  87. .global usart_TX
  88. usart_TX:
  89. push usart_r
  90. lds usart_r, UCSR0B
  91. sbr usart_r, 1<<UDRIE0 ;enable UDRIE
  92. cbr usart_r, 1<<TXCIE0 ;disable TXCIE
  93. sts UCSR0B, usart_r
  94. pop usart_r
  95. reti