fdcc9197bafd92763b708e29acd375b47b73ef59
[owSlave2.git] / common / OWRomFunctions.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_READROM 5
63 #define OW_READ_COMMAND 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
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_ID:  
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(owid)       
107     ldi  zh,hi8(owid)
108 read_EEPROM_ID_loop:
109         sbic _SFR_IO_ADDR(EECR), EEPE
110         rjmp read_EEPROM_ID_loop
111         out _SFR_IO_ADDR(EEARL),r_temp2
112         sbi _SFR_IO_ADDR(EECR), EERE
113         in r_rwbyte,_SFR_IO_ADDR(EEDR)
114         cpi r_rwbyte,0xFF
115         breq read_EEPROM_ID_end
116         st Z+,r_rwbyte
117         inc r_bytep
118         inc r_temp2
119         cpi r_bytep,8
120         brne read_EEPROM_ID_loop
121 read_EEPROM_ID_end:
122         ret
123 #endif
124
125
126
127
128
129
130 handle_stable: 
131                 rjmp handle_end_no_bcount // sleep eventuell reset, nichts tun und auf Timeout warten
132                 rjmp h_readromcommand 
133                 rjmp h_matchrom 
134                 rjmp h_searchroms 
135                 rjmp h_searchromr
136                 rjmp h_readrom
137                 rjmp h_readcommand 
138 #ifdef _CHANGEABLE_ID_
139                 rjmp h_writeid
140                 rjmp h_readid
141                 rjmp h_setid
142 #endif
143                 COMMAND_TABLE
144
145
146
147 h_readromcommand:
148         clr r_bytep
149         cset 0x55,OW_MATCHROM 
150         cjmp 0xF0,hrc_set_searchrom
151         cjmp 0xCC,hrc_start_read_command ;skip rom
152         cjmp 0x33,hrc_set_read_rom
153         cjmp 0xEC,hrc_set_alarm_search
154         
155         rjmp handle_end_sleep
156
157 #ifndef _DIS_FLASH_
158 ;sprung zum flasher
159 hrc_jmp_flasher:
160         lds r_temp,flashmarker
161         cpi r_temp,2
162         brne hrc_jmp_flasher_inc
163         ldi r_temp,0xE0
164         push r_temp
165         ldi r_temp,0x0E
166         push r_temp
167         ret ; Direkter Sprung zum Bootloader
168 hrc_jmp_flasher_inc:
169         inc r_temp
170         sts flashmarker,r_temp
171         rjmp handle_end_sleep
172 #endif
173
174
175 hrc_set_searchrom:      
176         lds r_rwbyte,owid ;erstes Byte lesen
177         rjmp h_searchrom_next_bit
178
179 hrc_start_read_command: ;Skip rom und Matchrom ok...
180         ldi r_mode,OW_READ_COMMAND
181         CRCInit1
182         rjmp handle_end
183
184 hrc_set_read_rom:
185         ldi r_mode,OW_READROM
186         ldi r_sendflag,1
187         rjmp h_readrom
188
189 hrc_set_alarm_search:
190         lds r_temp,alarmflag
191         tst r_temp
192         brne hrc_set_searchrom ;alarm flag nicht 0 also gehe zu searchrom
193         ; sonst tue nichts
194         rjmp handle_end_sleep
195
196 ;---------------------------------------------------
197 ;   MATCH ROM
198 ;---------------------------------------------------
199         
200
201 h_matchrom:
202         configZ owid,r_bytep
203         ld r_temp,Z
204         cp r_temp,r_rwbyte
205         breq hmr_next_byte
206         rjmp handle_end_sleep
207
208 hmr_next_byte:
209         cpi r_bytep,7
210         breq hrc_start_read_command ;Starten von Read Command
211         rjmp handle_end_inc
212
213
214
215 ;---------------------------------------------------
216 ;   SEARCH ROM
217 ;---------------------------------------------------
218
219
220 h_searchrom_next_bit:  ;Setup next Bit of ID
221         sts srbyte,r_rwbyte ;erstes Byte speichern von der Aufrufenden Ebene
222         mov r_temp2,r_rwbyte
223         com r_rwbyte ; negieren
224         ror r_temp2 ; erstes unnegiertes bit in Carry
225         rol r_rwbyte ;und dann als erstes bit in r_rwbyte
226         ldi r_sendflag,1
227         ldi r_bcount,0x40 ; zwei bits sensden dann zu Searchromr 
228         ldi r_mode,OW_SEARCHROMR
229         rjmp handle_end_no_bcount
230
231
232
233 h_searchroms:  ; Modus Send zwei bit
234         clr r_temp
235         sbrc r_rwbyte,7 ; bit gesetz (1 empfangen)
236         ldi r_temp,1
237         lds r_bcount,srbyte ;r_bcount wird am ende gesetzt
238         eor r_temp,r_bcount
239         sbrs r_temp,0
240         rjmp h_searchroms_next ; Vergleich des letzen gelesenen bits mit der id
241         ;Ungleich....
242         ;goto sleep
243         ;clr r_sendflag
244         ; ist ja auf lesen
245         rjmp handle_end_sleep
246 h_searchroms_next: ; Setup next bit
247         inc r_bytep  ; zaehler der Bits erhoehen
248         sbrc r_bytep,6 ; 64 bit erreicht 
249         rjmp h_searchrom_end_ok ;alles ok auf Command warten
250         mov r_temp,r_bytep 
251         andi r_temp,0x07
252         brne h_searchroms_next_bit  ; bit zwischen 0 und 8
253         mov r_bcount,r_bytep  ; next Byte lesen
254         lsr r_bcount    
255         lsr r_bcount
256         lsr r_bcount
257
258         configZ owid,r_bcount
259         ld r_rwbyte,Z
260         sts srbyte,r_rwbyte
261         rjmp h_searchrom_next_bit
262                 
263 h_searchroms_next_bit: ;next Bit lesen
264         ;sts srbytep,r_bcount
265         lds r_rwbyte,srbyte
266         lsr r_rwbyte ;aktuelles byte weiterschieben r_rwbyte hier zweckefrei verwendet
267         rjmp h_searchrom_next_bit  ;algemeine routine zum vorbereiten
268 h_searchrom_end_ok:
269         clr r_sendflag
270         rjmp hrc_start_read_command
271
272 h_searchromr:
273         clr r_sendflag
274         ldi r_mode,OW_SEARCHROMS
275         ldi r_bcount,0
276         rjmp handle_end_no_bcount
277
278
279 ;---------------------------------------------------
280 ;   READ ROM
281 ;---------------------------------------------------
282
283 h_readrom:
284         cpi  r_bytep,8
285         breq h_readrom_all
286         configZ owid,r_bytep
287         ld   r_rwbyte,Z
288         rjmp handle_end_inc
289 h_readrom_all:
290         rjmp handle_end_sleep
291
292
293 ;---------------------------------------------------
294 ;   CHANGE ROM FUNCTIONS
295 ;---------------------------------------------------
296
297
298 #ifdef _CHANGEABLE_ID_
299
300 h_writeid:
301         configZ newid,r_bytep
302         st   Z,r_rwbyte
303         cpi  r_bytep,7
304         breq h_writeid_all
305         rjmp handle_end_inc
306 h_writeid_all:
307         rjmp handle_end_sleep
308
309
310 hrc_set_readid:
311         ldi r_mode,OW_READ_NEWID
312         ldi r_sendflag,1
313 h_readid:
314         cpi  r_bytep,8
315         breq h_readid_all
316         configZ newid,r_bytep
317         ld   r_rwbyte,Z
318         rjmp handle_end_inc
319 h_readid_all:
320         clr  r_sendflag
321         rjmp handle_end_sleep
322
323 hrc_set_setid:
324         ldi r_mode,OW_SET_NEWID
325         ;ldi r_bytep,1 ;start to write in 2
326         rjmp handle_end_inc ;set r_bytep to 1!!!
327
328 h_setid:
329         configZ owid,r_bytep
330         ld r_temp,Z
331         cp r_rwbyte,r_temp
332         brne h_setid_bad_code_all
333         cpi r_bytep,1
334         breq h_setid_set2
335         cpi r_bytep,5 
336         breq h_setid_set3
337         cpi r_bytep,6
338         breq h_setid_copy_id
339         rjmp h_setid_bad_code_all ;sollte eigentlich nicht passieren
340 h_setid_set2:
341         ldi r_temp,3
342         add r_bytep,r_temp
343 h_setid_set3:
344         inc r_bytep
345         rjmp handle_end
346 h_setid_copy_id:
347         ldi r_temp2,lo8(E2END)
348         ldi zh,hi8(E2END)
349         ldi r_temp,7
350         sub r_temp2,r_temp
351         ;ldi r_temp,0 ;kommt nicht vor das ein E2ROM genau n*256+(0 bis 7) byte gross ist
352         ;sbc zh
353         out _SFR_IO_ADDR(EEARH),zh
354         ldi zl,lo8(newid)
355         ldi zh,hi8(newid)
356         ldi r_bytep,0
357 h_setid_EEPROM_write:
358         sbic _SFR_IO_ADDR(EECR), EEPE   
359         rjmp h_setid_EEPROM_write
360         ldi r_temp, (0<<EEPM1)|(0<<EEPM0)
361         out _SFR_IO_ADDR(EECR), r_temp
362         ;nur adresse L schreiben H bleibt aus oben genannten grund gleich.
363         out _SFR_IO_ADDR(EEARL),r_temp2
364         ld  r_rwbyte,Z+
365         out _SFR_IO_ADDR(EEDR), r_rwbyte
366         sbi _SFR_IO_ADDR(EECR), EEMPE
367         sbi _SFR_IO_ADDR(EECR), EEPE
368         inc r_bytep
369         inc r_temp2
370         cpi r_bytep,8
371         brne h_setid_EEPROM_write
372         rcall read_EEPROM_ID
373 h_setid_bad_code_all:
374         rjmp handle_end_sleep
375
376
377
378 #endif
379
380
381 spause:
382         nop
383         nop
384         nop
385         nop
386         ret
387
388
389 .global OWINIT
390 OWINIT:
391 #ifndef _DIS_FLASH_
392 ; check for bootloader jumper
393         ;vor allen anderen Registerconfigs
394         
395         ldi r_temp,(1<<PUD) ;enable pullup 
396         out _SFR_IO_ADDR(MCUCR) ,r_temp
397         sbi _SFR_IO_ADDR(PORTA),PINA5 ;internal pullup on PINA5
398         sbi _SFR_IO_ADDR(PORTA),PINA4 ;internal pullup on PINA4
399         rcall spause
400         sbis _SFR_IO_ADDR(PINA),PINA5
401         rjmp owinit_botest_end  ;PinA5 nicht auf 1
402         sbis _SFR_IO_ADDR(PINA),PINA4
403         rjmp owinit_botest_end ;PinA4 nicht auf 1
404         cbi _SFR_IO_ADDR(PORTA),PINA4 
405         sbi _SFR_IO_ADDR(DDRA),PINA4  ;PINA4 AUSGANG und 0
406         rcall spause
407         sbic _SFR_IO_ADDR(PINA),PINA5 
408         rjmp owinit_botest_end ;PINA5 nicht 0.... nicht verbunden
409         cbi _SFR_IO_ADDR(DDRA),PINA4
410         ldi r_temp,0xE0
411         push r_temp
412         ldi r_temp,0x0E
413         push r_temp
414         ret ; Direkter Sprung zum Bootloader*/
415 owinit_botest_end:
416 #endif
417         HW_INIT  //Microcontroller specific
418         CHIP_INIT //1-Wire device specific
419 #ifdef _CHANGEABLE_ID_
420         rcall read_EEPROM_ID
421 #endif
422         ldi r_temp,0
423         sts mode,r_temp
424         sts bcount,r_temp
425         sts alarmflag,r_temp
426         RESETZEROMARKER
427         ret