main.s 6.7 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228229230231232233234235236237238239240
  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. lds usart_r, UCSR0B ;enable TX, UDREI
  104. sbr usart_r, (1<<TXEN0)|(1<<UDRIE0)
  105. sts UCSR0B, usart_r
  106. lds usart_r, ack_complete ;wait for ACK send
  107. cpse usart_r, true
  108. rjmp .-8
  109. lds usart_r, UCSR0B ;disable TX,UDREI,TXCI
  110. cbr usart_r, (1<<TXEN0)|(1<<UDRIE0)|(1<<TXCIE0)
  111. sts UCSR0B, usart_r
  112. sts UDR0, false ;clear UDR
  113. ;Recieve Page----------------------------------------------------------
  114. ldi X_l, lo8(page_ptr) ;Page-Pointer
  115. ldi X_h, hi8(page_ptr)
  116. sts pagemode, true ;enable Pagemode
  117. lds usart_r, UCSR0B ;enable RX, RXCI
  118. sbr usart_r, (1<<RXEN0)|(1<<RXCIE0)
  119. sts UCSR0B, usart_r
  120. lds usart_r, pagemode ;wait for Page received
  121. cpse usart_r, false
  122. rjmp .-8
  123. lds usart_r, UCSR0B ;disable RX,UDRIE,RXCI
  124. cbr usart_r, (1<<RXEN0)|(1<<UDRIE0)|(1<<RXCIE0)
  125. sts UCSR0B, usart_r
  126. sts UDR0, false ;clear UDR
  127. lds timer1_r, timer1_bool ;Timer1 Delay (1s)
  128. cpse timer1_r, true
  129. rjmp .-8
  130. sts TIMSK1, false ;Timer1-OVF disable
  131. sts TIMSK2, false ;Timer2-OVF disable
  132. sbi PORTC, PC2 ;Phase_3 complete
  133. ;++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++
  134. ;Phase_4: Write Page on uC
  135. ;++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++
  136. call timer1_reset ;reset Timer1
  137. ldi timer1_r, 1<<CS12 ;Prescaler x256 (1Hz)
  138. sts TCCR1B, timer1_r
  139. ldi timer1_r, 0x01 ;Timer1-Delay (1s)
  140. sts timer1_MAX, timer1_r
  141. ldi timer1_r, 1<<TOIE1 ;Timer1-OVF enable
  142. sts TIMSK1, timer1_r
  143. call timer2_init ;init Timer2 auf 10Hz
  144. ldi timer2_r, 0x06
  145. sts timer2_MAX, timer2_r
  146. ldi timer2_r, 1<<PC3 ;toggle PC3
  147. sts timer2_var, timer2_r
  148. ldi timer2_r, 1<<TOIE2 ;Timer2-OVF enable
  149. sts TIMSK2, timer2_r
  150. ;
  151. lds timer1_r, timer1_bool ;Timer1 Delay (1s)
  152. cpse timer1_r, true
  153. rjmp .-8
  154. sts TIMSK1, false ;Timer1-OVF disable
  155. sts TIMSK2, false ;Timer2-OVF disable
  156. sbi PORTC, PC3 ;Phase_4 complete
  157. ;++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++
  158. ;Phase_5: Read Flash of uC and control Checksum
  159. ;++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++
  160. call timer1_reset ;reset Timer1
  161. ldi timer1_r, 1<<CS12 ;Prescaler x256 (1Hz)
  162. sts TCCR1B, timer1_r
  163. ldi timer1_r, 0x01 ;Timer1-Delay (1s)
  164. sts timer1_MAX, timer1_r
  165. ldi timer1_r, 1<<TOIE1 ;Timer1-OVF enable
  166. sts TIMSK1, timer1_r
  167. call timer2_init ;init Timer2 auf 10Hz
  168. ldi timer2_r, 0x06
  169. sts timer2_MAX, timer2_r
  170. ldi timer2_r, 1<<PC4 ;toggle PC4
  171. sts timer2_var, timer2_r
  172. ldi timer2_r, 1<<TOIE2 ;Timer2-OVF enable
  173. sts TIMSK2, timer2_r
  174. ;
  175. lds timer1_r, timer1_bool ;Timer1 Delay (1s)
  176. cpse timer1_r, true
  177. rjmp .-8
  178. sts TIMSK1, false ;Timer1-OVF disable
  179. sts TIMSK2, false ;Timer2-OVF disable
  180. sbi PORTC, PC4 ;Phase_5 complete
  181. ;Programmende----------------------------------------------------------
  182. rjmp .-2 ;Endlosschleife
  183. cli ;