main.s 6.8 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228229230231232233234235236237238239240241242243
  1. ;Incs and Defs---------------------------------------------------------
  2. .include "atm328p.inc"
  3. .include "global.inc"
  4. ;**********************************************************************
  5. ;**********************************************************************
  6. ;Hauptprogramm
  7. .global main
  8. main:
  9. ;++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++
  10. ;Phase_1: Initialization
  11. ;++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++
  12. ldi main_r, lo8(RAMEND) ;Stackpointer
  13. out SPL, main_r
  14. ldi main_r, hi8(RAMEND)
  15. out SPH, main_r
  16. ldi true, 0xFF ;Default-Register
  17. ldi false, 0x00
  18. call timer1_reset ;reset Timer1
  19. ldi timer1_r, 1<<CS12 ;Prescaler x256 (1Hz)
  20. sts TCCR1B, timer1_r
  21. ldi timer1_r, 0x05 ;Timer1-Delay (5s)
  22. sts timer1_MAX, timer1_r
  23. ldi timer1_r, 1<<TOIE1 ;Timer1-OVF enable
  24. sts TIMSK1, timer1_r
  25. sei ;Interrupts aktivieren
  26. ldi main_r, (1<<PC0)|(1<<PC1)|(1<<PC2)|(1<<PC3)|(1<<PC4)
  27. out DDRC, main_r ;init I/O
  28. out PORTC, false
  29. call timer2_init ;init Timer2 auf 10Hz
  30. ldi timer2_r, 0x06
  31. sts timer2_MAX, timer2_r
  32. ldi timer2_r, 1<<PC0 ;toggle PC0
  33. sts timer2_var, timer2_r
  34. ldi timer2_r, 1<<TOIE2 ;Timer2-OVF enable
  35. sts TIMSK2, timer2_r
  36. call usart_init ;USART
  37. lds timer1_r, timer1_bool ;Timer1_Delay (5s)
  38. cpse timer1_r, true
  39. rjmp .-8
  40. sts TIMSK1, false ;Timer1-OVF disable
  41. sts TIMSK2, false ;Timer2-OVF disable
  42. sbi PORTC, PC0 ;Phase_1 complete
  43. ;++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++
  44. ;Phase2: Prepare uC for Programming
  45. ;++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++
  46. call timer1_reset ;reset Timer1
  47. ldi timer1_r, 1<<CS12 ;Prescaler x256 (1Hz)
  48. sts TCCR1B, timer1_r
  49. ldi timer1_r, 0x01 ;Timer1-Delay (1s)
  50. sts timer1_MAX, timer1_r
  51. ldi timer1_r, 1<<TOIE1 ;Timer1-OVF enable
  52. sts TIMSK1, timer1_r
  53. call timer2_init ;init Timer2 auf 10Hz
  54. ldi timer2_r, 0x06
  55. sts timer2_MAX, timer2_r
  56. ldi timer2_r, 1<<PC1 ;toggle PC1
  57. sts timer2_var, timer2_r
  58. ldi timer2_r, 1<<TOIE2 ;Timer2-OVF enable
  59. sts TIMSK2, timer2_r
  60. ;
  61. lds timer1_r, timer1_bool ;Timer1 Delay (1s)
  62. cpse timer1_r, true
  63. rjmp .-8
  64. sts TIMSK1, false ;Timer1-OVF disable
  65. sts TIMSK2, false ;Timer2-OVF disable
  66. sbi PORTC, PC1 ;Phase_2 complete
  67. ;++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++
  68. ;Phase_3: Connection to Interface and Page send
  69. ;++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++
  70. call timer1_reset ;reset Timer1
  71. ldi timer1_r, 1<<CS12 ;Prescaler x256 (1Hz)
  72. sts TCCR1B, timer1_r
  73. ldi timer1_r, 0x01 ;Timer1-Delay (1s)
  74. sts timer1_MAX, timer1_r
  75. ldi timer1_r, 1<<TOIE1 ;Timer1-OVF enable
  76. sts TIMSK1, timer1_r
  77. call timer2_init ;init Timer2 auf 10Hz
  78. ldi timer2_r, 0x06
  79. sts timer2_MAX, timer2_r
  80. ldi timer2_r, 1<<PC2 ;toggle PC2
  81. sts timer2_var, timer2_r
  82. ldi timer2_r, 1<<TOIE2 ;Timer2-OVF enable
  83. sts TIMSK2, timer2_r
  84. ;Recieve Request-------------------------------------------------------
  85. sts pagemode, false ;disable Pagemode
  86. ldi X_l, lo8(req_ptr) ;Pointer 'REQ'
  87. ldi X_h, hi8(req_ptr)
  88. sts req_complete, false
  89. lds usart_r, UCSR0B ;enable RX, RXCI
  90. sbr usart_r, (1<<RXEN0)|(1<<RXCIE0)
  91. sts UCSR0B, usart_r
  92. lds usart_r, req_complete ;wait for Request
  93. cpse usart_r, true
  94. rjmp .-8
  95. lds usart_r, UCSR0B ;disable RX,UDRIE,RXCI
  96. cbr usart_r, (1<<RXEN0)|(1<<UDRIE0)|(1<<RXCIE0)
  97. sts UCSR0B, usart_r
  98. sts UDR0, false ;clear UDR
  99. ;Send Acknoledgement---------------------------------------------------
  100. ldi X_l, lo8(ack_ptr) ;Pointer 'ACK'
  101. ldi X_h, hi8(ack_ptr)
  102. sts ack_complete, false
  103. ld data, X+ ;init Data-Segment
  104. sts UDR0, data
  105. lds usart_r, UCSR0B ;enable TX, UDREI
  106. sbr usart_r, (1<<TXEN0)|(1<<UDRIE0)
  107. sts UCSR0B, usart_r
  108. lds usart_r, ack_complete ;wait for ACK send
  109. cpse usart_r, true
  110. rjmp .-8
  111. lds usart_r, UCSR0B ;disable TX,UDREI,TXCI
  112. cbr usart_r, (1<<TXEN0)|(1<<UDRIE0)|(1<<TXCIE0)
  113. sts UCSR0B, usart_r
  114. sts UDR0, false ;clear UDR
  115. ;Recieve Page----------------------------------------------------------
  116. ldi X_l, lo8(page_ptr) ;Page-Pointer
  117. ldi X_h, hi8(page_ptr)
  118. sts pagemode, true ;enable Pagemode
  119. lds usart_r, UCSR0B ;enable RX, RXCI
  120. sbr usart_r, (1<<RXEN0)|(1<<RXCIE0)
  121. sts UCSR0B, usart_r
  122. lds usart_r, pagemode ;wait for Page received
  123. cpse usart_r, false
  124. rjmp .-8
  125. lds usart_r, UCSR0B ;disable RX,UDRIE,RXCI
  126. cbr usart_r, (1<<RXEN0)|(1<<UDRIE0)|(1<<RXCIE0)
  127. sts UCSR0B, usart_r
  128. sts UDR0, false ;clear UDR
  129. lds timer1_r, timer1_bool ;Timer1 Delay (1s)
  130. cpse timer1_r, true
  131. rjmp .-8
  132. sts TIMSK1, false ;Timer1-OVF disable
  133. sts TIMSK2, false ;Timer2-OVF disable
  134. sbi PORTC, PC2 ;Phase_3 complete
  135. ;++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++
  136. ;Phase_4: Write Page on uC
  137. ;++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++
  138. call timer1_reset ;reset Timer1
  139. ldi timer1_r, 1<<CS12 ;Prescaler x256 (1Hz)
  140. sts TCCR1B, timer1_r
  141. ldi timer1_r, 0x01 ;Timer1-Delay (1s)
  142. sts timer1_MAX, timer1_r
  143. ldi timer1_r, 1<<TOIE1 ;Timer1-OVF enable
  144. sts TIMSK1, timer1_r
  145. call timer2_init ;init Timer2 auf 10Hz
  146. ldi timer2_r, 0x06
  147. sts timer2_MAX, timer2_r
  148. ldi timer2_r, 1<<PC3 ;toggle PC3
  149. sts timer2_var, timer2_r
  150. ldi timer2_r, 1<<TOIE2 ;Timer2-OVF enable
  151. sts TIMSK2, timer2_r
  152. ;
  153. lds timer1_r, timer1_bool ;Timer1 Delay (1s)
  154. cpse timer1_r, true
  155. rjmp .-8
  156. sts TIMSK1, false ;Timer1-OVF disable
  157. sts TIMSK2, false ;Timer2-OVF disable
  158. sbi PORTC, PC3 ;Phase_4 complete
  159. ;++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++
  160. ;Phase_5: Read Flash of uC and control Checksum
  161. ;++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++
  162. call timer1_reset ;reset Timer1
  163. ldi timer1_r, 1<<CS12 ;Prescaler x256 (1Hz)
  164. sts TCCR1B, timer1_r
  165. ldi timer1_r, 0x01 ;Timer1-Delay (1s)
  166. sts timer1_MAX, timer1_r
  167. ldi timer1_r, 1<<TOIE1 ;Timer1-OVF enable
  168. sts TIMSK1, timer1_r
  169. call timer2_init ;init Timer2 auf 10Hz
  170. ldi timer2_r, 0x06
  171. sts timer2_MAX, timer2_r
  172. ldi timer2_r, 1<<PC4 ;toggle PC4
  173. sts timer2_var, timer2_r
  174. ldi timer2_r, 1<<TOIE2 ;Timer2-OVF enable
  175. sts TIMSK2, timer2_r
  176. ;
  177. lds timer1_r, timer1_bool ;Timer1 Delay (1s)
  178. cpse timer1_r, true
  179. rjmp .-8
  180. sts TIMSK1, false ;Timer1-OVF disable
  181. sts TIMSK2, false ;Timer2-OVF disable
  182. sbi PORTC, PC4 ;Phase_5 complete
  183. ;Programmende----------------------------------------------------------
  184. rjmp .-2 ;Endlosschleife
  185. cli ;