-.def srbyte = r12 ;byty for search rom algorithm
-.def writelow = r13; marker for send low
-.def zero =r14; always zero
-.def smode=r15; if 1 then send
-.def temp = r16 ;
-.def temp2 = r17;
-.def mode = r18 ;
-.def bitp = r19 ; bit counter ... shift...
-.def rwbyte = r21;
-.def param = r22;
-.def bytep = r23 ;byte counter
-#define spmcrval param
-
-
-.equ OWM_READ_ROM_COMMAND=0 ; 0 wegen schnellen test ist dieser wert 0! Daturch wird die Sprungdabelle nicht verwendet
-.equ OWM_SLEEP=1 ; Warten auf Reset
-.equ OWM_MATCH_ROM=2
-.equ OWM_SEARCH_ROM_S=3 ;send bit
-.equ OWM_SEARCH_ROM_R=4 ;resive master
-.equ OWM_READ_COMMAND=5
-.equ OWM_WRITE_SCRATCHPAD=6
-.equ OWM_READ_SCRATCHPAD=7
-.equ OWM_PROGRAMM_PAGE=8
-.equ OWM_RECALL_FLASH=9
-
-
-.equ OW_DDR = DDRB
-.equ OW_PIN = PORTB2
-.equ OW_PORT = PORTB
-.equ OW_PINN = PINB
-
-;.equ SRAM_START = 0x60
-
-.macro set_clock
- ldi temp,0x80;
- out CLKPR,temp
- ldi temp,@0
- out CLKPR,temp
-.endmacro
-
-.macro owwl
- sbic OW_PINN,OW_PIN
- rjmp pc-1
-.endmacro
-
-.macro owwh
- sbis OW_PINN,OW_PIN
- rjmp pc-1
-.endmacro
-
-
-
-
- ;---------------------------------------------------
-; START of PROG
-;---------------------------------------------------
-
-
-.CSEG
-.ORG 0x000
-jreset:
- rjmp start ; Reset-Vector
- reti ;
- reti ;
- reti ;
- reti ;
- reti ;
- reti ;
- reti ;
- reti ;
- reti ;
- reti ;
- reti ;
- reti ;
- reti ;
- reti ;
- reti ;
- reti ;
- reti ;
- reti ;
- reti ;
- reti ;
-
-
-.ORG 0x0EC0
-
-start:
- cli
- ldi temp,0
- mov zero,temp
- set_clock 0x00 ;8mhz
- ldi mode,OWM_SLEEP
- ldi temp,(1<<CS01) //1us
- out TCCR0B,temp
- ldi temp, HIGH(RAMEND) ; HIGH-Byte der obersten RAM-Adresse
- out SPH, temp
- ldi temp, LOW(RAMEND) ; LOW-Byte der obersten RAM-Adresse
- out SPL, temp
- ;ldi temp,1
- ;out DDRB,temp
- clr writelow
- clr bitp
-
- ;sbi PORTB,0
- ldi ZL,low(pro_owid*2)
- ldi ZH,high(pro_owid*2)
- ldi XL,low(sowid)
- ldi XH,high(sowid)
- ;ldi temp2,8
-pro_copy_loop: ;copy ID on SRAM for better handling
- lpm temp,Z+
- st X+,temp
- cpi XL,SRAM_START+8
- brlo pro_copy_loop
-pro_loop:
- ;sbi PORTB,0
- owwl ;wait for line goes low (polling)
- sbrs writelow,0 ;test of zero send
- rjmp pro_loop1 ;no ? goes next
- sbi OW_DDR,OW_PIN ;yes pull line to low
- ldi param,45 ;wait for 50 us
- rcall wait_time
- clr writelow ;reset write low indecator
- cbi OW_DDR,OW_PIN ;release line
- owwh ;wait for line is high (it can takes some time cause of the capacity of line)
-pro_loop1:
- tst smode ;smode=1 for slave sends to master
- breq pro_loop_resv
-pro_loop_send:
- tst bitp
- brne pro_loop_send1
- rcall pro_hb
- tst smode
- breq pro_loop_end ; now reading ... do nothing
-pro_loop_send1: ;prebare next bit
- sbrs rwbyte ,0; if bit 0 set in rwbyte then skip next command
- inc writelow
- lsl bitp
- ror rwbyte
- rjmp pro_loop_end
-
-pro_loop_resv:
- ldi param,15 ;wait 15us
- rcall wait_time
- lsr rwbyte
- ;cbi PORTB,0
- sbic OW_PINN,OW_PIN ;test line
- ori rwbyte,0x80
- lsl bitp
- brne pro_loop_end ;no handle need
- rcall pro_hb
- tst smode
- brne pro_loop_send ; Nach dem Gelesen byte koennte gesendet werden muessen....
-pro_loop_end:
- //owwh
- out TCNT0,zero
-pro_loop_end_test_reset:
- sbic OW_PINN,OW_PIN //leitung wieder high
- rjmp pro_loop
- in temp,TCNT0
- cpi temp,130
- brlo pro_loop_end_test_reset
- rcall pro_sleep_s2
- rjmp pro_loop
-
-
-
-
-pro_sleep:
- out TCNT0,zero
-pro_sleep_s1:
- sbic OW_PINN,OW_PIN //leitung wieder high
- ret
- in temp,TCNT0
- cpi temp,200
- brlo pro_sleep_s1
- //leitung wieder high
-pro_sleep_s2:
- owwh
- ldi param,40
- rcall wait_time
- //Presents Impuls
- sbi OW_DDR,OW_PIN
- ldi param,130
- rcall wait_time
- cbi OW_DDR,OW_PIN
- //init read byte
- ldi bitp,0x01
- ldi rwbyte,0
- clr smode
- ldi mode,OWM_READ_ROM_COMMAND
- //Wait for all other devices presents impuls finished
- ldi param,40
- rcall wait_time
- ret
-
-
-
-pro_hb:
- ldi ZL,low(pro_stable)
- ldi ZH,high(pro_stable)
- add ZL,mode
- adc ZH,zero
- icall
- ret
-
-pro_stable:
- rjmp pro_read_rom_command
- rjmp pro_sleep
- rjmp pro_match_rom
- rjmp pro_search_rom_s
- rjmp pro_search_rom_r
- rjmp pro_read_command
- rjmp pro_write_scratchpad
- rjmp pro_read_scratchpad
- rjmp pro_programm_page
- rjmp pro_recall_flash
-
-pro_read_rom_command:
- ldi mode,OWM_SLEEP
- cpi rwbyte,0xCC
- brne pro_rcc_1
- ldi mode,OWM_READ_COMMAND
- rjmp pro_out_bitp1
-pro_rcc_1:
- cpi rwbyte,0xF0 ;Searchrom
- brne pro_rcc_2
- ldi XL,low(sowid) ;init sram pointer
- ldi XH,high(sowid)
- ld srbyte,X+
- ldi bytep,0
- rjmp pro_serchrom_next_bit
-pro_rcc_2:
- cpi rwbyte,0x55 ;Matchrom
- brne pro_rcc_3
-// rcall pro_owidinit
- ldi XL,low(sowid) ;init sram pointer
- ldi XH,high(sowid)
- ldi mode,OWM_MATCH_ROM
- rjmp pro_out_bytep0
-
-pro_rcc_3:
- ret
-
-pro_match_rom:
- ld temp,X+
- cp temp,rwbyte
- breq pro_match_rom_next
- ldi mode,OWM_SLEEP
- ret
-pro_match_rom_next:
- cpi XL,SRAM_START+8
- breq pro_match_rom_found
- rjmp pro_out_bitp1
-pro_match_rom_found:
- ldi mode,OWM_READ_COMMAND
- rjmp pro_out_bitp1
-
-pro_read_command:
- ldi mode,OWM_SLEEP
- cpi rwbyte,0x0F ;; Write to Scratchpad
- brne pro_rc_1
- ldi mode,OWM_WRITE_SCRATCHPAD
- ldi XL,low(scratchpad) ;init sram pointer
- ldi XH,high(scratchpad)
- rjmp pro_out_bytep0
-pro_rc_1:
- cpi rwbyte,0xAA
- brne pro_rc_2
- ldi mode,OWM_READ_SCRATCHPAD ;;Read from Scratchpad
- ldi XL,low(scratchpad) ;init sram pointer
- ldi XH,high(scratchpad)
- inc smode
- ld rwbyte,X+
- rjmp pro_out_bytep0
-
-pro_rc_2:
- cpi rwbyte,0xB8
- brne pro_rc_3
- ldi mode,OWM_RECALL_FLASH ;; copy Flash page in Scratchpad
- ldi XL,low(scratchpad) ;init sram pointer
- ldi XH,high(scratchpad)
- rjmp pro_out_bytep0
-pro_rc_3:
- cpi rwbyte,0x55 ; copy Scratchpad to Flash
- brne pro_rc_4
- ldi mode,OWM_SLEEP
- rjmp pro_programm_page
-
-pro_rc_4:
- cpi rwbyte,0x89 ; Reset Device /Boot (new) Firmware
- brne pro_rc_5
- rjmp jreset
-pro_rc_5:
- cpi rwbyte,0x8B ; Clear the OWID saved in EEPROM / one ID1
- brne pro_rc_6
- ldi temp,7
-pro_rc_5a:
- ldi XL,low(E2END)
- ldi XH,high(E2END)
- sub XL,temp
- out EEARH,XH
- out EEARL,XL
- ldi temp, (0<<EEPM1)|(0<<EEPM0)
- out EECR, temp
- ldi temp,0xFF
- out EEDR, temp
- sbi EECR, EEMPE
- sbi EECR, EEPE
- ret
-
-
-pro_rc_6:
- cpi rwbyte,0x8C ; Clear the OWID saved in EEPROM / one ID2
- brne pro_rc_7
- ldi temp,7+8
- rjmp pro_rc_5a
-
-pro_rc_7:
- ret
-
-pro_write_scratchpad:
- st X+,rwbyte
- cpi XL,SRAM_START+8+66
- brlo pro_write_scratchpad_next
- ldi mode,OWM_SLEEP
- ret
-pro_write_scratchpad_next:
- ldi bitp,1
- ret
-
-pro_read_scratchpad:
- cpi XL,SRAM_START+8+66
- brlo pro_read_scratchpad_next
- ldi mode,OWM_SLEEP
- clr smode
- ret
-pro_read_scratchpad_next:
- ld rwbyte,X+
- rjmp pro_out_bitp1
-
-
-pro_programm_page:
-.equ PAGESIZEB = PAGESIZE*2;PAGESIZEB is page size in BYTES, not words
-// .org SMALLBOOTSTART
-write_page:
- ;transfer data from RAM to Flash page buffer
- ldi bytep, PAGESIZEB ;init loop variable
- ldi YL,low(scratchpad) ;init sram pointer
- ldi YH,high(scratchpad)
- ld ZL,Y+
- ld ZH,Y+
- ;page erase
- ldi spmcrval, (1<<PGERS) + (1<<SPMEN)
- rcall do_spm
-wrloop:
- ld r0, Y+
- ld r1, Y+
- ldi spmcrval, (1<<SPMEN)
- rcall do_spm
- adiw ZH:ZL, 2
- subi bytep, 2;use subi for PAGESIZEB<=256
- brne wrloop
- ;execute page write
- subi ZL, low(PAGESIZEB) ;restore pointer
- sbci ZH, high(PAGESIZEB) ;not required for PAGESIZEB<=256
- ldi spmcrval, (1<<PGWRT) + (1<<SPMEN)
- rcall do_spm
- ;read back and check, optional
- ldi bytep, PAGESIZEB
- subi YL, low(PAGESIZEB) ;restore pointer
- sbci YH, high(PAGESIZEB)
-rdloop:
- lpm r0, Z+
- ld r1, Y+
- cpse r0, r1
- rjmp error
- subi bytep, 2;use subi for PAGESIZEB<=256
- brne rdloop
- ;return
- ret
-do_spm:
- ;input: spmcrval determines SPM action
- ;disable interrupts if enabled, store status
- in temp2, SREG
- cli
- ;check for previous SPM complete
-wait:
- in temp, SPMCSR
- sbrc temp, SPMEN
- rjmp wait
- ;SPM timed sequence
- out SPMCSR, spmcrval
- spm
- ;restore SREG (to enable interrupts if originally enabled)
- out SREG, temp2
- ret
-
-error:
-
-
- ret
-
-pro_recall_flash:
- st X+,rwbyte
- ;inc bytep
- cpi XL,SRAM_START+8+2
- brlo pro_out_bitp1;pro_recall_flash_next
- lds ZL,scratchpad
- lds ZH,scratchpad+1
-pro_recall_flash_cl:
- lpm temp,Z+
- st X+,temp
- cpi XL,SRAM_START+8+66
- brne pro_recall_flash_cl
- ldi mode,OWM_SLEEP
- ret
-
-pro_out_read_command:
- ldi mode,OWM_READ_COMMAND
-pro_out_bytep0:
- ldi bytep,0
-pro_out_bitp1:
- ldi bitp,1
- ret
-
-
-
-pro_serchrom_next_bit:
- mov rwbyte,srbyte
- mov temp2,rwbyte
- com rwbyte
- ror temp2 ;first bit in C
- rol rwbyte ;C in first bit
- inc smode
- ldi bitp,0x40
- ldi mode,OWM_SEARCH_ROM_R ;next mod Resive
- ret
-
-
-pro_search_rom_s:
- clr temp2
- lsr srbyte ;shift in C lowest bit
- ror temp2 ; shift in temp2 as highest bit
- andi rwbyte,0x80 ; clear other bits
- eor temp2,rwbyte
- breq pro_search_rom_s_goon
- ldi mode,OWM_SLEEP
- ret
-pro_search_rom_s_goon:
- inc bytep
- mov temp2,bytep
- andi temp2,0x07
- brne pro_serchrom_next_bit ;prepare next bit
- mov temp2,bytep
- andi temp2,0x40 ;;end
- brne pro_search_rom_found
- ;read next byte
- ld srbyte,X+
- rjmp pro_serchrom_next_bit
-
-pro_search_rom_found:
- ldi mode,OWM_READ_COMMAND
- rjmp pro_out_bytep0
-
-pro_search_rom_r:
- clr smode
- ldi mode,OWM_SEARCH_ROM_S
- ldi bitp,0 ;go to searchrom_s after bit get
- ret
-
-pro_owid: .DB 0xA3, 0xAA, 0x55, 0xAA, 0x55, 0xAA, 0x55, 0xFA
-
-
-
-
-
-wait_time:
- out TCNT0,zero
-wait_time1:
- in temp,TCNT0
- cp temp,param
- brlo wait_time1
- ret
-
-
-.DSEG
-sowid: .BYTE 8
+.def srbyte = r12 ;byty for search rom algorithm\r
+.def writelow = r13; marker for send low\r
+.def zero =r14; always zero \r
+.def smode=r15; if 1 then send \r
+.def temp = r16 ; \r
+.def temp2 = r17; \r
+.def mode = r18 ; \r
+.def bitp = r19 ; bit counter ... shift...\r
+.def rwbyte = r21;\r
+.def param = r22;\r
+.def bytep = r23 ;byte counter\r
+#define spmcrval param\r
+\r
+\r
+.equ OWM_READ_ROM_COMMAND=0 ; 0 wegen schnellen test ist dieser wert 0! Daturch wird die Sprungdabelle nicht verwendet\r
+.equ OWM_SLEEP=1 ; Warten auf Reset\r
+.equ OWM_MATCH_ROM=2\r
+.equ OWM_SEARCH_ROM_S=3 ;send bit\r
+.equ OWM_SEARCH_ROM_R=4 ;resive master\r
+.equ OWM_READ_COMMAND=5\r
+.equ OWM_WRITE_SCRATCHPAD=6\r
+.equ OWM_READ_SCRATCHPAD=7\r
+.equ OWM_PROGRAMM_PAGE=8\r
+.equ OWM_RECALL_FLASH=9\r
+\r
+\r
+.equ OW_DDR = DDRB \r
+.equ OW_PIN = PORTB2\r
+.equ OW_PORT = PORTB \r
+.equ OW_PINN = PINB \r
+\r
+;.equ SRAM_START = 0x60\r
+\r
+.macro set_clock\r
+ ldi temp,0x80;\r
+ out CLKPR,temp\r
+ ldi temp,@0\r
+ out CLKPR,temp\r
+.endmacro \r
+\r
+.macro owwl\r
+ sbic OW_PINN,OW_PIN\r
+ rjmp pc-1\r
+.endmacro \r
+\r
+.macro owwh\r
+ sbis OW_PINN,OW_PIN\r
+ rjmp pc-1\r
+.endmacro \r
+\r
+\r
+\r
+\r
+ ;---------------------------------------------------\r
+; START of PROG \r
+;---------------------------------------------------\r
+\r
+\r
+.CSEG \r
+.ORG 0x000\r
+jreset:\r
+ rjmp start ; Reset-Vector \r
+ reti ; \r
+ reti ; \r
+ reti ; \r
+ reti ; \r
+ reti ; \r
+ reti ; \r
+ reti ; \r
+ reti ; \r
+ reti ; \r
+ reti ; \r
+ reti ; \r
+ reti ; \r
+ reti ; \r
+ reti ; \r
+ reti ; \r
+ reti ; \r
+ reti ; \r
+ reti ; \r
+ reti ; \r
+ reti ; \r
+\r
+\r
+.ORG 0x0EC0\r
+\r
+start: \r
+ cli\r
+ ldi temp,0\r
+ mov zero,temp\r
+ set_clock 0x00 ;8mhz\r
+ ldi mode,OWM_SLEEP\r
+ ldi temp,(1<<CS01) //1us\r
+ out TCCR0B,temp\r
+ ldi temp, HIGH(RAMEND) ; HIGH-Byte der obersten RAM-Adresse \r
+ out SPH, temp \r
+ ldi temp, LOW(RAMEND) ; LOW-Byte der obersten RAM-Adresse \r
+ out SPL, temp \r
+ ;ldi temp,1\r
+ ;out DDRB,temp\r
+ clr writelow\r
+ clr bitp\r
+ \r
+ ;sbi PORTB,0\r
+ ldi ZL,low(pro_owid*2) \r
+ ldi ZH,high(pro_owid*2) \r
+ ldi XL,low(sowid)\r
+ ldi XH,high(sowid)\r
+ ;ldi temp2,8\r
+pro_copy_loop: ;copy ID on SRAM for better handling\r
+ lpm temp,Z+\r
+ st X+,temp\r
+ cpi XL,SRAM_START+8\r
+ brlo pro_copy_loop\r
+pro_loop:\r
+ ;sbi PORTB,0\r
+ owwl ;wait for line goes low (polling)\r
+ sbrs writelow,0 ;test of zero send\r
+ rjmp pro_loop1 ;no ? goes next\r
+ sbi OW_DDR,OW_PIN ;yes pull line to low\r
+ ldi param,45 ;wait for 50 us\r
+ rcall wait_time\r
+ clr writelow ;reset write low indecator\r
+ cbi OW_DDR,OW_PIN ;release line\r
+ owwh ;wait for line is high (it can takes some time cause of the capacity of line)\r
+pro_loop1:\r
+ tst smode ;smode=1 for slave sends to master\r
+ breq pro_loop_resv\r
+pro_loop_send:\r
+ tst bitp\r
+ brne pro_loop_send1\r
+ rcall pro_hb\r
+ tst smode\r
+ breq pro_loop_end ; now reading ... do nothing \r
+pro_loop_send1: ;prebare next bit\r
+ sbrs rwbyte ,0; if bit 0 set in rwbyte then skip next command\r
+ inc writelow\r
+ lsl bitp\r
+ ror rwbyte\r
+ rjmp pro_loop_end\r
+\r
+pro_loop_resv:\r
+ ldi param,15 ;wait 15us\r
+ rcall wait_time\r
+ lsr rwbyte\r
+ ;cbi PORTB,0\r
+ sbic OW_PINN,OW_PIN ;test line\r
+ ori rwbyte,0x80\r
+ lsl bitp\r
+ brne pro_loop_end ;no handle need\r
+ rcall pro_hb\r
+ tst smode\r
+ brne pro_loop_send ; Nach dem Gelesen byte koennte gesendet werden muessen....\r
+pro_loop_end:\r
+ //owwh\r
+ out TCNT0,zero\r
+pro_loop_end_test_reset:\r
+ sbic OW_PINN,OW_PIN //leitung wieder high\r
+ rjmp pro_loop\r
+ in temp,TCNT0\r
+ cpi temp,130\r
+ brlo pro_loop_end_test_reset\r
+ rcall pro_sleep_s2\r
+ rjmp pro_loop\r
+\r
+\r
+\r
+\r
+pro_sleep:\r
+ out TCNT0,zero\r
+pro_sleep_s1:\r
+ sbic OW_PINN,OW_PIN //leitung wieder high\r
+ ret\r
+ in temp,TCNT0\r
+ cpi temp,200\r
+ brlo pro_sleep_s1\r
+ //leitung wieder high\r
+pro_sleep_s2:\r
+ owwh \r
+ ldi param,40\r
+ rcall wait_time\r
+ //Presents Impuls\r
+ sbi OW_DDR,OW_PIN\r
+ ldi param,130\r
+ rcall wait_time\r
+ cbi OW_DDR,OW_PIN\r
+ //init read byte\r
+ ldi bitp,0x01\r
+ ldi rwbyte,0\r
+ clr smode\r
+ ldi mode,OWM_READ_ROM_COMMAND\r
+ //Wait for all other devices presents impuls finished\r
+ ldi param,40\r
+ rcall wait_time\r
+ ret\r
+\r
+\r
+\r
+pro_hb:\r
+ ldi ZL,low(pro_stable) \r
+ ldi ZH,high(pro_stable) \r
+ add ZL,mode \r
+ adc ZH,zero\r
+ icall\r
+ ret\r
+\r
+pro_stable: \r
+ rjmp pro_read_rom_command\r
+ rjmp pro_sleep \r
+ rjmp pro_match_rom\r
+ rjmp pro_search_rom_s\r
+ rjmp pro_search_rom_r\r
+ rjmp pro_read_command\r
+ rjmp pro_write_scratchpad\r
+ rjmp pro_read_scratchpad\r
+ rjmp pro_programm_page\r
+ rjmp pro_recall_flash\r
+\r
+pro_read_rom_command:\r
+ ldi mode,OWM_SLEEP\r
+ cpi rwbyte,0xCC\r
+ brne pro_rcc_1\r
+ ldi mode,OWM_READ_COMMAND\r
+ rjmp pro_out_bitp1\r
+pro_rcc_1:\r
+ cpi rwbyte,0xF0 ;Searchrom\r
+ brne pro_rcc_2\r
+ ldi XL,low(sowid) ;init sram pointer\r
+ ldi XH,high(sowid)\r
+ ld srbyte,X+\r
+ ldi bytep,0\r
+ rjmp pro_serchrom_next_bit\r
+pro_rcc_2:\r
+ cpi rwbyte,0x55 ;Matchrom\r
+ brne pro_rcc_3\r
+// rcall pro_owidinit\r
+ ldi XL,low(sowid) ;init sram pointer\r
+ ldi XH,high(sowid)\r
+ ldi mode,OWM_MATCH_ROM\r
+ rjmp pro_out_bytep0\r
+\r
+pro_rcc_3:\r
+ ret\r
+\r
+pro_match_rom: \r
+ ld temp,X+\r
+ cp temp,rwbyte\r
+ breq pro_match_rom_next\r
+ ldi mode,OWM_SLEEP\r
+ ret\r
+pro_match_rom_next: \r
+ cpi XL,SRAM_START+8\r
+ breq pro_match_rom_found\r
+ rjmp pro_out_bitp1\r
+pro_match_rom_found:\r
+ ldi mode,OWM_READ_COMMAND\r
+ rjmp pro_out_bitp1\r
+\r
+pro_read_command:\r
+ ldi mode,OWM_SLEEP\r
+ cpi rwbyte,0x0F ;; Write to Scratchpad\r
+ brne pro_rc_1\r
+ ldi mode,OWM_WRITE_SCRATCHPAD\r
+ ldi XL,low(scratchpad) ;init sram pointer\r
+ ldi XH,high(scratchpad)\r
+ rjmp pro_out_bytep0\r
+pro_rc_1:\r
+ cpi rwbyte,0xAA\r
+ brne pro_rc_2\r
+ ldi mode,OWM_READ_SCRATCHPAD ;;Read from Scratchpad\r
+ ldi XL,low(scratchpad) ;init sram pointer\r
+ ldi XH,high(scratchpad)\r
+ inc smode\r
+ ld rwbyte,X+\r
+ rjmp pro_out_bytep0\r
+\r
+pro_rc_2:\r
+ cpi rwbyte,0xB8\r
+ brne pro_rc_3\r
+ ldi mode,OWM_RECALL_FLASH ;; copy Flash page in Scratchpad\r
+ ldi XL,low(scratchpad) ;init sram pointer\r
+ ldi XH,high(scratchpad)\r
+ rjmp pro_out_bytep0\r
+pro_rc_3:\r
+ cpi rwbyte,0x55 ; copy Scratchpad to Flash\r
+ brne pro_rc_4\r
+ ldi mode,OWM_SLEEP\r
+ rjmp pro_programm_page\r
+ \r
+pro_rc_4:\r
+ cpi rwbyte,0x89 ; Reset Device /Boot (new) Firmware\r
+ brne pro_rc_5\r
+ rjmp jreset \r
+pro_rc_5:\r
+ cpi rwbyte,0x8B ; Clear the OWID saved in EEPROM / one ID1\r
+ brne pro_rc_6 \r
+ ldi temp,7\r
+pro_rc_5a:\r
+ ldi XL,low(E2END)\r
+ ldi XH,high(E2END)\r
+ sub XL,temp\r
+ out EEARH,XH\r
+ out EEARL,XL\r
+ ldi temp, (0<<EEPM1)|(0<<EEPM0)\r
+ out EECR, temp\r
+ ldi temp,0xFF\r
+ out EEDR, temp\r
+ sbi EECR, EEMPE\r
+ sbi EECR, EEPE\r
+ ret\r
+\r
+\r
+pro_rc_6:\r
+ cpi rwbyte,0x8C ; Clear the OWID saved in EEPROM / one ID2\r
+ brne pro_rc_7\r
+ ldi temp,7+8\r
+ rjmp pro_rc_5a\r
+\r
+pro_rc_7:\r
+ ret\r
+\r
+pro_write_scratchpad:\r
+ st X+,rwbyte\r
+ cpi XL,SRAM_START+8+66\r
+ brlo pro_write_scratchpad_next\r
+ ldi mode,OWM_SLEEP\r
+ ret \r
+pro_write_scratchpad_next:\r
+ ldi bitp,1\r
+ ret\r
+\r
+pro_read_scratchpad:\r
+ cpi XL,SRAM_START+8+66\r
+ brlo pro_read_scratchpad_next\r
+ ldi mode,OWM_SLEEP\r
+ clr smode\r
+ ret\r
+pro_read_scratchpad_next:\r
+ ld rwbyte,X+\r
+ rjmp pro_out_bitp1\r
+\r
+\r
+pro_programm_page:\r
+.equ PAGESIZEB = PAGESIZE*2;PAGESIZEB is page size in BYTES, not words\r
+// .org SMALLBOOTSTART\r
+write_page:\r
+ ;transfer data from RAM to Flash page buffer\r
+ ldi bytep, PAGESIZEB ;init loop variable\r
+ ldi YL,low(scratchpad) ;init sram pointer\r
+ ldi YH,high(scratchpad)\r
+ ld ZL,Y+\r
+ ld ZH,Y+\r
+ ;page erase\r
+ ldi spmcrval, (1<<PGERS) + (1<<SPMEN)\r
+ rcall do_spm\r
+wrloop:\r
+ ld r0, Y+\r
+ ld r1, Y+\r
+ ldi spmcrval, (1<<SPMEN)\r
+ rcall do_spm\r
+ adiw ZH:ZL, 2\r
+ subi bytep, 2;use subi for PAGESIZEB<=256\r
+ brne wrloop\r
+ ;execute page write\r
+ subi ZL, low(PAGESIZEB) ;restore pointer\r
+ sbci ZH, high(PAGESIZEB) ;not required for PAGESIZEB<=256\r
+ ldi spmcrval, (1<<PGWRT) + (1<<SPMEN)\r
+ rcall do_spm\r
+ ;read back and check, optional\r
+ ldi bytep, PAGESIZEB\r
+ subi YL, low(PAGESIZEB) ;restore pointer\r
+ sbci YH, high(PAGESIZEB)\r
+rdloop:\r
+ lpm r0, Z+\r
+ ld r1, Y+\r
+ cpse r0, r1\r
+ rjmp error\r
+ subi bytep, 2;use subi for PAGESIZEB<=256\r
+ brne rdloop\r
+ ;return\r
+ ret\r
+do_spm:\r
+ ;input: spmcrval determines SPM action\r
+ ;disable interrupts if enabled, store status\r
+ in temp2, SREG\r
+ cli\r
+ ;check for previous SPM complete\r
+wait:\r
+ in temp, SPMCSR\r
+ sbrc temp, SPMEN\r
+ rjmp wait\r
+ ;SPM timed sequence\r
+ out SPMCSR, spmcrval\r
+ spm\r
+ ;restore SREG (to enable interrupts if originally enabled)\r
+ out SREG, temp2\r
+ ret\r
+\r
+error:\r
+\r
+\r
+ ret\r
+\r
+pro_recall_flash:\r
+ st X+,rwbyte\r
+ ;inc bytep\r
+ cpi XL,SRAM_START+8+2\r
+ brlo pro_out_bitp1;pro_recall_flash_next\r
+ lds ZL,scratchpad\r
+ lds ZH,scratchpad+1\r
+pro_recall_flash_cl:\r
+ lpm temp,Z+\r
+ st X+,temp\r
+ cpi XL,SRAM_START+8+66\r
+ brne pro_recall_flash_cl\r
+ ldi mode,OWM_SLEEP\r
+ ret\r
+\r
+pro_out_read_command:\r
+ ldi mode,OWM_READ_COMMAND\r
+pro_out_bytep0:\r
+ ldi bytep,0\r
+pro_out_bitp1:\r
+ ldi bitp,1\r
+ ret \r
+\r
+\r
+\r
+pro_serchrom_next_bit:\r
+ mov rwbyte,srbyte\r
+ mov temp2,rwbyte\r
+ com rwbyte\r
+ ror temp2 ;first bit in C\r
+ rol rwbyte ;C in first bit \r
+ inc smode\r
+ ldi bitp,0x40\r
+ ldi mode,OWM_SEARCH_ROM_R ;next mod Resive\r
+ ret\r
+\r
+\r
+pro_search_rom_s:\r
+ clr temp2\r
+ lsr srbyte ;shift in C lowest bit\r
+ ror temp2 ; shift in temp2 as highest bit\r
+ andi rwbyte,0x80 ; clear other bits\r
+ eor temp2,rwbyte\r
+ breq pro_search_rom_s_goon\r
+ ldi mode,OWM_SLEEP\r
+ ret\r
+pro_search_rom_s_goon:\r
+ inc bytep\r
+ mov temp2,bytep\r
+ andi temp2,0x07\r
+ brne pro_serchrom_next_bit ;prepare next bit\r
+ mov temp2,bytep\r
+ andi temp2,0x40 ;;end\r
+ brne pro_search_rom_found\r
+ ;read next byte\r
+ ld srbyte,X+\r
+ rjmp pro_serchrom_next_bit\r
+\r
+pro_search_rom_found:\r
+ ldi mode,OWM_READ_COMMAND\r
+ rjmp pro_out_bytep0\r
+\r
+pro_search_rom_r:\r
+ clr smode\r
+ ldi mode,OWM_SEARCH_ROM_S\r
+ ldi bitp,0 ;go to searchrom_s after bit get\r
+ ret\r
+\r
+pro_owid: .DB 0xA3, 0xAA, 0x55, 0xAA, 0x55, 0xAA, 0x55, 0xFA\r
+\r
+\r
+\r
+\r
+\r
+wait_time:\r
+ out TCNT0,zero\r
+wait_time1:\r
+ in temp,TCNT0\r
+ cp temp,param\r
+ brlo wait_time1\r
+ ret\r
+\r
+\r
+.DSEG\r
+sowid: .BYTE 8\r
scratchpad: .BYTE 66
\ No newline at end of file