COMasm.S 7.9 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228229230231232233234235236237238239240241242243244245246247248249250251252253254255256257258259260261262263264265266267268269270271272273274275276277278279280281282283284285286287288289290291292293294295296297298299300301302303304305306307308309310311312313314315316317318319320321322323324325326327328329330331332333334335336337338339340341342343344345346347348349350351352353354355356357358359360361
  1. #include <avr/io.h>
  2. #define LEFT_TXDDR DDRA
  3. #define LEFT_TXPORT PORTA
  4. #define LEFT_TXPINNumber PA2
  5. #define LEFT_RXDDR DDRA
  6. #define LEFT_RXPORT PORTA
  7. #define LEFT_RXPIN PINA
  8. #define LEFT_RXPINNumber PA3
  9. #define RIGHT_TXDDR DDRB
  10. #define RIGHT_TXPORT PORTB
  11. #define RIGHT_TXPINNumber PB1
  12. #define RIGHT_RXDDR DDRB
  13. #define RIGHT_RXPORT PORTB
  14. #define RIGHT_RXPIN PINB
  15. #define RIGHT_RXPINNumber PB0
  16. #define UP_TXDDR DDRB
  17. #define UP_TXPORT PORTB
  18. #define UP_TXPINNumber PB2
  19. #define UP_RXDDR DDRA
  20. #define UP_RXPORT PORTA
  21. #define UP_RXPIN PINA
  22. #define UP_RXPINNumber PA7
  23. #define DOWN_TXDDR DDRA
  24. #define DOWN_TXPORT PORTA
  25. #define DOWN_TXPINNumber PA1
  26. #define DOWN_RXDDR DDRA
  27. #define DOWN_RXPORT PORTA
  28. #define DOWN_RXPIN PINA
  29. #define DOWN_RXPINNumber PA0
  30. ;***** Global register variables
  31. ;bit counter
  32. #define bitcnt r16
  33. ;temporary storage register
  34. #define temp r17
  35. ;***************************************************************************
  36. ;*
  37. ;* uart_initASM
  38. ;*
  39. .global COM_initASM
  40. .func COM_initASM
  41. COM_initASM:
  42. sbi _SFR_IO_ADDR(LEFT_TXDDR),LEFT_TXPINNumber
  43. sbi _SFR_IO_ADDR(LEFT_TXPORT),LEFT_TXPINNumber
  44. cbi _SFR_IO_ADDR(LEFT_RXDDR),LEFT_RXPINNumber
  45. sbi _SFR_IO_ADDR(RIGHT_TXDDR),RIGHT_TXPINNumber
  46. sbi _SFR_IO_ADDR(RIGHT_TXPORT),RIGHT_TXPINNumber
  47. cbi _SFR_IO_ADDR(RIGHT_RXDDR),RIGHT_RXPINNumber
  48. sbi _SFR_IO_ADDR(UP_TXDDR),UP_TXPINNumber
  49. sbi _SFR_IO_ADDR(UP_TXPORT),UP_TXPINNumber
  50. cbi _SFR_IO_ADDR(UP_RXDDR),UP_RXPINNumber
  51. sbi _SFR_IO_ADDR(DOWN_TXDDR),DOWN_TXPINNumber
  52. sbi _SFR_IO_ADDR(DOWN_TXPORT),DOWN_TXPINNumber
  53. cbi _SFR_IO_ADDR(DOWN_RXDDR),DOWN_RXPINNumber
  54. ret
  55. .endfunc
  56. ;***************************************************************************
  57. ;*
  58. ;* LEFT_putcASM
  59. ;*
  60. .global LEFT_putcASM
  61. .func LEFT_putcASM
  62. LEFT_putcASM:
  63. ldi bitcnt,10 ;put 10 bits (start+stop+payload
  64. com r24 ;Inverte everything
  65. sec ;Start bit
  66. LEFT_putchar0:
  67. brcc LEFT_putchar1 ;If carry set
  68. cbi _SFR_IO_ADDR(LEFT_TXPORT),LEFT_TXPINNumber ; send a '0'
  69. rjmp LEFT_putchar2 ;else
  70. LEFT_putchar1:
  71. sbi _SFR_IO_ADDR(LEFT_TXPORT),LEFT_TXPINNumber ; send a '1'
  72. nop
  73. LEFT_putchar2:
  74. rcall UART_delay ;One bit delay
  75. rcall UART_delay
  76. lsr r24 ;Get next bit
  77. dec bitcnt ;If not all bit sent
  78. brne LEFT_putchar0 ; send next
  79. ;else
  80. ret ; return
  81. .endfunc
  82. ;***************************************************************************
  83. ;*
  84. ;* LEFT_getcASM
  85. .global LEFT_getcASM
  86. .func LEFT_getcASM
  87. LEFT_getcASM:
  88. ldi bitcnt,9 ;8 data bit + 1 stop bit
  89. LEFT_getchar1:
  90. sbic _SFR_IO_ADDR(LEFT_RXPIN),LEFT_RXPINNumber ;Wait for start bit
  91. rjmp LEFT_getchar1
  92. rcall UART_delay ;0.5 bit delay
  93. LEFT_getchar2:
  94. rcall UART_delay ;1 bit delay
  95. rcall UART_delay
  96. clc ;clear carry
  97. sbic _SFR_IO_ADDR(LEFT_RXPIN),LEFT_RXPINNumber ;if RX pin high
  98. sec ;
  99. dec bitcnt ;If bit is stop bit
  100. breq LEFT_getchar3 ; return
  101. ;else
  102. ror r24 ; shift bit into Rxbyte
  103. rjmp LEFT_getchar2 ; go get next
  104. LEFT_getchar3:
  105. ret
  106. .endfunc
  107. ;***************************************************************************
  108. ;*
  109. ;* RIGHT_putcASM
  110. ;*
  111. .global RIGHT_putcASM
  112. .func RIGHT_putcASM
  113. RIGHT_putcASM:
  114. ldi bitcnt,10 ;put 10 bits (start+stop+payload
  115. com r24 ;Inverte everything
  116. sec ;Start bit
  117. RIGHT_putchar0:
  118. brcc RIGHT_putchar1 ;If carry set
  119. cbi _SFR_IO_ADDR(RIGHT_TXPORT),RIGHT_TXPINNumber ; send a '0'
  120. rjmp RIGHT_putchar2 ;else
  121. RIGHT_putchar1:
  122. sbi _SFR_IO_ADDR(RIGHT_TXPORT),RIGHT_TXPINNumber ; send a '1'
  123. nop
  124. RIGHT_putchar2:
  125. rcall UART_delay ;One bit delay
  126. rcall UART_delay
  127. lsr r24 ;Get next bit
  128. dec bitcnt ;If not all bit sent
  129. brne RIGHT_putchar0 ; send next
  130. ;else
  131. ret ; return
  132. .endfunc
  133. ;***************************************************************************
  134. ;*
  135. ;* RIGHT_getcASM
  136. .global RIGHT_getcASM
  137. .func RIGHT_getcASM
  138. RIGHT_getcASM:
  139. ldi bitcnt,9 ;8 data bit + 1 stop bit
  140. RIGHT_getchar1:
  141. sbic _SFR_IO_ADDR(RIGHT_RXPIN),RIGHT_RXPINNumber ;Wait for start bit
  142. rjmp RIGHT_getchar1
  143. rcall UART_delay ;0.5 bit delay
  144. RIGHT_getchar2:
  145. rcall UART_delay ;1 bit delay
  146. rcall UART_delay
  147. clc ;clear carry
  148. sbic _SFR_IO_ADDR(RIGHT_RXPIN),RIGHT_RXPINNumber ;if RX pin high
  149. sec ;
  150. dec bitcnt ;If bit is stop bit
  151. breq RIGHT_getchar3 ; return
  152. ;else
  153. ror r24 ; shift bit into Rxbyte
  154. rjmp RIGHT_getchar2 ; go get next
  155. RIGHT_getchar3:
  156. ret
  157. .endfunc
  158. ;***************************************************************************
  159. ;*
  160. ;* UP_putcASM
  161. ;*
  162. .global UP_putcASM
  163. .func UP_putcASM
  164. UP_putcASM:
  165. ldi bitcnt,10 ;put 10 bits (start+stop+payload
  166. com r24 ;Inverte everything
  167. sec ;Start bit
  168. UP_putchar0:
  169. brcc UP_putchar1 ;If carry set
  170. cbi _SFR_IO_ADDR(UP_TXPORT),UP_TXPINNumber ; send a '0'
  171. rjmp UP_putchar2 ;else
  172. UP_putchar1:
  173. sbi _SFR_IO_ADDR(UP_TXPORT),UP_TXPINNumber ; send a '1'
  174. nop
  175. UP_putchar2:
  176. rcall UART_delay ;One bit delay
  177. rcall UART_delay
  178. lsr r24 ;Get next bit
  179. dec bitcnt ;If not all bit sent
  180. brne UP_putchar0 ; send next
  181. ;else
  182. ret ; return
  183. .endfunc
  184. ;***************************************************************************
  185. ;*
  186. ;* UP_getcASM
  187. .global UP_getcASM
  188. .func UP_getcASM
  189. UP_getcASM:
  190. ldi bitcnt,9 ;8 data bit + 1 stop bit
  191. UP_getchar1:
  192. sbic _SFR_IO_ADDR(UP_RXPIN),UP_RXPINNumber ;Wait for start bit
  193. rjmp UP_getchar1
  194. rcall UART_delay ;0.5 bit delay
  195. UP_getchar2:
  196. rcall UART_delay ;1 bit delay
  197. rcall UART_delay
  198. clc ;clear carry
  199. sbic _SFR_IO_ADDR(UP_RXPIN),UP_RXPINNumber ;if RX pin high
  200. sec ;
  201. dec bitcnt ;If bit is stop bit
  202. breq UP_getchar3 ; return
  203. ;else
  204. ror r24 ; shift bit into Rxbyte
  205. rjmp UP_getchar2 ; go get next
  206. UP_getchar3:
  207. ret
  208. .endfunc
  209. ;***************************************************************************
  210. ;*
  211. ;* DOWN_putcASM
  212. ;*
  213. .global DOWN_putcASM
  214. .func DOWN_putcASM
  215. DOWN_putcASM:
  216. ldi bitcnt,10 ;put 10 bits (start+stop+payload
  217. com r24 ;Inverte everything
  218. sec ;Start bit
  219. DOWN_putchar0:
  220. brcc DOWN_putchar1 ;If carry set
  221. cbi _SFR_IO_ADDR(DOWN_TXPORT),DOWN_TXPINNumber ; send a '0'
  222. rjmp DOWN_putchar2 ;else
  223. DOWN_putchar1:
  224. sbi _SFR_IO_ADDR(DOWN_TXPORT),DOWN_TXPINNumber ; send a '1'
  225. nop
  226. DOWN_putchar2:
  227. rcall UART_delay ;One bit delay
  228. rcall UART_delay
  229. lsr r24 ;Get next bit
  230. dec bitcnt ;If not all bit sent
  231. brne DOWN_putchar0 ; send next
  232. ;else
  233. ret ; return
  234. .endfunc
  235. ;***************************************************************************
  236. ;*
  237. ;* DOWN_getc
  238. .global DOWN_getcASM
  239. .func DOWN_getcASM
  240. DOWN_getcASM:
  241. ldi bitcnt,9 ;8 data bit + 1 stop bit
  242. DOWN_getchar1:
  243. sbic _SFR_IO_ADDR(DOWN_RXPIN),DOWN_RXPINNumber ;Wait for start bit
  244. rjmp DOWN_getchar1
  245. rcall UART_delay ;0.5 bit delay
  246. DOWN_getchar2:
  247. rcall UART_delay ;1 bit delay
  248. rcall UART_delay
  249. clc ;clear carry
  250. sbic _SFR_IO_ADDR(DOWN_RXPIN),DOWN_RXPINNumber ;if RX pin high
  251. sec ;
  252. dec bitcnt ;If bit is stop bit
  253. breq DOWN_getchar3 ; return
  254. ;else
  255. ror r24 ; shift bit into Rxbyte
  256. rjmp DOWN_getchar2 ; go get next
  257. DOWN_getchar3:
  258. ret
  259. .endfunc
  260. ;***************************************************************************
  261. ;*
  262. ;* "UART_delay"
  263. ;***************************************************************************
  264. ; Some b values: (See also table in Appnote documentation)
  265. ;
  266. ; 1 MHz crystal:
  267. ; 9600 bps - b=14
  268. ; 19200 bps - b=5
  269. ; 28800 bps - b=2
  270. ;
  271. ; 2 MHz crystal:
  272. ; 19200 bps - b=14
  273. ; 28800 bps - b=8
  274. ; 57600 bps - b=2
  275. ; 4 MHz crystal:
  276. ; 19200 bps - b=31
  277. ; 28800 bps - b=19
  278. ; 57600 bps - b=8
  279. ; 115200 bps - b=2
  280. ;.equ b =31 ;19200 bps @ 4 MHz crystal
  281. b =14 ;9600 bps @ 1 MHz crystal
  282. ;b =8 ;115000 bps @ 8 MHz crystal
  283. UART_delay:
  284. ldi temp,b
  285. UART_delay1:
  286. dec temp
  287. brne UART_delay1
  288. ret