usart.s 1.6 KB

12345678910111213141516171819202122232425262728293031323334353637383940414243444546474849505152535455565758596061626364
  1. ;Incs and Defs---------------------------------------------------------
  2. .include "atm328p.inc"
  3. .include "global.inc"
  4. ;++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++
  5. ;USART-Initialize
  6. .global usart_init
  7. usart_init:
  8. sts UDR0, false ;clear Registers
  9. sts UCSR0A, false
  10. sts UCSR0B, false
  11. sts UCSR0C, false
  12. ldi usart_r, hi8(Baud) ;set Baudrate
  13. sts UBRR0H, usart_r ;to 19.2k
  14. ldi usart_r, lo8(Baud)
  15. sts UBRR0L, usart_r
  16. ldi usart_r, (1<<UCSZ01)|(1<<UCSZ00) ;8-Bit Character
  17. sts UCSR0C, usart_r ;Aysnchonous USART
  18. ret
  19. ;++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++
  20. ;RXC-Interrupt-Handler
  21. .global usart_RXC
  22. usart_RXC:
  23. push usart_r
  24. lds frame, UDR0 ;read Frame
  25. mov usart_r, frame
  26. andi usart_r, nibble_hi ;check Frame
  27. cpi usart_r, frame_mask
  28. brne .+2
  29. st X+, frame ;store Frame
  30. pop usart_r
  31. reti
  32. ;++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++
  33. ;UDRE-Interrupt-Handler
  34. .global usart_UDRE
  35. usart_UDRE:
  36. push usart_r
  37. ld frame, X+ ;load new Frame
  38. sts UDR0, frame ;set Frame
  39. lds usart_r, UCSR0B
  40. cbr usart_r, 1<<UDRIE0 ;disable UDREI
  41. sbr usart_r, (1<<TXEN0)|(1<<TXCIE0) ;enable TX, TXCI
  42. sts UCSR0B, usart_r
  43. pop usart_r
  44. reti
  45. ;++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++
  46. ;TXC-Interrupt-Handler
  47. .global usart_TXC
  48. usart_TXC:
  49. push usart_r
  50. lds usart_r, UCSR0B
  51. cbr usart_r, (1<<TXEN0)|(1<<TXCIE0) ;disable TX, TXCI
  52. sbr usart_r, 1<<UDRIE0 ;enable UDREI
  53. sts UCSR0B, usart_r
  54. pop usart_r
  55. reti