1 // Copyright (c) 2015, Tobias Mueller tm(at)tm3d.de
2 // All rights reserved.
4 // Redistribution and use in source and binary forms, with or without
5 // modification, are permitted provided that the following conditions are
8 // * Redistributions of source code must retain the above copyright
9 // notice, this list of conditions and the following disclaimer.
10 // * Redistributions in binary form must reproduce the above copyright
11 // notice, this list of conditions and the following disclaimer in the
12 // documentation and/or other materials provided with the
14 // * All advertising materials mentioning features or use of this
15 // software must display the following acknowledgement: This product
16 // includes software developed by tm3d.de and its contributors.
17 // * Neither the name of tm3d.de nor the names of its contributors may
18 // be used to endorse or promote products derived from this software
19 // without specific prior written permission.
21 // THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS
22 // "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT
23 // LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR
24 // A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT
25 // OWNER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL,
26 // SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT
27 // LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE,
28 // DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY
29 // THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT
30 // (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE
31 // OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
39 .macro cljmp val,addr; Weiter sprung, wenn das ziel zu weit entfernt fuer brxx
46 .macro cset val,mod ;Nur der Mode wird gesetzt. Abkuerzung da oft nur das noch bleibt
58 #define OW_READ_ROM_COMMAND 1
60 #define OW_SEARCHROMS 3 ;next send two bit
61 #define OW_SEARCHROMR 4 ; next resive master answer
62 #define OW_READ_COMMAND1 5
63 #define OW_READ_COMMAND2 6
64 #define OW_FWCONFIGINFO1 7
65 #define OW_FWCONFIGINFO2 8
68 #ifdef _CHANGEABLE_ID_
69 #define OW_WRITE_NEWID 9
70 #define OW_READ_NEWID 10
71 #define OW_SET_NEWID 11
72 #define OW_FIRST_COMMAND 12
76 .macro CHANGE_ID_COMMANDS
77 cset 0x75,OW_WRITE_NEWID
78 cljmp 0xA7,hrc_set_readid
79 cljmp 0x79,hrc_set_setid
84 #define OW_FIRST_COMMAND 9
88 ; test auf run flasher command 0x88 in h_readcommand
93 1: ldi r_temp,0 ;Anderes Kommando flashmarker zuruecksetzen...
94 sts flashmarker,r_temp
99 .macro FW_CONFIG_INFO1
100 cljmp 0x85,hrc_fw_configinfo1
102 .macro FW_CONFIG_INFO2
103 cljmp 0x85,hrc_fw_configinfo2
106 #ifdef _CHANGEABLE_ID_
107 ; lesen der ID aus dem EEPROM beim Start
109 ldi r_temp2,lo8(E2END)
112 out _SFR_IO_ADDR(EEARH), zh
116 rjmp read_EEPROM_ID_loop
118 ldi r_temp2,lo8(E2END)
121 out _SFR_IO_ADDR(EEARH), zh
126 sbic _SFR_IO_ADDR(EECR), EEPE
127 rjmp read_EEPROM_ID_loop
128 out _SFR_IO_ADDR(EEARL),r_temp2
129 sbi _SFR_IO_ADDR(EECR), EERE
130 in r_rwbyte,_SFR_IO_ADDR(EEDR)
132 breq read_EEPROM_ID_end
137 brne read_EEPROM_ID_loop
149 rjmp handle_end_no_bcount // sleep eventuell reset, nichts tun und auf Timeout warten
150 rjmp h_readromcommand
158 #ifdef _CHANGEABLE_ID_
169 cjmp 0x55,hrc_set_matchrom
170 cjmp 0xF0,hrc_set_searchrom
171 cjmp 0xEC,hrc_set_alarm_search
173 rjmp handle_end_sleep
178 lds r_temp,flashmarker
180 brne hrc_jmp_flasher_inc
185 ret ; Direkter Sprung zum Bootloader
188 sts flashmarker,r_temp
189 rjmp handle_end_sleep
194 sts srbyte,r_temp ; Beide geraete nehmen an searchrom teil
195 ldi r_mode,OW_MATCHROM
202 sts srbyte,r_temp ; Beide geraete nehmen an searchrom teil
203 configZ idtable,r_bytep
204 rjmp h_searchrom_next_bit
206 hrc_start_read_command: ;Skip rom und Matchrom ok...
209 breq hrc_start_read_command1
211 breq hrc_start_read_command2
212 rjmp handle_end_sleep
214 hrc_start_read_command1:
215 ldi r_mode,OW_READ_COMMAND1
217 hrc_start_read_command2:
218 ldi r_mode,OW_READ_COMMAND2
222 hrc_set_alarm_search:
225 brne hrc_set_searchrom ;alarm flag nicht 0 also gehe zu searchrom
227 rjmp handle_end_sleep
230 ldi r_mode,OW_FWCONFIGINFO1
235 ldi r_mode,OW_FWCONFIGINFO2
240 ;---------------------------------------------------
242 ;---------------------------------------------------
247 sbrs r_bcount,0 ;ueberspringe wenn bit 1 =0 also geraet 1 nich mehr im rennen
249 configZ owid1,r_bytep
253 cbr r_bcount,1 ; loesche geraet
254 breq h_matchrom_sleep
256 configZ owid2,r_bytep
260 cbr r_bcount,2 ; loesche geraet
261 breq h_matchrom_sleep
266 breq hrc_start_read_command ;Starten von Read Command
271 rjmp handle_end_sleep
274 ;---------------------------------------------------
276 ;---------------------------------------------------
279 h_searchrom_next_bit: ;Setup next Bit of ID
281 lds r_temp,srbyte ;srbyte ist ein zeiger auf die bits fuer ein bit im Table
282 h_searchrom_next_bit_l2:
284 breq h_searchrom_next_bit_l1
288 rjmp h_searchrom_next_bit_l2
289 h_searchrom_next_bit_l1:
291 rol r_rwbyte ; negiertes bit in rwbyte
293 rol r_rwbyte ; bit in rwbyte
295 ldi r_bcount,0x40 ; zwei bits sensden dann zu Searchromr
296 ldi r_mode,OW_SEARCHROMR
297 rjmp handle_end_no_bcount
301 h_searchroms: ; Modus Send zwei bit
302 configZ idtable,r_bytep
306 breq h_searchroms_idd
308 breq h_searchroms_id1
310 breq h_searchroms_id2
311 rjmp handle_end_sleep ; zur Sicherheit.....
314 breq h_searchroms_idd_zero
316 sbrc r_temp2,0 ;springe wenn nicht beide bits 0 (id 1 negiert und id 2 negiert)
317 rjmp handle_end_sleep ;
318 sbrc r_temp2,4 ;id1 set? then skip
319 cbr r_temp,1 ; loesche bit 1 in srbyte
320 sbrc r_temp2,2 ; springe wenn id 2 gesetzt ist
321 cbr r_temp,2 ; loesche bit 2 in srbyte
323 rjmp h_searchroms_idX_end
324 h_searchroms_idd_zero:
325 sbrc r_temp2,1 ;springe wenn nicht beide 1 (id 1 und id 2 )
326 rjmp handle_end_sleep ;beide 1 gehe schlafen
327 sbrs r_temp2,4 ;id1 0? then skip
328 cbr r_temp,1 ; loesche bit 1 in srbyte
329 sbrs r_temp2,2 ; springe wenn id 2 null ist
330 cbr r_temp,2 ; loesche bit 2 in srbyte
332 rjmp h_searchroms_idX_end
335 breq h_searchroms_id1_zero
337 sbrs r_temp2,5 ;id1 set? then skip
338 rjmp handle_end_sleep ;
339 rjmp h_searchroms_idX_end
340 h_searchroms_id1_zero:
341 sbrs r_temp2,4 ;id1 set? then skip
342 rjmp handle_end_sleep ;
343 rjmp h_searchroms_idX_end
346 breq h_searchroms_id2_zero
348 sbrs r_temp2,3 ;id1 set? then skip
349 rjmp handle_end_sleep ;
350 rjmp h_searchroms_idX_end
351 h_searchroms_id2_zero:
352 sbrs r_temp2,2 ;id1 set? then skip
353 rjmp handle_end_sleep ;
354 rjmp h_searchroms_idX_end
355 h_searchroms_idX_end:
358 brne h_searchroms_idX_end1
359 rjmp handle_end_sleep
360 h_searchroms_idX_end1:
363 breq h_searchrom_end_ok ;unterschied nur das letzt bit wird wohl nie vorkommen
364 rjmp h_searchrom_next_bit
368 rjmp hrc_start_read_command
370 h_searchromr: ; stelle um auf empfangen
372 ldi r_mode,OW_SEARCHROMS
373 ldi r_bcount,0 ;gehe nach einem bit zu SEARCHROMS
374 rjmp handle_end_no_bcount
377 ;---------------------------------------------------
379 ;---------------------------------------------------
382 configZ config_info1,r_bytep
383 rjmp h_fwconfiginfo_go
385 configZ config_info2,r_bytep
389 breq h_fwconfiginfo_crc
392 breq h_fwconfiginfo_all
393 #elif defined _CRC16_
395 breq h_fwconfiginfo_crc2
397 breq h_fwconfiginfo_all
400 breq h_fwconfiginfo_all
401 #warning No CRC known code implemented
412 rjmp handle_end_sleep
415 ;---------------------------------------------------
416 ; CHANGE ROM FUNCTIONS
417 ;---------------------------------------------------
420 #ifdef _CHANGEABLE_ID_
423 configZ newid,r_bytep
429 rjmp handle_end_sleep
433 ldi r_mode,OW_READ_NEWID
438 configZ newid,r_bytep
443 rjmp handle_end_sleep
446 ldi r_mode,OW_SET_NEWID
447 ;ldi r_bytep,1 ;start to write in 2
448 rjmp handle_end_inc ;set r_bytep to 1!!!
455 configZ owid1,r_bytep
458 configZ owid2,r_bytep
462 brne h_setid_bad_code_all
469 rjmp h_setid_bad_code_all ;sollte eigentlich nicht passieren
477 ldi r_temp2,lo8(E2END)
483 ;ldi r_temp,0 ;kommt nicht vor das ein E2ROM genau n*256+(0 bis 7) byte gross ist
485 out _SFR_IO_ADDR(EEARH),zh
489 h_setid_EEPROM_write:
490 sbic _SFR_IO_ADDR(EECR), EEPE
491 rjmp h_setid_EEPROM_write
492 ldi r_temp, (0<<EEPM1)|(0<<EEPM0)
493 out _SFR_IO_ADDR(EECR), r_temp
494 ;nur adresse L schreiben H bleibt aus oben genannten grund gleich.
495 out _SFR_IO_ADDR(EEARL),r_temp2
497 out _SFR_IO_ADDR(EEDR), r_rwbyte
498 sbi _SFR_IO_ADDR(EECR), EEMPE
499 sbi _SFR_IO_ADDR(EECR), EEPE
503 brne h_setid_EEPROM_write
504 //rcall read_EEPROM_ID1
505 //rcall read_EEPROM_ID2
523 h_setid_bad_code_all:
524 rjmp handle_end_sleep
542 ; check for bootloader jumper
543 ;vor allen anderen Registerconfigs
545 ldi r_temp,(1<<PUD) ;enable pullup
546 out _SFR_IO_ADDR(MCUCR) ,r_temp
547 sbi _SFR_IO_ADDR(PORTA),PINA5 ;internal pullup on PINA5
548 sbi _SFR_IO_ADDR(PORTA),PINA4 ;internal pullup on PINA4
550 sbis _SFR_IO_ADDR(PINA),PINA5
551 rjmp owinit_botest_end ;PinA5 nicht auf 1
552 sbis _SFR_IO_ADDR(PINA),PINA4
553 rjmp owinit_botest_end ;PinA4 nicht auf 1
554 cbi _SFR_IO_ADDR(PORTA),PINA4
555 sbi _SFR_IO_ADDR(DDRA),PINA4 ;PINA4 AUSGANG und 0
557 sbic _SFR_IO_ADDR(PINA),PINA5
558 rjmp owinit_botest_end ;PINA5 nicht 0.... nicht verbunden
559 cbi _SFR_IO_ADDR(DDRA),PINA4
564 ret ; Direkter Sprung zum Bootloader*/
567 HW_INIT //Microcontroller specific
568 CHIP_INIT //1-Wire device specific
569 #ifdef _CHANGEABLE_ID_
571 rcall read_EEPROM_ID1
572 rcall read_EEPROM_ID2
597 rol r_mode ;6. Bit id1
599 rol r_mode ; 5. Bit id1negiert
601 rol r_mode ;;4. Bit id2
603 rol r_mode ;3. Bit id2 negiert
605 rol r_mode ;zweites bit id1 und id2
607 rol r_mode ;erstes bit id1 negiert und id2 negiert