c28d855e35666f036f29d2e88dc31d9a657aabae
[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
65
66 #ifdef _CHANGEABLE_ID_
67 #define OW_WRITE_NEWID 7
68 #define OW_READ_NEWID 8
69 #define OW_SET_NEWID 9
70 #define OW_FIRST_COMMAND 10
71 .comm newid,8
72 .comm idtable,64
73        
74 .macro CHANGE_ID_COMMANDS
75         cset 0x75,OW_WRITE_NEWID
76         cljmp 0xA7,hrc_set_readid
77         cljmp 0x79,hrc_set_setid
78 .endm
79
80
81 #else
82 #define OW_FIRST_COMMAND 7
83 #endif
84
85 #ifndef _DIS_FLASH_
86 ; test auf run flasher command 0x88 in h_readcommand
87 .macro FLASH_COMMANDS
88         cpi r_rwbyte,0x88
89         brne 1f
90         rjmp hrc_jmp_flasher
91 1: ldi r_temp,0 ;Anderes Kommando flashmarker zuruecksetzen...
92         sts flashmarker,r_temp
93 .endm
94 #endif
95
96
97
98 #ifdef _CHANGEABLE_ID_
99 ; lesen der ID aus dem EEPROM beim Start
100 read_EEPROM_ID1:  
101         ldi r_temp2,lo8(E2END)
102         ldi zh,hi8(E2END)
103         subi r_temp2,7
104         out _SFR_IO_ADDR(EEARH), zh
105         ldi r_bytep,0
106         ldi  zl,lo8(owid1)       
107     ldi  zh,hi8(owid1)
108         rjmp read_EEPROM_ID_loop
109 read_EEPROM_ID2:  
110         ldi r_temp2,lo8(E2END)
111         ldi zh,hi8(E2END)
112         subi r_temp2,15
113         out _SFR_IO_ADDR(EEARH), zh
114         ldi r_bytep,0
115         ldi  zl,lo8(owid2)       
116     ldi  zh,hi8(owid2)
117 read_EEPROM_ID_loop:
118         sbic _SFR_IO_ADDR(EECR), EEPE
119         rjmp read_EEPROM_ID_loop
120         out _SFR_IO_ADDR(EEARL),r_temp2
121         sbi _SFR_IO_ADDR(EECR), EERE
122         in r_rwbyte,_SFR_IO_ADDR(EEDR)
123         cpi r_rwbyte,0xFF
124         breq read_EEPROM_ID_end
125         st Z+,r_rwbyte
126         inc r_bytep
127         inc r_temp2
128         cpi r_bytep,8
129         brne read_EEPROM_ID_loop
130 read_EEPROM_ID_end:
131         ret
132 #endif
133
134
135
136
137
138
139
140 handle_stable: 
141                 rjmp handle_end_no_bcount // sleep eventuell reset, nichts tun und auf Timeout warten
142                 rjmp h_readromcommand 
143                 rjmp h_matchrom 
144                 rjmp h_searchroms 
145                 rjmp h_searchromr
146                 rjmp h_readcommand1 
147                 rjmp h_readcommand2
148 #ifdef _CHANGEABLE_ID_
149                 rjmp h_writeid
150                 rjmp h_readid
151                 rjmp h_setid
152 #endif
153                 COMMAND_TABLE
154
155
156
157 h_readromcommand:
158         clr r_bytep
159         cjmp 0x55,hrc_set_matchrom
160         cjmp 0xF0,hrc_set_searchrom
161         cjmp 0xEC,hrc_set_alarm_search
162         
163         rjmp handle_end_sleep
164
165 #ifndef _DIS_FLASH_
166 ;sprung zum flasher
167 hrc_jmp_flasher:
168         lds r_temp,flashmarker
169         cpi r_temp,2
170         brne hrc_jmp_flasher_inc
171         ldi r_temp,0xE0
172         push r_temp
173         ldi r_temp,0x0E
174         push r_temp
175         ret ; Direkter Sprung zum Bootloader
176 hrc_jmp_flasher_inc:
177         inc r_temp
178         sts flashmarker,r_temp
179         rjmp handle_end_sleep
180 #endif
181
182 hrc_set_matchrom:
183         ldi r_temp,3
184         sts srbyte,r_temp ; Beide geraete nehmen an searchrom teil
185         ldi r_mode,OW_MATCHROM
186         rjmp handle_end
187
188
189
190 hrc_set_searchrom:      
191         ldi r_temp,3
192         sts srbyte,r_temp ; Beide geraete nehmen an searchrom teil
193         configZ idtable,r_bytep
194         rjmp h_searchrom_next_bit
195
196 hrc_start_read_command: ;Skip rom und Matchrom ok...
197         lds r_temp,srbyte
198         cpi r_temp,1
199         breq hrc_start_read_command1
200         cpi r_temp,2
201         breq hrc_start_read_command2
202         rjmp handle_end_sleep
203         CRCInit1
204 hrc_start_read_command1:
205         ldi r_mode,OW_READ_COMMAND1
206         rjmp handle_end
207 hrc_start_read_command2:
208         ldi r_mode,OW_READ_COMMAND2
209         rjmp handle_end
210
211
212 hrc_set_alarm_search:
213         lds r_temp,alarmflag
214         tst r_temp
215         brne hrc_set_searchrom ;alarm flag nicht 0 also gehe zu searchrom
216         ; sonst tue nichts
217         rjmp handle_end_sleep
218
219 ;---------------------------------------------------
220 ;   MATCH ROM
221 ;---------------------------------------------------
222         
223
224 h_matchrom:
225         lds r_bcount,srbyte
226         sbrs r_bcount,0 ;ueberspringe wenn bit 1 =0 also geraet 1 nich mehr im rennen
227         rjmp h_matchrom_id2
228         configZ owid1,r_bytep
229         ld r_temp2,Z
230         cp r_temp2,r_rwbyte
231         breq h_matchrom_id2
232         cbr r_bcount,1 ; loesche geraet
233         breq h_matchrom_sleep
234 h_matchrom_id2:
235         configZ owid2,r_bytep
236         ld r_temp2,Z
237         cp r_temp2,r_rwbyte
238         breq hmr_next_byte
239         cbr r_bcount,2 ; loesche geraet
240         breq h_matchrom_sleep
241
242 hmr_next_byte:
243         sts srbyte,r_bcount
244         cpi r_bytep,7
245         breq hrc_start_read_command ;Starten von Read Command
246         rjmp handle_end_inc
247
248 h_matchrom_sleep:
249         sts srbyte,r_bcount
250         rjmp handle_end_sleep
251
252
253 ;---------------------------------------------------
254 ;   SEARCH ROM
255 ;---------------------------------------------------
256
257
258 h_searchrom_next_bit:  ;Setup next Bit of ID
259         ld r_temp2,Z
260         lds r_temp,srbyte  ;srbyte ist ein zeiger auf die bits fuer ein bit im Table
261 h_searchrom_next_bit_l2:
262         cpi r_temp,3
263         breq h_searchrom_next_bit_l1
264         lsr r_temp2
265         lsr r_temp2
266         inc r_temp
267         rjmp h_searchrom_next_bit_l2
268 h_searchrom_next_bit_l1:
269         lsr r_temp2
270         rol r_rwbyte  ; negiertes bit in rwbyte
271         lsr r_temp2
272         rol r_rwbyte  ; bit in rwbyte
273         ldi r_sendflag,1
274         ldi r_bcount,0x40 ; zwei bits sensden dann zu Searchromr 
275         ldi r_mode,OW_SEARCHROMR
276         rjmp handle_end_no_bcount
277
278
279
280 h_searchroms:  ; Modus Send zwei bit
281         configZ idtable,r_bytep
282         ld r_temp2,Z+
283         lds r_temp,srbyte
284         cpi r_temp,3
285         breq h_searchroms_idd
286         cpi r_temp,1
287         breq h_searchroms_id1
288         cpi r_temp,2
289         breq h_searchroms_id2
290         rjmp handle_end_sleep ; zur Sicherheit.....
291 h_searchroms_idd:
292         andi r_rwbyte,0x80
293         breq h_searchroms_idd_zero
294         ; Master send 1
295         sbrc r_temp2,0 ;springe wenn nicht beide bits 0 (id 1 negiert und id 2 negiert)
296         rjmp handle_end_sleep ;
297         sbrc r_temp2,4  ;id1 set? then skip
298         cbr r_temp,1  ; loesche bit 1 in srbyte
299         sbrc r_temp2,2 ; springe wenn id 2 gesetzt ist
300         cbr r_temp,2 ;  loesche bit 2 in srbyte 
301         sts srbyte,r_temp
302         rjmp h_searchroms_idX_end
303 h_searchroms_idd_zero:
304         sbrc r_temp2,1 ;springe wenn nicht beide 1 (id 1  und id 2 )
305         rjmp handle_end_sleep ;beide 1 gehe schlafen
306         sbrs r_temp2,4  ;id1 0? then skip
307         cbr r_temp,1  ; loesche bit 1 in srbyte
308         sbrs r_temp2,2 ; springe wenn id 2  null ist
309         cbr r_temp,2  ; loesche bit 2 in srbyte
310         sts srbyte,r_temp
311         rjmp h_searchroms_idX_end
312 h_searchroms_id1:
313         andi r_rwbyte,0x80
314         breq h_searchroms_id1_zero
315         ; Master send 1
316         sbrs r_temp2,5  ;id1 set? then skip
317         rjmp handle_end_sleep ;
318         rjmp h_searchroms_idX_end
319 h_searchroms_id1_zero:          
320         sbrs r_temp2,4  ;id1 set? then skip
321         rjmp handle_end_sleep ;
322         rjmp h_searchroms_idX_end
323 h_searchroms_id2:
324         andi r_rwbyte,0x80
325         breq h_searchroms_id2_zero
326         ; Master send 1
327         sbrs r_temp2,3  ;id1 set? then skip
328         rjmp handle_end_sleep ;
329         rjmp h_searchroms_idX_end
330 h_searchroms_id2_zero:          
331         sbrs r_temp2,2  ;id1 set? then skip
332         rjmp handle_end_sleep ;
333         rjmp h_searchroms_idX_end
334 h_searchroms_idX_end:
335         lds r_temp,srbyte
336         tst r_temp
337         brne h_searchroms_idX_end1
338         rjmp handle_end_sleep
339 h_searchroms_idX_end1:
340         inc r_bytep
341         cpi r_bytep,64
342         breq h_searchrom_end_ok  ;unterschied nur das letzt bit wird wohl nie vorkommen
343         rjmp h_searchrom_next_bit
344
345 h_searchrom_end_ok:
346         clr r_sendflag
347         rjmp hrc_start_read_command
348
349 h_searchromr:  ; stelle um auf empfangen
350         clr r_sendflag
351         ldi r_mode,OW_SEARCHROMS
352         ldi r_bcount,0  ;gehe nach einem bit zu SEARCHROMS
353         rjmp handle_end_no_bcount
354
355
356
357 ;---------------------------------------------------
358 ;   CHANGE ROM FUNCTIONS
359 ;---------------------------------------------------
360
361
362 #ifdef _CHANGEABLE_ID_
363
364 h_writeid:
365         configZ newid,r_bytep
366         st   Z,r_rwbyte
367         cpi  r_bytep,7
368         breq h_writeid_all
369         rjmp handle_end_inc
370 h_writeid_all:
371         rjmp handle_end_sleep
372
373
374 hrc_set_readid:
375         ldi r_mode,OW_READ_NEWID
376         ldi r_sendflag,1
377 h_readid:
378         cpi  r_bytep,8
379         breq h_readid_all
380         configZ newid,r_bytep
381         ld   r_rwbyte,Z
382         rjmp handle_end_inc
383 h_readid_all:
384         clr  r_sendflag
385         rjmp handle_end_sleep
386
387 hrc_set_setid:
388         ldi r_mode,OW_SET_NEWID
389         ;ldi r_bytep,1 ;start to write in 2
390         rjmp handle_end_inc ;set r_bytep to 1!!!
391
392 h_setid:
393         lds r_bcount,srbyte
394         cpi r_bcount,2
395         breq h_setid2
396 h_setid1:
397         configZ owid1,r_bytep
398         rjmp h_setido
399 h_setid2:
400         configZ owid2,r_bytep
401 h_setido:
402         ld r_temp,Z
403         cp r_rwbyte,r_temp
404         brne h_setid_bad_code_all
405         cpi r_bytep,1
406         breq h_setid_set2
407         cpi r_bytep,5 
408         breq h_setid_set3
409         cpi r_bytep,6
410         breq h_setid_copy_id
411         rjmp h_setid_bad_code_all ;sollte eigentlich nicht passieren
412 h_setid_set2:
413         ldi r_temp,3
414         add r_bytep,r_temp
415 h_setid_set3:
416         inc r_bytep
417         rjmp handle_end
418 h_setid_copy_id:
419         ldi r_temp2,lo8(E2END)
420         ldi zh,hi8(E2END)
421         ldi r_temp,7
422         sbrc r_bcount,1
423         ldi r_temp,15
424         sub r_temp2,r_temp
425         ;ldi r_temp,0 ;kommt nicht vor das ein E2ROM genau n*256+(0 bis 7) byte gross ist
426         ;sbc zh
427         out _SFR_IO_ADDR(EEARH),zh
428         ldi zl,lo8(newid)
429         ldi zh,hi8(newid)
430         ldi r_bytep,0
431 h_setid_EEPROM_write:
432         sbic _SFR_IO_ADDR(EECR), EEPE   
433         rjmp h_setid_EEPROM_write
434         ldi r_temp, (0<<EEPM1)|(0<<EEPM0)
435         out _SFR_IO_ADDR(EECR), r_temp
436         ;nur adresse L schreiben H bleibt aus oben genannten grund gleich.
437         out _SFR_IO_ADDR(EEARL),r_temp2
438         ld  r_rwbyte,Z+
439         out _SFR_IO_ADDR(EEDR), r_rwbyte
440         sbi _SFR_IO_ADDR(EECR), EEMPE
441         sbi _SFR_IO_ADDR(EECR), EEPE
442         inc r_bytep
443         inc r_temp2
444         cpi r_bytep,8
445         brne h_setid_EEPROM_write
446         //rcall read_EEPROM_ID1
447         //rcall read_EEPROM_ID2
448         push r_idm1
449         push r_idm2
450         push r_idn1
451         push r_idn2
452         push xl
453         push xh
454         push yl
455         push yh
456         rcall init_idtable
457         pop yh
458         pop yl
459         pop xh
460         pop xl
461         pop r_idn2
462         pop r_idn1
463         pop r_idm2
464         pop r_idm1
465 h_setid_bad_code_all:
466         rjmp handle_end_sleep
467
468
469
470 #endif
471
472
473 spause:
474         nop
475         nop
476         nop
477         nop
478         ret
479
480
481 .global OWINIT
482 OWINIT:
483 #ifndef _DIS_FLASH_
484 ; check for bootloader jumper
485         ;vor allen anderen Registerconfigs
486         
487         ldi r_temp,(1<<PUD) ;enable pullup 
488         out _SFR_IO_ADDR(MCUCR) ,r_temp
489         sbi _SFR_IO_ADDR(PORTA),PINA5 ;internal pullup on PINA5
490         sbi _SFR_IO_ADDR(PORTA),PINA4 ;internal pullup on PINA4
491         rcall spause
492         sbis _SFR_IO_ADDR(PINA),PINA5
493         rjmp owinit_botest_end  ;PinA5 nicht auf 1
494         sbis _SFR_IO_ADDR(PINA),PINA4
495         rjmp owinit_botest_end ;PinA4 nicht auf 1
496         cbi _SFR_IO_ADDR(PORTA),PINA4 
497         sbi _SFR_IO_ADDR(DDRA),PINA4  ;PINA4 AUSGANG und 0
498         rcall spause
499         sbic _SFR_IO_ADDR(PINA),PINA5 
500         rjmp owinit_botest_end ;PINA5 nicht 0.... nicht verbunden
501         cbi _SFR_IO_ADDR(DDRA),PINA4
502         ldi r_temp,0xE0
503         push r_temp
504         ldi r_temp,0x0E
505         push r_temp
506         ret ; Direkter Sprung zum Bootloader*/
507 owinit_botest_end:
508 #endif
509         HW_INIT  //Microcontroller specific
510         CHIP_INIT //1-Wire device specific
511 #ifdef _CHANGEABLE_ID_
512 init_idtable:
513         rcall read_EEPROM_ID1
514         rcall read_EEPROM_ID2
515 #endif
516         ldi r_bytep,8
517         ldi r_temp,0
518         ldi  zl,lo8(idtable)
519     ldi  zh,hi8(idtable)
520         ldi  xl,lo8(owid1)
521         ldi  xh,hi8(owid1)
522         ldi      yl,lo8(owid2)
523         ldi  yh,hi8(owid2)
524 owinit_odgen1:
525         ld r_idm1,X+
526         ld r_idm2,Y+
527         mov r_idn1,r_idm1
528         com r_idn1
529         mov r_idn2,r_idm2
530         com r_idn2
531         ldi r_bcount,8
532         mov r_temp,r_idm1
533         and r_temp,r_idm2
534         mov r_temp2,r_idn1
535         and r_temp2,r_idn2
536 owinit_odgen2:
537         ldi r_mode,0
538         lsr r_idm1
539         rol r_mode  ;6. Bit id1 
540         lsr r_idn1  
541         rol r_mode ; 5. Bit id1negiert
542         lsr r_idm2
543         rol r_mode  ;;4. Bit id2 
544         lsr r_idn2  
545         rol r_mode  ;3. Bit id2 negiert
546         lsr r_temp 
547         rol r_mode ;zweites bit  id1 und id2
548         lsr r_temp2
549         rol r_mode   ;erstes bit id1 negiert und id2  negiert
550         st  Z+,r_mode
551         dec r_bcount
552         brne owinit_odgen2
553         dec r_bytep
554         brne owinit_odgen1
555
556
557         ldi r_temp,0
558         sts mode,r_temp
559         sts bcount,r_temp
560         sts alarmflag,r_temp
561         RESETZEROMARKER
562         ret