main.s 4.1 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172
  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. in main_r, PORTC ;toggle PC0
  26. ldi usart_r, 1<<PC0
  27. eor main_r, usart_r
  28. out PORTC, main_r
  29. ;Receive Frame----------------------------------------------------------
  30. ldi X_l, lo8(cmd_ptr) ;set Command-Ptr
  31. ldi X_h, hi8(cmd_ptr)
  32. lds usart_r, UCSR0B ;activate Receiver
  33. sbr usart_r, (1<<RXEN0)|(1<<RXCIE0)
  34. sts UCSR0B, usart_r
  35. lds usart_r, frame_cnt
  36. cpi usart_r, 0x03 ;check if Frame rec
  37. brne .-8
  38. lds usart_r, UCSR0B ;disable Receiver
  39. cbr usart_r, (1<<RXEN0)|(1<<RXCIE0)
  40. sts UCSR0B, usart_r
  41. sts UDR0, false ;clear UDR
  42. sts frame_cnt, false ;reset Frame cnt
  43. call cmd_rebuild ;read Cmd
  44. ;Select Mode------------------------------------------------------------
  45. sbrc mode, fuse_read
  46. rjmp mode_select
  47. sbrc mode, fuse_write
  48. rjmp mode_select
  49. sbrc mode, page_read
  50. call mode_page_read
  51. sbrc mode, page_write
  52. rjmp mode_select
  53. sbrc mode, prog_read
  54. rjmp mode_select
  55. ;Send Frame-------------------------------------------------------------
  56. ldi X_l, lo8(cmd_ptr) ;set Command-Ptr
  57. ldi X_h, hi8(cmd_ptr)
  58. lds usart_r, UCSR0B ;enable UDRI
  59. sbr usart_r, 1<<UDRIE0
  60. sts UCSR0B, usart_r
  61. lds usart_r, frame_cnt
  62. cpi usart_r, 0x04 ;check if Frame send
  63. brne .-8
  64. lds usart_r, UCSR0B ;disable TX, TXCI
  65. cbr usart_r, (1<<TXEN0)|(1<<TXCIE0)|(1<<UDRIE0)
  66. sts UCSR0B, usart_r
  67. sts UDR0, false ;clear UDR
  68. sts frame_cnt, false ;reset Frame cnt
  69. sbi PORTC, PC1 ;read Page complete
  70. rjmp mode_select
  71. ;++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++
  72. ;Cmd rebuild
  73. cmd_rebuild:
  74. lds main_r, cmd_mode ;set Mode
  75. andi main_r, nibble_lo
  76. ldi mode, 0x01
  77. tst main_r
  78. breq .+6
  79. lsl mode
  80. dec main_r
  81. rjmp .-10
  82. clr option ;set Option
  83. lds main_r, cmd_opt_lo
  84. andi main_r, nibble_lo
  85. or option, main_r
  86. lds main_r, cmd_opt_hi
  87. andi main_r, nibble_lo
  88. swap main_r
  89. or option, main_r
  90. brne .+4 ;check valid Mode
  91. jmp mode_select
  92. ret
  93. ;++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++
  94. ;Read Page
  95. mode_page_read:
  96. ;Send Acknoledgement---------------------------------------------------
  97. sts cmd_mode, option ;verify Mode
  98. sts cmd_opt_lo, option
  99. sts cmd_opt_hi, option
  100. ldi X_l, lo8(cmd_ptr) ;set Command-Ptr
  101. ldi X_h, hi8(cmd_ptr)
  102. lds usart_r, UCSR0B ;enable UDRI
  103. sbr usart_r, 1<<UDRIE0
  104. sts UCSR0B, usart_r
  105. lds usart_r, frame_cnt
  106. cpi usart_r, 0x04 ;check if Frame send
  107. brne .-8
  108. lds usart_r, UCSR0B ;disable TX, TXCI
  109. cbr usart_r, (1<<TXEN0)|(1<<TXCIE0)|(1<<UDRIE0)
  110. sts UCSR0B, usart_r
  111. sts UDR0, false ;clear UDR
  112. sts frame_cnt, false ;reset Frame cnt
  113. ;Read Page--------------------------------------------------------------
  114. ldi X_l, lo8(page_ptr) ;set Page-Ptr
  115. ldi X_h, hi8(page_ptr)
  116. lds usart_r, UCSR0B ;activate Receiver
  117. sbr usart_r, (1<<RXEN0)|(1<<RXCIE0)
  118. sts UCSR0B, usart_r
  119. lds usart_r, frame_cnt
  120. cp usart_r, option ;check if Page rec
  121. brne .-8
  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. ldi main_r, frame_mask ;signal Page rec
  128. sts cmd_mode, main_r
  129. sts cmd_opt_lo, main_r
  130. sts cmd_opt_hi, main_r
  131. ret