1 // Copyright (c) 2015, Tobias Mueller tm(at)tm3d.de
\r
2 // All rights reserved.
\r
4 // Redistribution and use in source and binary forms, with or without
\r
5 // modification, are permitted provided that the following conditions are
\r
8 // * Redistributions of source code must retain the above copyright
\r
9 // notice, this list of conditions and the following disclaimer.
\r
10 // * Redistributions in binary form must reproduce the above copyright
\r
11 // notice, this list of conditions and the following disclaimer in the
\r
12 // documentation and/or other materials provided with the
\r
14 // * All advertising materials mentioning features or use of this
\r
15 // software must display the following acknowledgement: This product
\r
16 // includes software developed by tm3d.de and its contributors.
\r
17 // * Neither the name of tm3d.de nor the names of its contributors may
\r
18 // be used to endorse or promote products derived from this software
\r
19 // without specific prior written permission.
\r
21 // THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS
\r
22 // "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT
\r
23 // LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR
\r
24 // A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT
\r
25 // OWNER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL,
\r
26 // SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT
\r
27 // LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE,
\r
28 // DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY
\r
29 // THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT
\r
30 // (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE
\r
31 // OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
\r
35 .macro cjmp val,addr
\r
39 .macro cljmp val,addr; Weiter sprung, wenn das ziel zu weit entfernt fuer brxx
\r
46 .macro cset val,mod ;Nur der Mode wird gesetzt. Abkuerzung da oft nur das noch bleibt
\r
58 #define OW_READ_ROM_COMMAND 1
\r
59 #define OW_MATCHROM 2
\r
60 #define OW_SEARCHROMS 3 ;next send two bit
\r
61 #define OW_SEARCHROMR 4 ; next resive master answer
\r
62 #define OW_READROM 5
\r
63 #define OW_READ_COMMAND 6
\r
64 #define OW_FWCONFIGINFO 7
\r
67 #ifdef _CHANGEABLE_ID_
\r
68 #define OW_WRITE_NEWID 8
\r
69 #define OW_READ_NEWID 9
\r
70 #define OW_SET_NEWID 10
\r
71 #define OW_FIRST_COMMAND 11
\r
75 .macro CHANGE_ID_COMMANDS
\r
76 cset 0x75,OW_WRITE_NEWID
\r
77 cljmp 0xA7,hrc_set_readid
\r
78 cljmp 0x79,hrc_set_setid
\r
83 #define OW_FIRST_COMMAND 8
\r
87 ; test auf run flasher command 0x88 in h_readcommand
\r
88 .macro FLASH_COMMANDS
\r
91 rjmp hrc_jmp_flasher
\r
92 1: ldi r_temp,0 ;Anderes Kommando flashmarker zuruecksetzen...
\r
93 sts flashmarker,r_temp
\r
97 .macro FW_CONFIG_INFO
\r
98 cljmp 0x85,hrc_fw_configinfo
\r
102 #ifdef _CHANGEABLE_ID_
\r
103 ; lesen der ID aus dem EEPROM beim Start
\r
106 push r_rwbyte//r_temp2 and Z is not in gnu C save area
\r
107 ldi r_temp2,lo8(E2END)
\r
110 out _SFR_IO_ADDR(EEARH), zh
\r
114 read_EEPROM_ID_loop:
\r
115 sbic _SFR_IO_ADDR(EECR), EEPE
\r
116 rjmp read_EEPROM_ID_loop
\r
117 out _SFR_IO_ADDR(EEARL),r_temp2
\r
118 sbi _SFR_IO_ADDR(EECR), EERE
\r
119 in r_rwbyte,_SFR_IO_ADDR(EEDR)
\r
121 breq read_EEPROM_ID_end
\r
126 brne read_EEPROM_ID_loop
\r
127 read_EEPROM_ID_end:
\r
139 rjmp handle_end_no_bcount // sleep eventuell reset, nichts tun und auf Timeout warten
\r
140 rjmp h_readromcommand
\r
145 rjmp h_readcommand
\r
146 rjmp h_fwconfiginfo
\r
147 #ifdef _CHANGEABLE_ID_
\r
158 cset 0x55,OW_MATCHROM
\r
159 cjmp 0xF0,hrc_set_searchrom
\r
160 cjmp 0xCC,hrc_start_read_command ;skip rom
\r
161 cjmp 0x33,hrc_set_read_rom
\r
162 cjmp 0xEC,hrc_set_alarm_search
\r
164 rjmp handle_end_sleep
\r
166 #ifndef _DIS_FLASH_
\r
167 ;sprung zum flasher
\r
169 lds r_temp,flashmarker
\r
171 brne hrc_jmp_flasher_inc
\r
176 ret ; Direkter Sprung zum Bootloader
\r
177 hrc_jmp_flasher_inc:
\r
179 sts flashmarker,r_temp
\r
180 rjmp handle_end_sleep
\r
184 hrc_set_searchrom:
\r
185 lds r_rwbyte,owid ;erstes Byte lesen
\r
186 rjmp h_searchrom_next_bit
\r
188 hrc_start_read_command: ;Skip rom und Matchrom ok...
\r
189 ldi r_mode,OW_READ_COMMAND
\r
194 ldi r_mode,OW_READROM
\r
198 hrc_set_alarm_search:
\r
199 lds r_temp,alarmflag
\r
201 brne hrc_set_searchrom ;alarm flag nicht 0 also gehe zu searchrom
\r
203 rjmp handle_end_sleep
\r
207 ldi r_mode,OW_FWCONFIGINFO
\r
210 rjmp h_fwconfiginfo
\r
213 ;---------------------------------------------------
\r
215 ;---------------------------------------------------
\r
219 configZ owid,r_bytep
\r
223 rjmp handle_end_sleep
\r
227 breq hrc_start_read_command ;Starten von Read Command
\r
228 rjmp handle_end_inc
\r
232 ;---------------------------------------------------
\r
234 ;---------------------------------------------------
\r
237 h_searchrom_next_bit: ;Setup next Bit of ID
\r
238 sts srbyte,r_rwbyte ;erstes Byte speichern von der Aufrufenden Ebene
\r
239 mov r_temp2,r_rwbyte
\r
240 com r_rwbyte ; negieren
\r
241 ror r_temp2 ; erstes unnegiertes bit in Carry
\r
242 rol r_rwbyte ;und dann als erstes bit in r_rwbyte
\r
244 ldi r_bcount,0x40 ; zwei bits sensden dann zu Searchromr
\r
245 ldi r_mode,OW_SEARCHROMR
\r
246 rjmp handle_end_no_bcount
\r
250 h_searchroms: ; Modus Send zwei bit
\r
252 sbrc r_rwbyte,7 ; bit gesetz (1 empfangen)
\r
254 lds r_bcount,srbyte ;r_bcount wird am ende gesetzt
\r
255 eor r_temp,r_bcount
\r
257 rjmp h_searchroms_next ; Vergleich des letzen gelesenen bits mit der id
\r
262 rjmp handle_end_sleep
\r
263 h_searchroms_next: ; Setup next bit
\r
264 inc r_bytep ; zaehler der Bits erhoehen
\r
265 sbrc r_bytep,6 ; 64 bit erreicht
\r
266 rjmp h_searchrom_end_ok ;alles ok auf Command warten
\r
267 mov r_temp,r_bytep
\r
269 brne h_searchroms_next_bit ; bit zwischen 0 und 8
\r
270 mov r_bcount,r_bytep ; next Byte lesen
\r
275 configZ owid,r_bcount
\r
277 sts srbyte,r_rwbyte
\r
278 rjmp h_searchrom_next_bit
\r
280 h_searchroms_next_bit: ;next Bit lesen
\r
281 ;sts srbytep,r_bcount
\r
282 lds r_rwbyte,srbyte
\r
283 lsr r_rwbyte ;aktuelles byte weiterschieben r_rwbyte hier zweckefrei verwendet
\r
284 rjmp h_searchrom_next_bit ;algemeine routine zum vorbereiten
\r
285 h_searchrom_end_ok:
\r
287 rjmp hrc_start_read_command
\r
291 ldi r_mode,OW_SEARCHROMS
\r
293 rjmp handle_end_no_bcount
\r
296 ;---------------------------------------------------
\r
298 ;---------------------------------------------------
\r
303 configZ owid,r_bytep
\r
305 rjmp handle_end_inc
\r
307 rjmp handle_end_sleep
\r
310 ;---------------------------------------------------
\r
312 ;---------------------------------------------------
\r
316 breq h_fwconfiginfo_crc
\r
319 breq h_fwconfiginfo_all
\r
320 #elif defined _CRC16_
\r
322 breq h_fwconfiginfo_crc2
\r
324 breq h_fwconfiginfo_all
\r
327 breq h_fwconfiginfo_all
\r
328 #warning No CRC known code implemented
\r
330 configZ config_info,r_bytep
\r
332 rjmp handle_end_inc
\r
333 h_fwconfiginfo_crc:
\r
335 rjmp handle_end_inc
\r
336 h_fwconfiginfo_crc2:
\r
338 rjmp handle_end_inc
\r
339 h_fwconfiginfo_all:
\r
340 rjmp handle_end_sleep
\r
343 ;---------------------------------------------------
\r
344 ; CHANGE ROM FUNCTIONS
\r
345 ;---------------------------------------------------
\r
348 #ifdef _CHANGEABLE_ID_
\r
351 configZ newid,r_bytep
\r
355 rjmp handle_end_inc
\r
357 rjmp handle_end_sleep
\r
361 ldi r_mode,OW_READ_NEWID
\r
366 configZ newid,r_bytep
\r
368 rjmp handle_end_inc
\r
371 rjmp handle_end_sleep
\r
374 ldi r_mode,OW_SET_NEWID
\r
375 ;ldi r_bytep,1 ;start to write in 2
\r
376 rjmp handle_end_inc ;set r_bytep to 1!!!
\r
379 configZ owid,r_bytep
\r
382 brne h_setid_bad_code_all
\r
388 breq h_setid_copy_id
\r
389 rjmp h_setid_bad_code_all ;sollte eigentlich nicht passieren
\r
397 ldi r_temp2,lo8(E2END)
\r
401 ;ldi r_temp,0 ;kommt nicht vor das ein E2ROM genau n*256+(0 bis 7) byte gross ist
\r
403 out _SFR_IO_ADDR(EEARH),zh
\r
407 h_setid_EEPROM_write:
\r
408 sbic _SFR_IO_ADDR(EECR), EEPE
\r
409 rjmp h_setid_EEPROM_write
\r
410 ldi r_temp, (0<<EEPM1)|(0<<EEPM0)
\r
411 out _SFR_IO_ADDR(EECR), r_temp
\r
412 ;nur adresse L schreiben H bleibt aus oben genannten grund gleich.
\r
413 out _SFR_IO_ADDR(EEARL),r_temp2
\r
415 out _SFR_IO_ADDR(EEDR), r_rwbyte
\r
416 sbi _SFR_IO_ADDR(EECR), EEMPE
\r
417 sbi _SFR_IO_ADDR(EECR), EEPE
\r
421 brne h_setid_EEPROM_write
\r
422 rcall read_EEPROM_ID
\r
423 h_setid_bad_code_all:
\r
424 rjmp handle_end_sleep
\r
441 #ifndef _DIS_FLASH_
\r
442 ; check for bootloader jumper
\r
443 ;vor allen anderen Registerconfigs
\r
445 ldi r_temp,(1<<PUD) ;enable pullup
\r
446 out _SFR_IO_ADDR(MCUCR) ,r_temp
\r
447 sbi _SFR_IO_ADDR(PORTA),PINA5 ;internal pullup on PINA5
\r
448 sbi _SFR_IO_ADDR(PORTA),PINA4 ;internal pullup on PINA4
\r
450 sbis _SFR_IO_ADDR(PINA),PINA5
\r
451 rjmp owinit_botest_end ;PinA5 nicht auf 1
\r
452 sbis _SFR_IO_ADDR(PINA),PINA4
\r
453 rjmp owinit_botest_end ;PinA4 nicht auf 1
\r
454 cbi _SFR_IO_ADDR(PORTA),PINA4
\r
455 sbi _SFR_IO_ADDR(DDRA),PINA4 ;PINA4 AUSGANG und 0
\r
457 sbic _SFR_IO_ADDR(PINA),PINA5
\r
458 rjmp owinit_botest_end ;PINA5 nicht 0.... nicht verbunden
\r
459 cbi _SFR_IO_ADDR(DDRA),PINA4
\r
464 ret ; Direkter Sprung zum Bootloader*/
\r
467 HW_INIT //Microcontroller specific
\r
468 CHIP_INIT //1-Wire device specific
\r
469 #ifdef _CHANGEABLE_ID_
\r
470 rcall read_EEPROM_ID
\r
475 sts alarmflag,r_temp
\r
481 .global EXTERN_SLEEP
\r
486 sts mode,r_temp ;SLEEP
\r
487 sts gcontrol,r_temp
\r
488 sts sendflag,r_temp
\r