| 123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163 |
- ;Incs and Defs---------------------------------------------------------
- .include "atm328p.inc"
- .include "global.inc"
- ;++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++
- ;Main Programm
- .global main
- main:
- ldi main_r, lo8(RAMEND) ;Stackpointer
- out SPL, main_r
- ldi main_r, hi8(RAMEND)
- out SPH, main_r
- clr false ;set Registers
- ser true
- call usart_init; ;init USART
- ldi main_r, (1<<PC0)|(1<<PC1)|(1<<PC2)|(1<<PC3)|(1<<PC4)
- out DDRC, main_r ;init I/O
- out PORTC, false
- sei ;enable Interrupts
- rjmp mode_select ;select Mode
- rjmp .-2 ;Endlosschleife
- cli ;disable Interrupts
- ;++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++
- ;Mode Selection
- mode_select:
- ;Receive Frame----------------------------------------------------------
- ldi X_l, lo8(cmd_ptr) ;set Command-Ptr
- ldi X_h, hi8(cmd_ptr)
- lds usart_r, UCSR0B ;activate Receiver
- sbr usart_r, (1<<RXEN0)|(1<<RXCIE0)
- sts UCSR0B, usart_r
- cpi X_l, 0x03 ;check if Frame rec
- brne .-4
- lds usart_r, UCSR0B ;disable Receiver
- cbr usart_r, (1<<RXEN0)|(1<<RXCIE0)
- sts UCSR0B, usart_r
- sts UDR0, false ;clear UDR
- sbi PORTC, PC0 ;delete
- call cmd_rebuild ;read Cmd
- ;Select Mode------------------------------------------------------------
- sbrc mode, fuse_read
- rjmp mode_select
- sbrc mode, fuse_write
- rjmp mode_select
- sbrc mode, page_read
- call mode_page_read
- sbrc mode, page_write
- rjmp mode_select
- sbrc mode, prog_read
- rjmp mode_select
- ;Send Frame-------------------------------------------------------------
- ldi X_l, lo8(cmd_ptr) ;set Command-Ptr
- ldi X_h, hi8(cmd_ptr)
- lds usart_r, UCSR0B ;enable UDRI
- sbr usart_r, 1<<UDRIE0
- sts UCSR0B, usart_r
- cpi X_l, 0x04 ;check if Frame send
- brne .-4
- lds usart_r, UCSR0B ;disable TX, TXCI
- cbr usart_r, (1<<TXEN0)|(1<<TXCIE0)|(1<<UDRIE0)
- sts UCSR0B, usart_r
- sts UDR0, false ;clear UDR
- sbi PORTC, PC4 ;delete
- rjmp mode_select
- ;++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++
- ;Cmd rebuild
- cmd_rebuild:
- lds main_r, cmd_mode ;set Mode
- andi main_r, nibble_lo
- ldi mode, 0x01
- tst main_r
- breq .+6
- lsl mode
- dec main_r
- rjmp .-10
- clr option ;set Option
- lds main_r, cmd_opt_lo
- andi main_r, nibble_lo
- or option, main_r
- lds main_r, cmd_opt_hi
- andi main_r, nibble_lo
- swap main_r
- or option, main_r
- sbi PORTC, PC1 ;delete
- ret
- ;++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++
- ;Read Page
- mode_page_read:
- ;Send Acknoledgement---------------------------------------------------
- sbi PORTC, PC2
- sts cmd_mode, option ;verify Mode
- sts cmd_opt_lo, option
- sts cmd_opt_hi, option
- ldi X_l, lo8(cmd_ptr) ;set Command-Ptr
- ldi X_h, hi8(cmd_ptr)
- lds usart_r, UCSR0B ;enable UDRI
- sbr usart_r, 1<<UDRIE0
- sts UCSR0B, usart_r
- cpi X_l, 0x04 ;check if Frame send
- brne .-4
- lds usart_r, UCSR0B ;disable TX, TXCI
- cbr usart_r, (1<<TXEN0)|(1<<TXCIE0)|(1<<UDRIE0)
- sts UCSR0B, usart_r
- sts UDR0, false ;clear UDR
- ;Read Page--------------------------------------------------------------
- ldi X_l, lo8(page_ptr) ;set Page-Ptr
- ldi X_h, hi8(page_ptr)
- lds usart_r, UCSR0B ;activate Receiver
- sbr usart_r, (1<<RXEN0)|(1<<RXCIE0)
- sts UCSR0B, usart_r
- cp X_l, option ;check if Page rec
- brne .-4
- lds usart_r, UCSR0B ;disable Receiver
- cbr usart_r, (1<<RXEN0)|(1<<RXCIE0)
- sts UCSR0B, usart_r
- sts UDR0, false ;clear UDR
- sbi PORTC, PC3
- ;Recode Command----------------------------------------------------------
- mov main_r, mode ;reset Mode
- ori main_r, frame_mask
- sts cmd_mode, main_r
- ret
|