main.s 3.7 KB

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