2 .def srbyte = r12 ;byty for search rom algorithm
\r
3 .def writelow = r13; marker for send low
\r
4 .def zero =r14; always zero
\r
5 .def smode=r15; if 1 then send
\r
9 .def bitp = r19 ; bit counter ... shift...
\r
12 .def bytep = r23 ;byte counter
\r
13 #define spmcrval param
\r
16 .equ OWM_READ_ROM_COMMAND=0 ; 0 wegen schnellen test ist dieser wert 0! Daturch wird die Sprungdabelle nicht verwendet
\r
17 .equ OWM_SLEEP=1 ; Warten auf Reset
\r
18 .equ OWM_MATCH_ROM=2
\r
19 .equ OWM_SEARCH_ROM_S=3 ;send bit
\r
20 .equ OWM_SEARCH_ROM_R=4 ;resive master
\r
21 .equ OWM_READ_COMMAND=5
\r
22 .equ OWM_WRITE_SCRATCHPAD=6
\r
23 .equ OWM_READ_SCRATCHPAD=7
\r
24 .equ OWM_PROGRAMM_PAGE=8
\r
25 .equ OWM_RECALL_FLASH=9
\r
30 .equ OW_PIN = PORTD2
\r
31 .equ OW_PORT = PORTD
\r
36 ;.equ SRAM_START = 0x60
\r
58 ;---------------------------------------------------
\r
60 ;---------------------------------------------------
\r
66 jmp start ; Reset-Vector
\r
94 set_clock 0x01 ;4mhz
\r
96 ldi temp,(1<<CS01) //2us
\r
98 ldi temp, HIGH(RAMEND) ; HIGH-Byte der obersten RAM-Adresse
\r
100 ldi temp, LOW(RAMEND) ; LOW-Byte der obersten RAM-Adresse
\r
108 ldi ZL,low(pro_owid*2)
\r
109 ldi ZH,high(pro_owid*2)
\r
113 pro_copy_loop: ;copy ID on SRAM for better handling
\r
116 cpi XL,low(SRAM_START+8) ;#################################
\r
120 owwl ;wait for line goes low (polling)
\r
121 sbrc writelow,0 ;test of zero send
\r
122 sbi OW_DDR,OW_PIN ;yes pull line to low 2us faster
\r
123 sbrs writelow,0 ;test egain 2us faster.....
\r
124 rjmp pro_loop1 ;no ? goes next
\r
125 ldi param,20 ;wait for 50 us
\r
127 clr writelow ;reset write low indecator
\r
128 cbi OW_DDR,OW_PIN ;release line
\r
129 owwh ;wait for line is high (it can takes some time cause of the capacity of line)
\r
131 tst smode ;smode=1 for slave sends to master
\r
135 brne pro_loop_send1
\r
138 breq pro_loop_end ; now reading ... do nothing
\r
139 pro_loop_send1: ;prebare next bit
\r
140 sbrs rwbyte ,0; if bit 0 set in rwbyte then skip next command
\r
147 ldi param,7 ;wait 15us
\r
151 sbic OW_PINN,OW_PIN ;test line
\r
154 brne pro_loop_end ;no handle need
\r
157 brne pro_loop_send ; Nach dem Gelesen byte koennte gesendet werden muessen....
\r
161 pro_loop_end_test_reset:
\r
162 sbic OW_PINN,OW_PIN //leitung wieder high
\r
166 brlo pro_loop_end_test_reset
\r
176 sbic OW_PINN,OW_PIN //leitung wieder high
\r
181 //leitung wieder high
\r
195 ldi mode,OWM_READ_ROM_COMMAND
\r
196 //Wait for all other devices presents impuls finished
\r
204 ldi ZL,low(pro_stable)
\r
205 ldi ZH,high(pro_stable)
\r
212 rjmp pro_read_rom_command
\r
215 rjmp pro_search_rom_s
\r
216 rjmp pro_search_rom_r
\r
217 rjmp pro_read_command
\r
218 rjmp pro_write_scratchpad
\r
219 rjmp pro_read_scratchpad
\r
220 rjmp pro_programm_page
\r
221 rjmp pro_recall_flash
\r
223 pro_read_rom_command:
\r
227 ldi mode,OWM_READ_COMMAND
\r
230 cpi rwbyte,0xF0 ;Searchrom
\r
232 ldi XL,low(sowid) ;init sram pointer
\r
236 rjmp pro_serchrom_next_bit
\r
238 cpi rwbyte,0x55 ;Matchrom
\r
240 // rcall pro_owidinit
\r
241 ldi XL,low(sowid) ;init sram pointer
\r
243 ldi mode,OWM_MATCH_ROM
\r
244 rjmp pro_out_bytep0
\r
252 breq pro_match_rom_next
\r
255 pro_match_rom_next:
\r
256 cpi XL,LOW(SRAM_START+8);####################
\r
257 breq pro_match_rom_found
\r
259 pro_match_rom_found:
\r
260 ldi mode,OWM_READ_COMMAND
\r
265 cpi rwbyte,0x0F ;; Write to Scratchpad
\r
267 ldi mode,OWM_WRITE_SCRATCHPAD
\r
268 ldi XL,low(scratchpad) ;init sram pointer
\r
269 ldi XH,high(scratchpad)
\r
270 rjmp pro_out_bytep0
\r
274 ldi mode,OWM_READ_SCRATCHPAD ;;Read from Scratchpad
\r
275 ldi XL,low(scratchpad) ;init sram pointer
\r
276 ldi XH,high(scratchpad)
\r
279 rjmp pro_out_bytep0
\r
284 ldi mode,OWM_RECALL_FLASH ;; copy Flash page in Scratchpad
\r
285 ldi XL,low(scratchpad) ;init sram pointer
\r
286 ldi XH,high(scratchpad)
\r
287 rjmp pro_out_bytep0
\r
289 cpi rwbyte,0x55 ; copy Scratchpad to Flash
\r
292 rjmp pro_programm_page
\r
295 cpi rwbyte,0x89 ; Reset Device /Boot (new) Firmware
\r
299 cpi rwbyte,0x8B ; Clear the OWID saved in EEPROM / one ID1
\r
308 ldi temp, (0<<EEPM1)|(0<<EEPM0)
\r
318 cpi rwbyte,0x8C ; Clear the OWID saved in EEPROM / one ID2
\r
326 pro_write_scratchpad:
\r
328 cpi XL,138 ;#####################################
\r
329 brlo pro_write_scratchpad_next
\r
332 pro_write_scratchpad_next:
\r
336 pro_read_scratchpad:
\r
337 cpi XL,8+130 ;###################################
\r
338 brlo pro_read_scratchpad_next
\r
342 pro_read_scratchpad_next:
\r
348 .equ PAGESIZEB = 128 ; Not correct deglaration in inc file of ATMEGA328PB PAGESIZE*2;PAGESIZEB is page size in BYTES, not words
\r
349 // .org SMALLBOOTSTART
\r
351 ;transfer data from RAM to Flash page buffer
\r
352 ldi bytep, PAGESIZEB ;init loop variable
\r
353 ldi YL,low(scratchpad) ;init sram pointer
\r
354 ldi YH,high(scratchpad)
\r
358 ldi spmcrval,(1<<PGERS) | (1<<SPMEN)
\r
360 ldi spmcrval, (1<<RWWSRE) | (1<<SPMEN)
\r
365 ldi spmcrval, (1<<SPMEN)
\r
368 subi bytep, 2;use subi for PAGESIZEB<=256
\r
370 ;execute page write
\r
371 subi ZL, low(PAGESIZEB) ;restore pointer
\r
372 sbci ZH, high(PAGESIZEB) ;not required for PAGESIZEB<=256
\r
373 ldi spmcrval, (1<<PGWRT) + (1<<SPMEN)
\r
375 ldi spmcrval, (1<<RWWSRE) | (1<<SPMEN)
\r
377 ;read back and check, optional
\r
378 ldi bytep, PAGESIZEB
\r
379 subi YL, low(PAGESIZEB) ;restore pointer
\r
380 sbci YH, high(PAGESIZEB)
\r
386 subi bytep, 2;use subi for PAGESIZEB<=256
\r
391 ;input: spmcrval determines SPM action
\r
392 ;disable interrupts if enabled, store status
\r
395 ;check for previous SPM complete
\r
400 ;SPM timed sequence
\r
401 out SPMCSR, spmcrval
\r
403 ;restore SREG (to enable interrupts if originally enabled)
\r
415 cpi XL,low(SRAM_START+8+2) ;##############################################
\r
416 brlo pro_out_bitp1;pro_recall_flash_next
\r
418 lds ZH,scratchpad+1
\r
419 pro_recall_flash_cl:
\r
422 cpi XL,low(SRAM_START+8+66) ;############################################
\r
423 brne pro_recall_flash_cl
\r
427 pro_out_read_command:
\r
428 ldi mode,OWM_READ_COMMAND
\r
437 pro_serchrom_next_bit:
\r
441 ror temp2 ;first bit in C
\r
442 rol rwbyte ;C in first bit
\r
445 ldi mode,OWM_SEARCH_ROM_R ;next mod Resive
\r
451 lsr srbyte ;shift in C lowest bit
\r
452 ror temp2 ; shift in temp2 as highest bit
\r
453 andi rwbyte,0x80 ; clear other bits
\r
455 breq pro_search_rom_s_goon
\r
458 pro_search_rom_s_goon:
\r
462 brne pro_serchrom_next_bit ;prepare next bit
\r
464 andi temp2,0x40 ;;end
\r
465 brne pro_search_rom_found
\r
468 rjmp pro_serchrom_next_bit
\r
470 pro_search_rom_found:
\r
471 ldi mode,OWM_READ_COMMAND
\r
472 rjmp pro_out_bytep0
\r
476 ldi mode,OWM_SEARCH_ROM_S
\r
477 ldi bitp,0 ;go to searchrom_s after bit get
\r
480 pro_owid: .DB 0xA3, 0xAA, 0x57, 0xAA, 0x57, 0xAA, 0x57, 0x8A
\r
497 scratchpad: .BYTE 130