main.s 4.6 KB

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