prjbrook

usi2l.asm Nice version of USI Tx and Rx at 9600

Oct 25th, 2014
276
0
Never
Not a member of Pastebin yet? Sign Up, it unlocks many cool features!
text 3.24 KB | None | 0 0
  1. .include "tn85def.inc" ;usi2l: This version is cut down and works at 9600 baud
  2. again:
  3. ldi r16, low(RAMEND)
  4. out SPL, r16
  5. ldi r16,high(RAMEND)
  6. out SPH, r16
  7. top:
  8. ldi r16,$ff
  9. out DDRB,r16
  10. out PORTB,r16
  11. ldi r19,(1<<USIWM0)|(0<<USICS0) ;need this otherwise msb not initially joined to D0
  12. out USICR,r19
  13.  
  14. rjmp test_usiRxT
  15. ;----------------------------------------
  16. reverseBits: ;r16 gets reversed
  17. push r17
  18. push r18
  19. ldi r18,8
  20. ldi r17,0
  21. uprb:
  22. lsl r16
  23. ror r17
  24. dec r18
  25. brne uprb
  26. mov r16,r17
  27. pop r18
  28. pop r17
  29. ret
  30. ;-----------------------
  31. split62: ;split r16 into two bytes, r16 and r17 where r16 contains first 6 bits preceded by
  32. ldi r17,$ff
  33. clc
  34. ror r16
  35. ror r17
  36. sec
  37. ror r16
  38. ror r17
  39. ret
  40. rjmp split62
  41. ;-------------------------
  42. waitForPin0Low:
  43. sbic PINB,0
  44. rjmp waitForPin0Low
  45. ret ;when pin PB1 goes low
  46. ;------------------------
  47.  
  48. waitForPin0High:
  49. sbis PINB,0
  50. rjmp waitForPin0High
  51. ret ;when pin PB1 goes high
  52. ;-------------------------------------
  53. startTim0:
  54. LDI r16,0b0000_0010 ; 3=/64 4 = /256 SET TIMER PRESCALER TO /1024, 03 is /64
  55. OUT TCCR0B,r16
  56. ret ;with timer now started
  57. ;-----------------------------------------------
  58. stopTim0:
  59. LDI r16,0b0000_0000 ;Stop TIMER
  60. OUT TCCR0B,r16
  61. ret ;with timer now stopped
  62. ;-----------------------------------------------
  63. USITransfer_Fast3: ;USES TIMER0:
  64. out USIDR,r16
  65. ldi r19,(1<<USIWM0)|(0<<USICS0)|(1<<USITC)|(1<<USICLK)
  66. ldi r18,8
  67. LDI r16,0b0000_0010 ; 2=/8 3=/64 4 = /256 5= /1024 2=/8 SET TIMER PRESCALER TO /1024,
  68. OUT TCCR0B,r16 ;start tim0
  69. upt23:
  70. rcall clrTCNT0
  71. rcall waitTilTim0Fin
  72. out USICR,r19
  73. dec r18
  74. brne upt23
  75. ret
  76. ;---------------------------------------
  77. clrTCNT0:
  78. clr r16
  79. out TCNT0,r16
  80. ret
  81. ;---------------------***--
  82. waitTilTim0Fin: ;wait til timer 0 counts up to top value
  83. in r16,TCNT0
  84. cpi r16,104 ;Now try 104 /8 9600? Yes, worked.
  85. brne waitTilTim0Fin
  86. ret
  87. ;-----------------------
  88. waitHalfBit: ;wait til timer 0 counts to half above
  89. rcall clrTCNT0 ;this took 2 days to insert.
  90. rcall startTim0
  91. whb:
  92. in r16,TCNT0
  93. cpi r16,104/2
  94. brne whb
  95. rcall stopTim0
  96. ret ;used during start bit rx
  97. ;-----------------------------------------------------
  98. usiTxT: ;uses timer0. Byte to be sent is in r16
  99. ldi r17,$ff ;make r1 an output as this stage. Can interfere with Rx
  100. out DDRB,r17
  101. rcall reverseBits ;needed
  102. rcall split62 ;now have (10 + 6lsbs) + (2 msbs + 6Stops) in r116,r17
  103. rcall USITransfer_Fast3 ;there's the r16 gone
  104. mov r16,r17
  105. rcall USITransfer_Fast3 ;and the r17.
  106. LDI r16,0b0000_0000 ;stop timer,
  107. OUT TCCR0B,r16
  108. ret ;with r16 having been sent via USI Tx
  109. ;--------------------------------------
  110. usiRxT: ;input a byte serially via PB0 using usi
  111. ldi r16,$fc
  112. out DDRB,r16 ;make both Tx,Rx inputs to stop interference
  113. rcall waitForPin0High
  114. rcall waitForPin0Low ;2
  115. rcall waitHalfBit
  116. ldi r16,$ff
  117. out PORTB,r16 ;fill usi data reg with 1's so no start bits come out while shifting
  118. rcall USITransfer_Fast3 ;do 8 shifts into usidr from PB0. Emerge with byte in usidr
  119. in r16,USIDR
  120. rcall reverseBits ;needed
  121. rcall usiTxT ;display byte.
  122. ret
  123. ;------------------------
  124. test_usiRxT: ;worked
  125. rcall usiRxT
  126. rjmp test_usiRxT
Advertisement
Add Comment
Please, Sign In to add comment