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