main.s 4.7 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200
  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)
  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. sbi PORTC, PC0 ;Signal State
  26. ;Receive Frame----------------------------------------------------------
  27. ldi X_l, lo8(cmd_ptr) ;set Command-Ptr
  28. ldi X_h, hi8(cmd_ptr)
  29. lds usart_r, UCSR0B ;activate Receiver
  30. sbr usart_r, (1<<RXEN0)|(1<<RXCIE0)
  31. sts UCSR0B, usart_r
  32. lds usart_r, frame_cnt
  33. cpi usart_r, 0x03 ;check if Frame rec
  34. brne .-8
  35. lds usart_r, UCSR0B ;disable Receiver
  36. cbr usart_r, (1<<RXEN0)|(1<<RXCIE0)
  37. sts UCSR0B, usart_r
  38. sts UDR0, false ;clear UDR
  39. sts frame_cnt, false ;reset Frame cnt
  40. call cmd_rebuild ;read Cmd
  41. ;Select Mode------------------------------------------------------------
  42. sbrc mode, fuse_read
  43. rjmp mode_select
  44. sbrc mode, fuse_write
  45. rjmp mode_select
  46. sbrc mode, page_read
  47. call mode_page_read
  48. sbrc mode, page_write
  49. rjmp mode_select
  50. sbrc mode, prog_read
  51. rjmp mode_select
  52. ;Send Frame-------------------------------------------------------------
  53. ldi X_l, lo8(cmd_ptr) ;set Command-Ptr
  54. ldi X_h, hi8(cmd_ptr)
  55. lds usart_r, UCSR0B ;enable UDRI
  56. sbr usart_r, 1<<UDRIE0
  57. sts UCSR0B, usart_r
  58. lds usart_r, frame_cnt
  59. cpi usart_r, 0x04 ;check if Frame send
  60. brne .-8
  61. lds usart_r, UCSR0B ;disable TX, TXCI
  62. cbr usart_r, (1<<TXEN0)|(1<<TXCIE0)|(1<<UDRIE0)
  63. sts UCSR0B, usart_r
  64. sts UDR0, false ;clear UDR
  65. sts frame_cnt, false ;reset Frame cnt
  66. sbi PORTC, PC4 ;Signal State
  67. rjmp mode_select
  68. ;++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++
  69. ;Cmd rebuild
  70. cmd_rebuild:
  71. sbi PORTC, PC1 ;Signal State
  72. lds main_r, cmd_mode ;set Mode
  73. andi main_r, nibble_lo
  74. ldi mode, 0x01
  75. tst main_r
  76. breq .+6
  77. lsl mode
  78. dec main_r
  79. rjmp .-10
  80. clr option ;set Option
  81. lds main_r, cmd_opt_lo
  82. andi main_r, nibble_lo
  83. or option, main_r
  84. lds main_r, cmd_opt_hi
  85. andi main_r, nibble_lo
  86. swap main_r
  87. or option, main_r
  88. brne .+4 ;check valid Mode
  89. jmp mode_select
  90. ret
  91. ;++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++
  92. ;Read Page
  93. mode_page_read:
  94. sbi PORTC, PC2 ;Signal State
  95. ;Send Acknoledgement---------------------------------------------------
  96. sts cmd_mode, option ;verify Mode
  97. sts cmd_opt_lo, option
  98. sts cmd_opt_hi, option
  99. ldi X_l, lo8(cmd_ptr) ;set Command-Ptr
  100. ldi X_h, hi8(cmd_ptr)
  101. lds usart_r, UCSR0B ;enable UDRI
  102. sbr usart_r, 1<<UDRIE0
  103. sts UCSR0B, usart_r
  104. lds usart_r, frame_cnt
  105. cpi usart_r, 0x04 ;check if Frame send
  106. brne .-8
  107. lds usart_r, UCSR0B ;disable TX, TXCI
  108. cbr usart_r, (1<<TXEN0)|(1<<TXCIE0)|(1<<UDRIE0)
  109. sts UCSR0B, usart_r
  110. sts UDR0, false ;clear UDR
  111. sts frame_cnt, false ;reset Frame cnt
  112. ;Read Page-------------------------------------------------------------
  113. ldi X_l, lo8(page_ptr) ;set Page-Ptr
  114. ldi X_h, hi8(page_ptr)
  115. lds usart_r, UCSR0B ;activate Receiver
  116. sbr usart_r, (1<<RXEN0)|(1<<RXCIE0)
  117. sts UCSR0B, usart_r
  118. lds usart_r, frame_cnt
  119. mov main_r, option
  120. lsl main_r
  121. cp usart_r, main_r ;check if Page rec
  122. brne .-12
  123. lds usart_r, UCSR0B ;disable Receiver
  124. cbr usart_r, (1<<RXEN0)|(1<<RXCIE0)
  125. sts UCSR0B, usart_r
  126. sts UDR0, false ;clear UDR
  127. sts frame_cnt, false ;reset Frame cnt
  128. sbi PORTC, PC3 ;Signal State
  129. ;Rebuild Page-----------------------------------------------------------
  130. ldi X_l, lo8(page_ptr) ;set Pointer
  131. ldi X_h, hi8(page_ptr) ;for Rebuild
  132. ldi Y_l, lo8(page_ptr)
  133. inc Y_l
  134. ldi Y_h, hi8(page_ptr)
  135. ldi Z_l, lo8(page_ptr)
  136. ldi Z_h, hi8(page_ptr)
  137. page_rebuild:
  138. ld main_r, X ;Remove Mask and
  139. adiw X_l, 2 ;reconstruct Bytes
  140. ld usart_r, Y
  141. adiw Y_l, 2
  142. andi main_r, nibble_lo
  143. andi usart_r, nibble_lo
  144. swap usart_r
  145. or main_r, usart_r
  146. st Z+, main_r
  147. dec option
  148. brne page_rebuild
  149. ldi main_r, frame_mask ;signal Page rec
  150. sts cmd_mode, main_r ;by sending mask
  151. sts cmd_opt_lo, main_r
  152. sts cmd_opt_hi, main_r
  153. ret