main.s 6.4 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228229230231232233234235236237238239240241242243244245246247248249250251252253254255256257
  1. ;Incs and Defs---------------------------------------------------------
  2. .include "atm328p.inc"
  3. .include "global.inc"
  4. ;++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++
  5. ;Main Programm
  6. .global main
  7. main:
  8. ldi main_r, lo8(RAMEND) ;Stackpointer
  9. out SPL, main_r
  10. ldi main_r, hi8(RAMEND)
  11. out SPH, main_r
  12. clr false ;set Registers
  13. ser true
  14. call usart_init; ;init USART
  15. ldi main_r, (1<<PC0)|(1<<PC1)|(1<<PC2)|(1<<PC3)|(1<<PC4)|(1<<PC5)
  16. out DDRC, main_r ;init I/O
  17. out PORTC, false
  18. sei ;enable Interrupts
  19. rjmp mode_select ;select Mode
  20. rjmp .-2 ;Endlosschleife
  21. cli ;disable Interrupts
  22. ;++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++
  23. ;Mode Selection
  24. mode_select:
  25. ldi main_r, 1<<PC0 ;Signal State
  26. out PORTC, main_r
  27. ;Receive Frame----------------------------------------------------------
  28. ldi timer2_r, (1<<CS22)|(1<<CS21)|(1<<CS20) ;set Prescaler
  29. sts TCCR2B, timer2_r ;x1024 (60Hz)
  30. sts timer2_bool, false ;reset Timer
  31. ldi timer2_r, 6 ;init Time 100ms
  32. sts timer2_MAX, timer2_r
  33. ldi timer2_r, 1<<TOIE2 ;Timer2-OVF enable
  34. sts TIMSK2, timer2_r
  35. ldi X_l, lo8(cmd_ptr) ;set Command-Ptr
  36. ldi X_h, hi8(cmd_ptr)
  37. lds usart_r, UCSR0B ;activate Receiver
  38. sbr usart_r, (1<<RXEN0)|(1<<RXCIE0)
  39. sts UCSR0B, usart_r
  40. timeout_1:
  41. lds main_r, timer2_bool ;check for Timeout
  42. cpse main_r, true
  43. rjmp .+8
  44. ldi X_l, lo8(cmd_ptr) ;reset Command-Ptr
  45. ldi X_h, hi8(cmd_ptr)
  46. sts frame_cnt, false ;reset Frame cnt
  47. lds usart_r, frame_cnt
  48. cpi usart_r, 0x03 ;check if Frame rec
  49. brne timeout_1
  50. sts TIMSK2, false ;Timer2-OVF disable
  51. lds usart_r, UCSR0B ;disable Receiver
  52. cbr usart_r, (1<<RXEN0)|(1<<RXCIE0)
  53. sts UCSR0B, usart_r
  54. sts UDR0, false ;clear UDR
  55. sts frame_cnt, false ;reset Frame cnt
  56. call cmd_rebuild ;read Cmd
  57. ;Select Mode------------------------------------------------------------
  58. sbrc mode, idle
  59. rjmp mode_select
  60. sbrc mode, prog_enable
  61. call mode_prog_enable
  62. sbrc mode, page_read
  63. jmp mode_page_read
  64. sbrc mode, page_write
  65. rjmp mode_select
  66. sbrc mode, prog_check
  67. rjmp mode_select
  68. ;Send Frame-------------------------------------------------------------
  69. send_fin:
  70. ldi X_l, lo8(cmd_ptr) ;set Command-Ptr
  71. ldi X_h, hi8(cmd_ptr)
  72. lds usart_r, UCSR0B ;enable UDRI
  73. sbr usart_r, 1<<UDRIE0
  74. sts UCSR0B, usart_r
  75. lds usart_r, frame_cnt
  76. cpi usart_r, 0x02 ;check if Frame send
  77. brne .-8
  78. lds usart_r, UCSR0B ;disable TX, TXCI
  79. cbr usart_r, (1<<TXEN0)|(1<<TXCIE0)|(1<<UDRIE0)
  80. sts UCSR0B, usart_r
  81. sts UDR0, false ;clear UDR
  82. sts frame_cnt, false ;reset Frame cnt
  83. rjmp mode_select
  84. ;++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++
  85. ;Cmd rebuild
  86. cmd_rebuild:
  87. lds main_r, cmd_mode ;set Mode
  88. andi main_r, nibble_lo
  89. ldi mode, 0x01
  90. tst main_r
  91. breq .+6
  92. lsl mode
  93. dec main_r
  94. rjmp .-10
  95. clr option ;set Option
  96. lds main_r, cmd_opt_lo
  97. andi main_r, nibble_lo
  98. or option, main_r
  99. lds main_r, cmd_opt_hi
  100. andi main_r, nibble_lo
  101. swap main_r
  102. or option, main_r
  103. brne .+4 ;check valid Mode
  104. jmp mode_select
  105. ret
  106. ;++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++
  107. ;Enable Programming
  108. mode_prog_enable:
  109. ldi main_r, 1<<PC1 ;Signal State
  110. out PORTC, main_r
  111. ;Chip Erase------------------------------------------------------------
  112. ;Programming enable Command--------------------------------------------
  113. ldi timer2_r, 1<<CS22 ;set Prescaler
  114. sts TCCR2B, timer2_r ;x64 (1kHz)
  115. sts timer2_bool, false ;reset Timer
  116. ldi timer2_r, 250 ;init Time 250ms
  117. sts timer2_MAX, timer2_r
  118. ldi timer2_r, 1<<TOIE2 ;Timer2-OVF enable
  119. sts TIMSK2, timer2_r
  120. lds main_r, timer2_bool ;wait for 250ms
  121. cpse main_r, true
  122. rjmp .-8
  123. sts TIMSK2, false ;Timer2-OVF disable
  124. sts cmd_mode, option ;signal Prog enable
  125. jmp send_fin
  126. ;++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++
  127. ;Read Page
  128. mode_page_read:
  129. ldi main_r, 1<<PC2 ;Signal State
  130. out PORTC, main_r
  131. ;Send Acknoledgement---------------------------------------------------
  132. sts cmd_mode, option ;verify Mode
  133. ldi X_l, lo8(cmd_ptr) ;set Command-Ptr
  134. ldi X_h, hi8(cmd_ptr)
  135. lds usart_r, UCSR0B ;enable UDRI
  136. sbr usart_r, 1<<UDRIE0
  137. sts UCSR0B, usart_r
  138. lds usart_r, frame_cnt
  139. cpi usart_r, 0x02 ;check if Frame send
  140. brne .-8
  141. lds usart_r, UCSR0B ;disable TX, TXCI
  142. cbr usart_r, (1<<TXEN0)|(1<<TXCIE0)|(1<<UDRIE0)
  143. sts UCSR0B, usart_r
  144. sts UDR0, false ;clear UDR
  145. sts frame_cnt, false ;reset Frame cnt
  146. ;Read Page-------------------------------------------------------------
  147. ldi timer2_r, (1<<CS22)|(1<<CS21)|(1<<CS20) ;set Prescaler
  148. sts TCCR2B, timer2_r ;x1024 (60Hz)
  149. sts timer2_bool, false ;reset Timer
  150. ldi timer2_r, 60 ;init Time 1s
  151. sts timer2_MAX, timer2_r
  152. ldi timer2_r, 1<<TOIE2 ;Timer2-OVF enable
  153. sts TIMSK2, timer2_r
  154. ldi X_l, lo8(page_ptr) ;set Page-Ptr
  155. ldi X_h, hi8(page_ptr)
  156. lds usart_r, UCSR0B ;activate Receiver
  157. sbr usart_r, (1<<RXEN0)|(1<<RXCIE0)
  158. sts UCSR0B, usart_r
  159. timeout_2:
  160. lds main_r, timer2_bool ;check for Timeout
  161. cpse main_r, true
  162. rjmp .+12
  163. lds usart_r, UCSR0B ;disable Receiver
  164. cbr usart_r, (1<<RXEN0)|(1<<RXCIE0)
  165. sts UCSR0B, usart_r
  166. rjmp mode_page_read
  167. lds usart_r, frame_cnt
  168. mov main_r, option
  169. lsl main_r
  170. cp usart_r, main_r ;check if Page rec
  171. brne timeout_2
  172. sts TIMSK2, false ;Timer2-OVF disable
  173. lds usart_r, UCSR0B ;disable Receiver
  174. cbr usart_r, (1<<RXEN0)|(1<<RXCIE0)
  175. sts UCSR0B, usart_r
  176. sts UDR0, false ;clear UDR
  177. sts frame_cnt, false ;reset Frame cnt
  178. ;Rebuild Page-----------------------------------------------------------
  179. ldi X_l, lo8(page_ptr) ;set Pointer
  180. ldi X_h, hi8(page_ptr) ;for Rebuild
  181. ldi Y_l, lo8(page_ptr)
  182. inc Y_l
  183. ldi Y_h, hi8(page_ptr)
  184. ldi Z_l, lo8(page_ptr)
  185. ldi Z_h, hi8(page_ptr)
  186. page_rebuild:
  187. ld main_r, X ;Remove Mask and
  188. adiw X_l, 2 ;reconstruct Bytes
  189. ld usart_r, Y
  190. adiw Y_l, 2
  191. andi main_r, nibble_lo
  192. andi usart_r, nibble_lo
  193. swap usart_r
  194. or main_r, usart_r
  195. st Z+, main_r
  196. dec option
  197. brne page_rebuild
  198. ldi main_r, frame_mask ;signal Page rec
  199. sts cmd_mode, main_r ;by sending mask
  200. jmp send_fin