main.s 2.5 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115
  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. sbi PORTC, PC0 ;delete
  26. ;Receive Frame----------------------------------------------------------
  27. ldi X_l, lo8(cmd_ptr) ;set Command-Ptr
  28. ldi X_h, hi8(cmd_ptr)
  29. lds usart_r, UCSR0B ;activate Receiver
  30. sbr usart_r, (1<<RXEN0)|(1<<RXCIE0)
  31. sts UCSR0B, usart_r
  32. cpi X_l, 0x03 ;check if Frame rec
  33. brne .-4
  34. lds usart_r, UCSR0B ;disable Receiver
  35. cbr usart_r, (1<<RXEN0)|(1<<RXCIE0)
  36. sts UCSR0B, usart_r
  37. sts UDR0, false ;clear UDR
  38. sbi PORTC, PC1 ;delete
  39. call cmd_rebuild ;read Cmd
  40. ;Select Mode------------------------------------------------------------
  41. ; lds mode, cmd_mode
  42. ; sbrc mode, fuse_read
  43. ; rjmp mode_select
  44. ; sbrc mode, fuse_write
  45. ; rjmp mode_select
  46. ; sbrc mode, page_read
  47. ; rjmp mode_select
  48. ; sbrc mode, page_write
  49. ; rjmp mode_select
  50. ; sbrc mode, prog_read
  51. ; rjmp mode_select
  52. ;Send Frame-------------------------------------------------------------
  53. ldi X_l, lo8(cmd_ptr) ;set Command-Ptr
  54. ldi X_h, hi8(cmd_ptr)
  55. lds usart_r, UCSR0B ;enable UDRI
  56. sbr usart_r, 1<<UDRIE0
  57. sts UCSR0B, usart_r
  58. cpi X_l, 0x03 ;check if Frame send
  59. brne .-4
  60. lds usart_r, UCSR0B ;disable TX, TXCI
  61. cbr usart_r, (1<<TXEN0)|(1<<TXCIE0)|(1<<UDRIE0)
  62. sts UCSR0B, usart_r
  63. sts UDR0, false ;clear UDR
  64. sbi PORTC, PC2 ;delete
  65. rjmp mode_select
  66. ;++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++
  67. ;Cmd rebuild
  68. cmd_rebuild:
  69. lds main_r, cmd_mode ;set Mode
  70. andi main_r, nibble_lo
  71. ldi mode, 0x01
  72. tst main_r
  73. breq .+6
  74. lsl main_r
  75. dec main_r
  76. rjmp .-8
  77. clr option ;set Option
  78. lds main_r, cmd_opt_lo
  79. andi main_r, nibble_lo
  80. or option, main_r
  81. lds main_r, cmd_opt_hi
  82. andi main_r, nibble_lo
  83. swap main_r
  84. or option, main_r
  85. sbi PORTC, PC1 ;delete
  86. ret