main.s 6.4 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228229230231232233234235236237238239240241242243244245246247248249250251252253254255256
  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. call 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. ldi X_l, lo8(cmd_ptr) ;set Command-Ptr
  70. ldi X_h, hi8(cmd_ptr)
  71. lds usart_r, UCSR0B ;enable UDRI
  72. sbr usart_r, 1<<UDRIE0
  73. sts UCSR0B, usart_r
  74. lds usart_r, frame_cnt
  75. cpi usart_r, 0x02 ;check if Frame send
  76. brne .-8
  77. lds usart_r, UCSR0B ;disable TX, TXCI
  78. cbr usart_r, (1<<TXEN0)|(1<<TXCIE0)|(1<<UDRIE0)
  79. sts UCSR0B, usart_r
  80. sts UDR0, false ;clear UDR
  81. sts frame_cnt, false ;reset Frame cnt
  82. rjmp mode_select
  83. ;++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++
  84. ;Cmd rebuild
  85. cmd_rebuild:
  86. lds main_r, cmd_mode ;set Mode
  87. andi main_r, nibble_lo
  88. ldi mode, 0x01
  89. tst main_r
  90. breq .+6
  91. lsl mode
  92. dec main_r
  93. rjmp .-10
  94. clr option ;set Option
  95. lds main_r, cmd_opt_lo
  96. andi main_r, nibble_lo
  97. or option, main_r
  98. lds main_r, cmd_opt_hi
  99. andi main_r, nibble_lo
  100. swap main_r
  101. or option, main_r
  102. brne .+4 ;check valid Mode
  103. jmp mode_select
  104. ret
  105. ;++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++
  106. ;Enable Programming
  107. mode_prog_enable:
  108. ldi main_r, 1<<PC1 ;Signal State
  109. out PORTC, main_r
  110. ;Chip Erase------------------------------------------------------------
  111. ;Programming enable Command--------------------------------------------
  112. ldi timer2_r, 1<<CS22 ;set Prescaler
  113. sts TCCR2B, timer2_r ;x64 (1kHz)
  114. sts timer2_bool, false ;reset Timer
  115. ldi timer2_r, 250 ;init Time 250ms
  116. sts timer2_MAX, timer2_r
  117. ldi timer2_r, 1<<TOIE2 ;Timer2-OVF enable
  118. sts TIMSK2, timer2_r
  119. lds main_r, timer2_bool ;wait for 250ms
  120. cpse main_r, true
  121. rjmp .-8
  122. sts TIMSK2, false ;Timer2-OVF disable
  123. sts cmd_mode, option ;signal Prog enable
  124. ret
  125. ;++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++
  126. ;Read Page
  127. mode_page_read:
  128. ldi main_r, 1<<PC2 ;Signal State
  129. out PORTC, main_r
  130. ;Send Acknoledgement---------------------------------------------------
  131. sts cmd_mode, option ;verify Mode
  132. ldi X_l, lo8(cmd_ptr) ;set Command-Ptr
  133. ldi X_h, hi8(cmd_ptr)
  134. lds usart_r, UCSR0B ;enable UDRI
  135. sbr usart_r, 1<<UDRIE0
  136. sts UCSR0B, usart_r
  137. lds usart_r, frame_cnt
  138. cpi usart_r, 0x02 ;check if Frame send
  139. brne .-8
  140. lds usart_r, UCSR0B ;disable TX, TXCI
  141. cbr usart_r, (1<<TXEN0)|(1<<TXCIE0)|(1<<UDRIE0)
  142. sts UCSR0B, usart_r
  143. sts UDR0, false ;clear UDR
  144. sts frame_cnt, false ;reset Frame cnt
  145. ;Read Page-------------------------------------------------------------
  146. ldi timer2_r, (1<<CS22)|(1<<CS21)|(1<<CS20) ;set Prescaler
  147. sts TCCR2B, timer2_r ;x1024 (60Hz)
  148. sts timer2_bool, false ;reset Timer
  149. ldi timer2_r, 60 ;init Time 1s
  150. sts timer2_MAX, timer2_r
  151. ldi timer2_r, 1<<TOIE2 ;Timer2-OVF enable
  152. sts TIMSK2, timer2_r
  153. ldi X_l, lo8(page_ptr) ;set Page-Ptr
  154. ldi X_h, hi8(page_ptr)
  155. lds usart_r, UCSR0B ;activate Receiver
  156. sbr usart_r, (1<<RXEN0)|(1<<RXCIE0)
  157. sts UCSR0B, usart_r
  158. timeout_2:
  159. lds main_r, timer2_bool ;check for Timeout
  160. cpse main_r, true
  161. rjmp .+12
  162. lds usart_r, UCSR0B ;disable Receiver
  163. cbr usart_r, (1<<RXEN0)|(1<<RXCIE0)
  164. sts UCSR0B, usart_r
  165. rjmp mode_page_read
  166. lds usart_r, frame_cnt
  167. mov main_r, option
  168. lsl main_r
  169. cp usart_r, main_r ;check if Page rec
  170. brne timeout_2
  171. sts TIMSK2, false ;Timer2-OVF disable
  172. lds usart_r, UCSR0B ;disable Receiver
  173. cbr usart_r, (1<<RXEN0)|(1<<RXCIE0)
  174. sts UCSR0B, usart_r
  175. sts UDR0, false ;clear UDR
  176. sts frame_cnt, false ;reset Frame cnt
  177. ;Rebuild Page-----------------------------------------------------------
  178. ldi X_l, lo8(page_ptr) ;set Pointer
  179. ldi X_h, hi8(page_ptr) ;for Rebuild
  180. ldi Y_l, lo8(page_ptr)
  181. inc Y_l
  182. ldi Y_h, hi8(page_ptr)
  183. ldi Z_l, lo8(page_ptr)
  184. ldi Z_h, hi8(page_ptr)
  185. page_rebuild:
  186. ld main_r, X ;Remove Mask and
  187. adiw X_l, 2 ;reconstruct Bytes
  188. ld usart_r, Y
  189. adiw Y_l, 2
  190. andi main_r, nibble_lo
  191. andi usart_r, nibble_lo
  192. swap usart_r
  193. or main_r, usart_r
  194. st Z+, main_r
  195. dec option
  196. brne page_rebuild
  197. ldi main_r, frame_mask ;signal Page rec
  198. sts cmd_mode, main_r ;by sending mask
  199. ret