Linux Git
[owSlave2.git] / common / OWRomFunctionsDual.s
1 // Copyright (c) 2017, Tobias Mueller tm(at)tm3d.de\r
2 // All rights reserved. \r
3 // \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
6 // met: \r
7 // \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
13 //    distribution. \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
20 // \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
32 \r
33 \r
34 \r
35 .macro cjmp val,addr\r
36         cpi r_rwbyte,\val\r
37         breq \addr\r
38 .endm\r
39 .macro cljmp val,addr; Weiter sprung, wenn das ziel zu weit entfernt fuer brxx\r
40         cpi r_rwbyte,\val\r
41         brne 1f\r
42         rjmp \addr\r
43 1:\r
44 .endm\r
45 \r
46 .macro cset val,mod ;Nur der Mode wird gesetzt. Abkuerzung da oft nur das noch bleibt\r
47         cpi r_rwbyte,\val\r
48         brne 1f\r
49         ldi r_mode,\mod\r
50         rjmp handle_end\r
51 1:\r
52 .endm\r
53 \r
54 \r
55 \r
56 \r
57 #define OW_SLEEP 0\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_READ_COMMAND1 5\r
63 #define OW_READ_COMMAND2 6\r
64 #define OW_READ_COMMAND12 7 ;Skip ROM.... eigentlich nicht mit mehreren geraeten, aber bei loxone schon (CC 44)\r
65 #define OW_FWCONFIGINFO1 8\r
66 #define OW_FWCONFIGINFO2 9\r
67 \r
68 .comm idtable,64\r
69 \r
70 #ifdef _CHANGEABLE_ID_\r
71 #define OW_WRITE_NEWID 10\r
72 #define OW_READ_NEWID 11\r
73 #define OW_SET_NEWID 12\r
74 #define OW_FIRST_COMMAND 13\r
75 .comm newid,8\r
76 \r
77    \r
78 .macro CHANGE_ID_COMMANDS\r
79         cset 0x75,OW_WRITE_NEWID\r
80         cljmp 0xA7,hrc_set_readid\r
81         cljmp 0x79,hrc_set_setid\r
82 .endm\r
83 \r
84 \r
85 #else\r
86 #define OW_FIRST_COMMAND 10\r
87 #endif\r
88 \r
89 #ifndef _DIS_FLASH_\r
90 ; test auf run flasher command 0x88 in h_readcommand\r
91 .macro FLASH_COMMANDS\r
92         cpi r_rwbyte,0x88\r
93         brne 1f\r
94         rjmp hrc_jmp_flasher\r
95 1: ldi r_temp,0 ;Anderes Kommando flashmarker zuruecksetzen...\r
96         sts flashmarker,r_temp\r
97 .endm\r
98 #endif\r
99 \r
100 \r
101 .macro FW_CONFIG_INFO1\r
102         cljmp 0x85,hrc_fw_configinfo1\r
103 .endm\r
104 .macro FW_CONFIG_INFO2\r
105         cljmp 0x85,hrc_fw_configinfo2\r
106 .endm\r
107 \r
108 #ifdef _CHANGEABLE_ID_\r
109 ; lesen der ID aus dem EEPROM beim Start\r
110 read_EEPROM_ID1:  \r
111         ldi r_temp2,lo8(E2END)\r
112         ldi zh,hi8(E2END)\r
113         subi r_temp2,7\r
114         out _SFR_IO_ADDR(EEARH), zh\r
115         ldi r_bytep,0\r
116         ldi  zl,lo8(owid1)       \r
117     ldi  zh,hi8(owid1)\r
118         rjmp read_EEPROM_ID_loop\r
119 read_EEPROM_ID2:  \r
120         ldi r_temp2,lo8(E2END)\r
121         ldi zh,hi8(E2END)\r
122         subi r_temp2,15\r
123         out _SFR_IO_ADDR(EEARH), zh\r
124         ldi r_bytep,0\r
125         ldi  zl,lo8(owid2)       \r
126     ldi  zh,hi8(owid2)\r
127 read_EEPROM_ID_loop:\r
128         sbic _SFR_IO_ADDR(EECR), EEPE\r
129         rjmp read_EEPROM_ID_loop\r
130         out _SFR_IO_ADDR(EEARL),r_temp2\r
131         sbi _SFR_IO_ADDR(EECR), EERE\r
132         in r_rwbyte,_SFR_IO_ADDR(EEDR)\r
133         cpi r_rwbyte,0xFF\r
134         breq read_EEPROM_ID_end\r
135         st Z+,r_rwbyte\r
136         inc r_bytep\r
137         inc r_temp2\r
138         cpi r_bytep,8\r
139         brne read_EEPROM_ID_loop\r
140 read_EEPROM_ID_end:\r
141         ret\r
142 #endif\r
143 \r
144 \r
145 \r
146 \r
147 \r
148 \r
149 \r
150 handle_stable: \r
151                 rjmp handle_end_no_bcount // sleep eventuell reset, nichts tun und auf Timeout warten\r
152                 rjmp h_readromcommand \r
153                 rjmp h_matchrom \r
154                 rjmp h_searchroms \r
155                 rjmp h_searchromr\r
156                 rjmp h_readcommand1 \r
157                 rjmp h_readcommand2\r
158 #ifdef _HANDLE_CC_COMMAND_\r
159                 rjmp h_readcommand12\r
160 #else\r
161                 rjmp handle_end_no_bcount\r
162 #endif\r
163                 rjmp h_fwconfiginfo1\r
164                 rjmp h_fwconfiginfo2\r
165 #ifdef _CHANGEABLE_ID_\r
166                 rjmp h_writeid\r
167                 rjmp h_readid\r
168                 rjmp h_setid\r
169 #endif\r
170                 COMMAND_TABLE\r
171 \r
172 \r
173 \r
174 h_readromcommand:\r
175         clr r_bytep\r
176         cjmp 0x55,hrc_set_matchrom\r
177         cjmp 0xF0,hrc_set_searchrom\r
178         cjmp 0xEC,hrc_set_alarm_search\r
179 #ifdef _HANDLE_CC_COMMAND_\r
180         cjmp 0xCC,hrc_start_read_command12\r
181 #endif\r
182         rjmp handle_end_sleep\r
183 \r
184 #ifndef _DIS_FLASH_\r
185 ;sprung zum flasher\r
186 hrc_jmp_flasher:\r
187         lds r_temp,flashmarker\r
188         cpi r_temp,2\r
189         brne hrc_jmp_flasher_inc\r
190         ldi r_temp,0xC0\r
191         push r_temp\r
192         ldi r_temp,0x0E\r
193         push r_temp\r
194         ret ; Direkter Sprung zum Bootloader\r
195 hrc_jmp_flasher_inc:\r
196         inc r_temp\r
197         sts flashmarker,r_temp\r
198         rjmp handle_end_sleep\r
199 #endif\r
200 \r
201 hrc_set_matchrom:\r
202         ldi r_temp,3\r
203         sts srbyte,r_temp ; Beide geraete nehmen an searchrom teil\r
204         ldi r_mode,OW_MATCHROM\r
205         rjmp handle_end\r
206 \r
207 \r
208 \r
209 hrc_set_searchrom:      \r
210         ldi r_temp,3\r
211         sts srbyte,r_temp ; Beide geraete nehmen an searchrom teil\r
212         configZ idtable,r_bytep\r
213         rjmp h_searchrom_next_bit\r
214 \r
215 hrc_start_read_command: ;Skip rom und Matchrom ok...\r
216         CRCInit1\r
217         lds r_temp,srbyte\r
218         cpi r_temp,1\r
219         breq hrc_start_read_command1\r
220         cpi r_temp,2\r
221         breq hrc_start_read_command2\r
222         rjmp handle_end_sleep\r
223 hrc_start_read_command1:\r
224         ldi r_mode,OW_READ_COMMAND1\r
225         rjmp handle_end\r
226 hrc_start_read_command2:\r
227         ldi r_mode,OW_READ_COMMAND2\r
228         rjmp handle_end\r
229 \r
230 #ifdef _HANDLE_CC_COMMAND_\r
231 hrc_start_read_command12:\r
232         ldi r_mode,OW_READ_COMMAND12\r
233         rjmp handle_end\r
234 #endif\r
235 \r
236 hrc_set_alarm_search:\r
237         lds r_temp,alarmflag\r
238         tst r_temp\r
239         brne hrc_set_searchrom ;alarm flag nicht 0 also gehe zu searchrom\r
240         ; sonst tue nichts\r
241         rjmp handle_end_sleep\r
242 \r
243 hrc_fw_configinfo1:\r
244 #ifdef _NO_CONFIGBYTES_\r
245         rjmp handle_end_sleep\r
246 #else\r
247         ldi r_mode,OW_FWCONFIGINFO1\r
248         ldi r_sendflag,1\r
249         CRCInit2\r
250         rjmp h_fwconfiginfo1\r
251 #endif\r
252 \r
253 hrc_fw_configinfo2:\r
254 #ifdef _NO_CONFIGBYTES_\r
255         rjmp handle_end_sleep\r
256 #else\r
257         ldi r_mode,OW_FWCONFIGINFO2\r
258         ldi r_sendflag,1\r
259         CRCInit2\r
260         rjmp h_fwconfiginfo2\r
261 #endif\r
262 \r
263 ;---------------------------------------------------\r
264 ;   MATCH ROM\r
265 ;---------------------------------------------------\r
266         \r
267 \r
268 h_matchrom:\r
269         lds r_bcount,srbyte\r
270         sbrs r_bcount,0 ;ueberspringe wenn bit 1 =0 also geraet 1 nich mehr im rennen\r
271         rjmp h_matchrom_id2\r
272         configZ owid1,r_bytep\r
273         ld r_temp2,Z\r
274         cp r_temp2,r_rwbyte\r
275         breq h_matchrom_id2\r
276         cbr r_bcount,1 ; loesche geraet\r
277         breq h_matchrom_sleep\r
278 h_matchrom_id2:\r
279         configZ owid2,r_bytep\r
280         ld r_temp2,Z\r
281         cp r_temp2,r_rwbyte\r
282         breq hmr_next_byte\r
283         cbr r_bcount,2 ; loesche geraet\r
284         breq h_matchrom_sleep\r
285 \r
286 hmr_next_byte:\r
287         sts srbyte,r_bcount\r
288         cpi r_bytep,7\r
289         breq hrc_start_read_command ;Starten von Read Command\r
290         rjmp handle_end_inc\r
291 \r
292 h_matchrom_sleep:\r
293         sts srbyte,r_bcount\r
294         rjmp handle_end_sleep\r
295 \r
296 \r
297 ;---------------------------------------------------\r
298 ;   SEARCH ROM\r
299 ;---------------------------------------------------\r
300 \r
301 \r
302 h_searchrom_next_bit:  ;Setup next Bit of ID\r
303         ld r_temp2,Z\r
304         lds r_temp,srbyte  ;srbyte ist ein zeiger auf die bits fuer ein bit im Table\r
305 h_searchrom_next_bit_l2:\r
306         cpi r_temp,3\r
307         breq h_searchrom_next_bit_l1\r
308         lsr r_temp2\r
309         lsr r_temp2\r
310         inc r_temp\r
311         rjmp h_searchrom_next_bit_l2\r
312 h_searchrom_next_bit_l1:\r
313         lsr r_temp2\r
314         rol r_rwbyte  ; negiertes bit in rwbyte\r
315         lsr r_temp2\r
316         rol r_rwbyte  ; bit in rwbyte\r
317         ldi r_sendflag,1\r
318         ldi r_bcount,0x40 ; zwei bits sensden dann zu Searchromr \r
319         ldi r_mode,OW_SEARCHROMR\r
320         rjmp handle_end_no_bcount\r
321 \r
322 \r
323 \r
324 h_searchroms:  ; Modus Send zwei bit\r
325         configZ idtable,r_bytep\r
326         ld r_temp2,Z+\r
327         lds r_temp,srbyte\r
328         cpi r_temp,3\r
329         breq h_searchroms_idd\r
330         cpi r_temp,1\r
331         breq h_searchroms_id1\r
332         cpi r_temp,2\r
333         breq h_searchroms_id2\r
334         rjmp handle_end_sleep ; zur Sicherheit.....\r
335 h_searchroms_idd:\r
336         andi r_rwbyte,0x80\r
337         breq h_searchroms_idd_zero\r
338         ; Master send 1\r
339         sbrc r_temp2,0 ;springe wenn nicht beide bits 0 (id 1 negiert und id 2 negiert)\r
340         rjmp handle_end_sleep ;\r
341         sbrc r_temp2,4  ;id1 set? then skip\r
342         cbr r_temp,1  ; loesche bit 1 in srbyte\r
343         sbrc r_temp2,2 ; springe wenn id 2 gesetzt ist\r
344         cbr r_temp,2 ;  loesche bit 2 in srbyte \r
345         sts srbyte,r_temp\r
346         rjmp h_searchroms_idX_end\r
347 h_searchroms_idd_zero:\r
348         sbrc r_temp2,1 ;springe wenn nicht beide 1 (id 1  und id 2 )\r
349         rjmp handle_end_sleep ;beide 1 gehe schlafen\r
350         sbrs r_temp2,4  ;id1 0? then skip\r
351         cbr r_temp,1  ; loesche bit 1 in srbyte\r
352         sbrs r_temp2,2 ; springe wenn id 2  null ist\r
353         cbr r_temp,2  ; loesche bit 2 in srbyte\r
354         sts srbyte,r_temp\r
355         rjmp h_searchroms_idX_end\r
356 h_searchroms_id1:\r
357         andi r_rwbyte,0x80\r
358         breq h_searchroms_id1_zero\r
359         ; Master send 1\r
360         sbrs r_temp2,5  ;id1 set? then skip\r
361         rjmp handle_end_sleep ;\r
362         rjmp h_searchroms_idX_end\r
363 h_searchroms_id1_zero:          \r
364         sbrs r_temp2,4  ;id1 set? then skip\r
365         rjmp handle_end_sleep ;\r
366         rjmp h_searchroms_idX_end\r
367 h_searchroms_id2:\r
368         andi r_rwbyte,0x80\r
369         breq h_searchroms_id2_zero\r
370         ; Master send 1\r
371         sbrs r_temp2,3  ;id1 set? then skip\r
372         rjmp handle_end_sleep ;\r
373         rjmp h_searchroms_idX_end\r
374 h_searchroms_id2_zero:          \r
375         sbrs r_temp2,2  ;id1 set? then skip\r
376         rjmp handle_end_sleep ;\r
377         rjmp h_searchroms_idX_end\r
378 h_searchroms_idX_end:\r
379         lds r_temp,srbyte\r
380         tst r_temp\r
381         brne h_searchroms_idX_end1\r
382         rjmp handle_end_sleep\r
383 h_searchroms_idX_end1:\r
384         inc r_bytep\r
385         cpi r_bytep,64\r
386         breq h_searchrom_end_ok  ;unterschied nur das letzt bit wird wohl nie vorkommen\r
387         rjmp h_searchrom_next_bit\r
388 \r
389 h_searchrom_end_ok:\r
390         clr r_sendflag\r
391         rjmp hrc_start_read_command\r
392 \r
393 h_searchromr:  ; stelle um auf empfangen\r
394         clr r_sendflag\r
395         ldi r_mode,OW_SEARCHROMS\r
396         ldi r_bcount,0  ;gehe nach einem bit zu SEARCHROMS\r
397         rjmp handle_end_no_bcount\r
398 \r
399 \r
400 ;---------------------------------------------------\r
401 ;   FW_CONFIG_INFO\r
402 ;---------------------------------------------------\r
403 \r
404 h_fwconfiginfo1:\r
405 #ifdef _NO_CONFIGBYTES_\r
406 h_fwconfiginfo2:\r
407         rjmp handle_end_sleep\r
408 #else\r
409         configZ config_info1,r_bytep\r
410         rjmp h_fwconfiginfo_go\r
411 h_fwconfiginfo2:\r
412         configZ config_info2,r_bytep\r
413 /*#ifdef _CRC16_\r
414         cpi  r_bytep,24\r
415         breq h_fwconfiginfo_crc\r
416         cpi  r_bytep,26\r
417         breq h_fwconfiginfo_all\r
418 //h_fwconfiginfo_end:\r
419         //configZ config_info1,r_bytep  //crc16 wird in config_info1 gespeichert, auch bei config_info2 \r
420         configZ config_info2,r_bytep\r
421         ld   r_rwbyte,Z\r
422         rjmp handle_end_inc\r
423 #endif\r
424 */\r
425 \r
426 h_fwconfiginfo_go:\r
427         cpi  r_bytep,24\r
428         breq h_fwconfiginfo_crc\r
429 #ifdef _CRC8_\r
430         cpi  r_bytep,25\r
431         breq h_fwconfiginfo_all\r
432 #elif defined _CRC16_\r
433         cpi  r_bytep,26\r
434         breq h_fwconfiginfo_all\r
435 #else\r
436         cpi  r_bytep,25\r
437         breq h_fwconfiginfo_all\r
438 #warning No CRC known code implemented\r
439 #endif\r
440 \r
441 h_fwconfiginfo_end:\r
442         //configZ config_info1,r_bytep  //crc16 wird in config_info1 gespeichert, auch bei config_info2 \r
443         //configZ config_info1,r_bytep\r
444         ld   r_rwbyte,Z\r
445         rjmp handle_end_inc\r
446 h_fwconfiginfo_crc:\r
447 #ifdef _CRC8_ \r
448         lds r_rwbyte,crc\r
449         rjmp handle_end_inc\r
450 #elif defined _CRC16_\r
451         lds r_temp,crc\r
452         com r_temp\r
453         sts config_info1+24,r_temp\r
454         lds r_temp,crc+1\r
455         com r_temp\r
456         sts config_info1+25,r_temp\r
457         ldi r_mode,OW_FWCONFIGINFO1  //auch CRC vom Dev 2 wird in Configinfo 1 geschrieben also da weiter machen\r
458         configZ config_info1,r_bytep\r
459         ld   r_rwbyte,Z\r
460         rjmp handle_end_inc\r
461 \r
462 #endif\r
463 h_fwconfiginfo_all:\r
464         rjmp handle_end_sleep\r
465 #endif\r
466 \r
467 ;---------------------------------------------------\r
468 ;   CHANGE ROM FUNCTIONS\r
469 ;---------------------------------------------------\r
470 \r
471 \r
472 #ifdef _CHANGEABLE_ID_\r
473 \r
474 h_writeid:\r
475         configZ newid,r_bytep\r
476         st   Z,r_rwbyte\r
477         cpi  r_bytep,7\r
478         breq h_writeid_all\r
479         rjmp handle_end_inc\r
480 h_writeid_all:\r
481         rjmp handle_end_sleep\r
482 \r
483 \r
484 hrc_set_readid:\r
485         ldi r_mode,OW_READ_NEWID\r
486         ldi r_sendflag,1\r
487 h_readid:\r
488         cpi  r_bytep,8\r
489         breq h_readid_all\r
490         configZ newid,r_bytep\r
491         ld   r_rwbyte,Z\r
492         rjmp handle_end_inc\r
493 h_readid_all:\r
494         clr  r_sendflag\r
495         rjmp handle_end_sleep\r
496 \r
497 hrc_set_setid:\r
498         ldi r_mode,OW_SET_NEWID\r
499         ;ldi r_bytep,1 ;start to write in 2\r
500         rjmp handle_end_inc ;set r_bytep to 1!!!\r
501 \r
502 h_setid:\r
503         lds r_bcount,srbyte\r
504         cpi r_bcount,2\r
505         breq h_setid2\r
506 h_setid1:\r
507         configZ owid1,r_bytep\r
508         rjmp h_setido\r
509 h_setid2:\r
510         configZ owid2,r_bytep\r
511 h_setido:\r
512         ld r_temp,Z\r
513         cp r_rwbyte,r_temp\r
514         brne h_setid_bad_code_all\r
515         cpi r_bytep,1\r
516         breq h_setid_set2\r
517         cpi r_bytep,5 \r
518         breq h_setid_set3\r
519         cpi r_bytep,6\r
520         breq h_setid_copy_id\r
521         rjmp h_setid_bad_code_all ;sollte eigentlich nicht passieren\r
522 h_setid_set2:\r
523         ldi r_temp,3\r
524         add r_bytep,r_temp\r
525 h_setid_set3:\r
526         inc r_bytep\r
527         rjmp handle_end\r
528 h_setid_copy_id:\r
529         ldi r_temp2,lo8(E2END)\r
530         ldi zh,hi8(E2END)\r
531         ldi r_temp,7\r
532         sbrc r_bcount,1\r
533         ldi r_temp,15\r
534         sub r_temp2,r_temp\r
535         ;ldi r_temp,0 ;kommt nicht vor das ein E2ROM genau n*256+(0 bis 7) byte gross ist\r
536         ;sbc zh\r
537         out _SFR_IO_ADDR(EEARH),zh\r
538         ldi zl,lo8(newid)\r
539         ldi zh,hi8(newid)\r
540         ldi r_bytep,0\r
541 h_setid_EEPROM_write:\r
542         sbic _SFR_IO_ADDR(EECR), EEPE   \r
543         rjmp h_setid_EEPROM_write\r
544         ldi r_temp, (0<<EEPM1)|(0<<EEPM0)\r
545         out _SFR_IO_ADDR(EECR), r_temp\r
546         ;nur adresse L schreiben H bleibt aus oben genannten grund gleich.\r
547         out _SFR_IO_ADDR(EEARL),r_temp2\r
548         ld  r_rwbyte,Z+\r
549         out _SFR_IO_ADDR(EEDR), r_rwbyte\r
550         sbi _SFR_IO_ADDR(EECR), EEMPE\r
551         sbi _SFR_IO_ADDR(EECR), EEPE\r
552         inc r_bytep\r
553         inc r_temp2\r
554         cpi r_bytep,8\r
555         brne h_setid_EEPROM_write\r
556         //rcall read_EEPROM_ID1\r
557         //rcall read_EEPROM_ID2\r
558         push r_idm1\r
559         push r_idm2\r
560         push xl\r
561         push xh\r
562         rcall init_idtable\r
563         pop xh\r
564         pop xl\r
565         pop r_idm2\r
566         pop r_idm1\r
567 h_setid_bad_code_all:\r
568         rjmp handle_end_sleep\r
569 \r
570 \r
571 \r
572 #endif\r
573 \r
574 \r
575 spause:\r
576         nop\r
577         nop\r
578         nop\r
579         nop\r
580         ret\r
581 \r
582 \r
583 .global OWINIT\r
584 OWINIT:\r
585         \r
586 ; check for bootloader jumper\r
587         ;vor allen anderen Registerconfigs\r
588         push r_temp\r
589 #ifndef _DIS_FLASH_\r
590         ldi r_temp,(1<<PUD) ;enable pullup \r
591         out _SFR_IO_ADDR(MCUCR) ,r_temp\r
592         sbi _SFR_IO_ADDR(PORTA),PINA5 ;internal pullup on PINA5\r
593         sbi _SFR_IO_ADDR(PORTA),PINA4 ;internal pullup on PINA4\r
594         rcall spause\r
595         sbis _SFR_IO_ADDR(PINA),PINA5\r
596         rjmp owinit_botest_end  ;PinA5 nicht auf 1\r
597         sbis _SFR_IO_ADDR(PINA),PINA4\r
598         rjmp owinit_botest_end ;PinA4 nicht auf 1\r
599         cbi _SFR_IO_ADDR(PORTA),PINA4 \r
600         sbi _SFR_IO_ADDR(DDRA),PINA4  ;PINA4 AUSGANG und 0\r
601         rcall spause\r
602         sbic _SFR_IO_ADDR(PINA),PINA5 \r
603         rjmp owinit_botest_end ;PINA5 nicht 0.... nicht verbunden\r
604         cbi _SFR_IO_ADDR(DDRA),PINA4\r
605         ldi r_temp,0xC0\r
606         push r_temp\r
607         ldi r_temp,0x0E\r
608         push r_temp\r
609         ret ; Direkter Sprung zum Bootloader*/\r
610 owinit_botest_end:\r
611 #endif\r
612         HW_INIT  //Microcontroller specific\r
613         CHIP_INIT //1-Wire device specific\r
614         pop r_temp\r
615 init_idtable:\r
616         push yl\r
617         push yh\r
618         push r_temp\r
619         push r_rwbyte\r
620         push r_idn1\r
621         push r_idn2\r
622 #ifdef _CHANGEABLE_ID_\r
623         rcall read_EEPROM_ID1\r
624         rcall read_EEPROM_ID2\r
625 #endif\r
626         ldi r_bytep,8\r
627         ldi r_temp,0\r
628         ldi  zl,lo8(idtable)\r
629     ldi  zh,hi8(idtable)\r
630         ldi  xl,lo8(owid1)\r
631         ldi  xh,hi8(owid1)\r
632         ldi      yl,lo8(owid2)\r
633         ldi  yh,hi8(owid2)\r
634 owinit_odgen1:\r
635         ld r_idm1,X+\r
636         ld r_idm2,Y+\r
637         mov r_idn1,r_idm1\r
638         com r_idn1\r
639         mov r_idn2,r_idm2\r
640         com r_idn2\r
641         ldi r_bcount,8\r
642         mov r_temp,r_idm1\r
643         and r_temp,r_idm2\r
644         mov r_temp2,r_idn1\r
645         and r_temp2,r_idn2\r
646 owinit_odgen2:\r
647         ldi r_mode,0\r
648         lsr r_idm1\r
649         rol r_mode  ;6. Bit id1 \r
650         lsr r_idn1  \r
651         rol r_mode ; 5. Bit id1negiert\r
652         lsr r_idm2\r
653         rol r_mode  ;;4. Bit id2 \r
654         lsr r_idn2  \r
655         rol r_mode  ;3. Bit id2 negiert\r
656         lsr r_temp \r
657         rol r_mode ;zweites bit  id1 und id2\r
658         lsr r_temp2\r
659         rol r_mode   ;erstes bit id1 negiert und id2  negiert\r
660         st  Z+,r_mode\r
661         dec r_bcount\r
662         brne owinit_odgen2\r
663         dec r_bytep\r
664         brne owinit_odgen1\r
665         ;copy ids in config bytes\r
666 #ifndef _NO_CONFIGBYTES_\r
667         ldi  xl,lo8(owid1)\r
668         ldi  xh,hi8(owid1)\r
669         ldi      yl,lo8(config_info2+17)\r
670         ldi  yh,hi8(config_info2+17)\r
671         ldi r_temp,7\r
672 owinit_cpconfig1:\r
673         ld r_rwbyte,X+\r
674         st Y+,r_rwbyte\r
675         dec r_temp\r
676         brne owinit_cpconfig1\r
677         ldi  xl,lo8(owid2)\r
678         ldi  xh,hi8(owid2)\r
679         ldi      yl,lo8(config_info1+17)\r
680         ldi  yh,hi8(config_info1+17)\r
681         ldi r_temp,7\r
682 owinit_cpconfig2:\r
683         ld r_rwbyte,X+\r
684         st Y+,r_rwbyte\r
685         dec r_temp\r
686         brne owinit_cpconfig2\r
687 #endif\r
688 \r
689         ldi r_temp,0\r
690         sts mode,r_temp\r
691         sts bcount,r_temp\r
692         sts alarmflag,r_temp\r
693         RESETZEROMARKER\r
694         pop r_idn2\r
695         pop r_idn1\r
696         pop r_rwbyte\r
697         pop r_temp\r
698         pop yh\r
699         pop yl\r
700         \r
701         ret\r
702 \r
703 .global EXTERN_SLEEP\r
704 EXTERN_SLEEP:\r
705         cli\r
706         push r_temp\r
707         ldi r_temp,0\r
708         sts mode,r_temp ;SLEEP\r
709         sts gcontrol,r_temp\r
710         sts sendflag,r_temp\r
711         sts bcount,r_temp\r
712         RESETZEROMARKER\r
713         pop r_temp\r
714         sei\r
715         ret