Many changes from 2018
[owSlave2.git] / common / OWDS18B20_DS2408.S
1 \r
2 // Copyright (c) 2018, Tobias Mueller tm(at)tm3d.de\r
3 // All rights reserved. \r
4 // \r
5 // Redistribution and use in source and binary forms, with or without \r
6 // modification, are permitted provided that the following conditions are \r
7 // met: \r
8 // \r
9 //  * Redistributions of source code must retain the above copyright \r
10 //    notice, this list of conditions and the following disclaimer. \r
11 //  * Redistributions in binary form must reproduce the above copyright \r
12 //    notice, this list of conditions and the following disclaimer in the \r
13 //    documentation and/or other materials provided with the \r
14 //    distribution. \r
15 //  * All advertising materials mentioning features or use of this \r
16 //    software must display the following acknowledgement: This product \r
17 //    includes software developed by tm3d.de and its contributors. \r
18 //  * Neither the name of tm3d.de nor the names of its contributors may \r
19 //    be used to endorse or promote products derived from this software \r
20 //    without specific prior written permission. \r
21 // \r
22 // THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS \r
23 // "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT \r
24 // LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR \r
25 // A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT \r
26 // OWNER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, \r
27 // SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT \r
28 // LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, \r
29 // DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY \r
30 // THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT \r
31 // (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE \r
32 // OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. \r
33 \r
34 #define _CHANGEABLE_ID_\r
35 #define _ZERO_POLLING_\r
36 #define _HANDLE_CC_COMMAND_\r
37 #include "../common/OWConfig.s"\r
38 #include "../common/OWCRC8_16.s"\r
39 \r
40 .extern pack1,8\r
41 \r
42 .extern pack2,8\r
43 .comm addr,1 ;zweites Adressbyte ist unnoetig (Warum auch immer fuer 32 Byte 16 Bit Adressen verwendet werden....)\r
44 .comm crcsave,1 ; zwischenspeicherspeicher fuer crc nur zweites byte....\r
45 //.extern  am2302_temp,2\r
46 .comm stat_to_sample,1\r
47 \r
48 .comm block,1 ; Block der augegeben, geschrieben wird (Parameter von READ/WRITE Scratchpad)\r
49 .comm cpsp,1 ; Copy Scratchpad marker\r
50 \r
51 .macro CHIP_INIT        ;r_temp is pushed other Registers should be saved\r
52         ldi r_temp,0\r
53         sts cpsp,r_temp\r
54 Init_EEPROM_read:\r
55         push r_bytep\r
56         push r_rwbyte\r
57         sbic _SFR_IO_ADDR(EECR), EEPE\r
58         rjmp Init_EEPROM_read\r
59         ldi r_temp,0\r
60         out _SFR_IO_ADDR(EEARH), r_temp\r
61         ldi r_temp,2\r
62         out _SFR_IO_ADDR(EEARL), r_temp\r
63         sbi _SFR_IO_ADDR(EECR), EERE\r
64         in r_temp,_SFR_IO_ADDR(EEDR)\r
65         sbrs r_temp,7\r
66         rcall hrc_recall_eeprom_func1\r
67         pop r_rwbyte\r
68         pop r_bytep\r
69 .endm\r
70 \r
71 \r
72 .macro COMMAND_TABLE\r
73                 rjmp h_readscratchpad1\r
74                 rjmp h_writescratchpad1\r
75                 rjmp h_convert_run1\r
76                 rjmp h_readpioregaddr2\r
77                 rjmp h_readpioreg2\r
78                 rjmp h_readpioregcrc12\r
79                 rjmp h_readpioregcrc22\r
80                 rjmp h_readchanel2\r
81                 rjmp h_readchanel_crc2\r
82                 rjmp h_writechanel2\r
83                 rjmp h_writecomchanel2\r
84                 rjmp h_writesendaa2\r
85                 rjmp h_writesendchanel2\r
86                 rjmp h_resetactivity2\r
87                 rjmp h_writeregaddr2\r
88                 rjmp h_writereg2\r
89 .endm\r
90 \r
91 #include "../common/OWRomFunctionsDual.s"\r
92 #include "../common/OWTimerInterrupt.s"\r
93 \r
94 \r
95 \r
96 ; Ab hier Geraeteabhaenging\r
97 \r
98 #define OW_READ_SCRATCHPAD1 OW_FIRST_COMMAND+0\r
99 #define OW_WRITE_SCRATCHPAD1 OW_FIRST_COMMAND+1\r
100 #define OW_CONVERT_RUN1  OW_FIRST_COMMAND+2\r
101 \r
102 #define OW_READ_PIO_REG_ADDR2 OW_FIRST_COMMAND+3\r
103 #define OW_READ_PIO_REG2 OW_FIRST_COMMAND+4\r
104 #define OW_READ_PIO_REG_CRC12 OW_FIRST_COMMAND+5\r
105 #define OW_READ_PIO_REG_CRC22 OW_FIRST_COMMAND+6\r
106 #define OW_READ_CHANEL2 OW_FIRST_COMMAND+7\r
107 #define OW_READ_CHANEL_CRC2 OW_FIRST_COMMAND+8\r
108 #define OW_WRITE_CHANEL2 OW_FIRST_COMMAND+9\r
109 #define OW_WRITE_COMCHANEL2 OW_FIRST_COMMAND+10\r
110 #define OW_WRITE_SENDAA2 OW_FIRST_COMMAND+11\r
111 #define OW_WRITE_SEND_CHANEL2 OW_FIRST_COMMAND+12\r
112 #define OW_RESET_ACTIVITY2 OW_FIRST_COMMAND+13\r
113 #define OW_WRITE_REG_ADDR2 OW_FIRST_COMMAND+14\r
114 #define OW_WRITE_REG2 OW_FIRST_COMMAND+15\r
115 \r
116 ;---------------------------------------------------\r
117 ;       READ COMMAND and start operation\r
118 ;---------------------------------------------------\r
119 \r
120 #ifdef _HANDLE_CC_COMMAND_\r
121 h_readcommand12:\r
122         clr r_bytep\r
123         cjmp 0x44,hrc_set_convertT12\r
124         ldi r_mode,OW_SLEEP\r
125         rjmp handle_end\r
126 #endif\r
127 \r
128 \r
129 h_readcommand1:\r
130         clr r_bytep\r
131 #ifndef _DIS_FLASH_\r
132         FLASH_COMMANDS ; muss zu erst sein....\r
133 #endif\r
134         cjmp 0xBE,hrc_set_readscratchpad1\r
135         cjmp 0x4E,hrc_set_writescratchpad1\r
136         cjmp 0x44,hrc_set_convertT1\r
137         cjmp 0x48,hrc_copy_scratchpad1\r
138         cjmp 0xB8,hrc_recall_eeprom1\r
139         FW_CONFIG_INFO1\r
140 #ifdef _CHANGEABLE_ID_\r
141         CHANGE_ID_COMMANDS\r
142 #endif\r
143         ldi r_mode,OW_SLEEP\r
144         rjmp handle_end\r
145 \r
146 hrc_set_readscratchpad1:\r
147         ldi r_mode,OW_READ_SCRATCHPAD1\r
148         ldi r_sendflag,1\r
149         CRCInit2\r
150         rjmp h_readscratchpad1\r
151 \r
152 hrc_set_writescratchpad1:\r
153         ldi r_mode,OW_WRITE_SCRATCHPAD1\r
154         ldi r_bytep,2 ;start to write in 2\r
155         rjmp handle_end\r
156 \r
157 hrc_recall_eeprom1:\r
158         rcall hrc_recall_eeprom_func1\r
159         rjmp handle_end\r
160 \r
161 #ifdef _HANDLE_CC_COMMAND_\r
162 hrc_set_convertT12:\r
163         rjmp hrc_set_convertT1\r
164 #endif\r
165 \r
166 hrc_set_convertT1:\r
167         ldi r_temp,16\r
168         sts gcontrol,r_temp\r
169 hrc_set_convertT12b:\r
170         ldi r_mode,OW_CONVERT_RUN1\r
171         ldi r_sendflag,3 ;set bit 0 and 1 for no zero polling\r
172 h_convert_run1:\r
173         ldi r_bcount,0\r
174         ldi r_rwbyte,0\r
175         rjmp handle_end_no_bcount       \r
176 \r
177 \r
178 \r
179 hrc_copy_scratchpad1:\r
180         ldi r_bytep,2\r
181         configZ pack1,r_bytep\r
182         clr r_bytep\r
183 hrc_copy_scratchpad_EEPROM_write1:\r
184         sbic _SFR_IO_ADDR(EECR), EEPE   \r
185         rjmp hrc_copy_scratchpad_EEPROM_write1\r
186         ldi r_temp, (0<<EEPM1)|(0<<EEPM0)\r
187         out _SFR_IO_ADDR(EECR), r_temp\r
188         ldi r_temp,0\r
189         out _SFR_IO_ADDR(EEARH),r_temp\r
190         out _SFR_IO_ADDR(EEARL), r_bytep\r
191         ld  r_rwbyte,Z+\r
192         out _SFR_IO_ADDR(EEDR), r_rwbyte\r
193         sbi _SFR_IO_ADDR(EECR), EEMPE\r
194         sbi _SFR_IO_ADDR(EECR), EEPE\r
195         inc r_bytep\r
196         cpi r_bytep,3\r
197         brne hrc_copy_scratchpad_EEPROM_write1\r
198         rjmp handle_end\r
199 \r
200 \r
201 hrc_recall_eeprom_func1:\r
202         ldi r_bytep,2\r
203         configZ pack1,r_bytep\r
204         clr r_bytep\r
205         clr r_temp\r
206 hrc_recall_eeprom_EEPROM_read1:\r
207         sbic _SFR_IO_ADDR(EECR), EEPE\r
208         rjmp hrc_recall_eeprom_EEPROM_read1\r
209         out _SFR_IO_ADDR(EEARH), r_temp\r
210         out _SFR_IO_ADDR(EEARL), r_bytep\r
211         sbi _SFR_IO_ADDR(EECR), EERE\r
212         in r_rwbyte,_SFR_IO_ADDR(EEDR)\r
213         st Z+,r_rwbyte\r
214         inc r_bytep\r
215         cpi r_bytep,3\r
216         brne hrc_recall_eeprom_EEPROM_read1\r
217         ret\r
218 \r
219 \r
220 \r
221 \r
222 \r
223 \r
224 ;---------------------------------------------------\r
225 ;   READ SCRATCHPAD\r
226 ;---------------------------------------------------\r
227 \r
228 h_readscratchpad1:\r
229         cpi  r_bytep,8\r
230         breq h_readscratchpad_crc1\r
231         cpi  r_bytep,9\r
232         breq h_readscratchpad_all1\r
233         configZ pack1,r_bytep\r
234         ld   r_rwbyte,Z\r
235         rjmp h_readscratchpad_endc1\r
236 h_readscratchpad_crc1:\r
237         lds  r_rwbyte,crc8\r
238 h_readscratchpad_endc1:\r
239         inc  r_bytep\r
240         ldi  r_bcount,1 \r
241         rjmp handle_end\r
242 h_readscratchpad_all1:\r
243         rjmp handle_end_sleep\r
244 \r
245 \r
246 \r
247 \r
248 \r
249 ;---------------------------------------------------\r
250 ;   WRITE SCRATCHPAD\r
251 ;---------------------------------------------------\r
252 \r
253 h_writescratchpad1:\r
254         configZ pack1,r_bytep\r
255         inc  r_bytep\r
256         cpi  r_bytep,5\r
257         breq h_writescratchpad_all1\r
258         st   Z,r_rwbyte\r
259         rjmp handle_end\r
260 h_writescratchpad_all1:\r
261         ;ori r_rwbyte,0x1F ; Alle unteren Bits sind immer 1 -->VOC use different\r
262         st   Z,r_rwbyte\r
263         rjmp handle_end_sleep\r
264 \r
265 ;*****************************************************************************************************************************************************************************************\r
266 ;*****************************************************************************************************************************************************************************************\r
267 ;*****************************************************************************************************************************************************************************************\r
268 ;*****************************************************************************************************************************************************************************************\r
269 ;*****************************************************************************************************************************************************************************************\r
270 \r
271 \r
272 \r
273 \r
274 \r
275 \r
276 \r
277 \r
278 \r
279 \r
280 \r
281 \r
282 \r
283 \r
284 \r
285 \r
286 \r
287 \r
288 \r
289 \r
290 \r
291 \r
292 \r
293 h_readcommand2:\r
294         clr r_bytep\r
295 #ifndef _DIS_FLASH_\r
296         FLASH_COMMANDS ; muss zu erst sein....\r
297 #endif\r
298         cset 0xF0,OW_READ_PIO_REG_ADDR2\r
299         cljmp 0xF5,hrc_readchanel2\r
300         cset 0x5A,OW_WRITE_CHANEL2\r
301         cljmp 0xC3,hrc_reset_activity2\r
302         cset 0xCC,OW_WRITE_REG_ADDR2\r
303         FW_CONFIG_INFO2\r
304 #ifdef _CHANGEABLE_ID_\r
305         CHANGE_ID_COMMANDS\r
306 #endif\r
307         ldi r_mode,OW_SLEEP\r
308         rjmp handle_end\r
309 \r
310 \r
311 h_readpioregaddr2:\r
312         cpi r_bytep,0  ;erstes Adressbyte ?\r
313         brne h_readpioreg_addr_byte12 ;nein dann weiter\r
314         //andi r_rwbyte,0x1F  ; nur Adressen zwischen 0 und 0x1F zulassen\r
315         subi r_rwbyte,0x89  ;beim lesen von 0x88 --> 0xFF inc addr -> 0x00\r
316         sts addr,r_rwbyte  ;speichern des ersten bytes\r
317         rjmp handle_end_inc\r
318 h_readpioreg_addr_byte12:  ;zweiters Addressbyte wird nicht gespeichert!\r
319         ldi r_mode,OW_READ_PIO_REG2 ;weiter zu read Memory\r
320         ;;ldi r_bcount,1 ;ist unten\r
321         ldi r_sendflag,1 ;jetzt sendet der Slave zum Master\r
322         clr r_bytep\r
323 h_readpioreg2:\r
324         lds r_bytep,addr\r
325         inc r_bytep\r
326         sts addr,r_bytep\r
327         cpi r_bytep,0x08\r
328         breq h_readpioreg_init_crc2\r
329         brge h_readpioreg_end2 ; groeser dann nix senden\r
330         configZ pack2,r_bytep\r
331         ld   r_rwbyte,Z\r
332         ;ldi r_bcount,1\r
333         rjmp handle_end ;sendet das Byte und geht zu h_readmemory\r
334 h_readpioreg_init_crc2:; init erstes CRC byte\r
335         lds r_rwbyte,crc16\r
336         com r_rwbyte\r
337         lds r_temp,crc16+1\r
338         com r_temp\r
339         sts crcsave,r_temp\r
340         ldi r_mode,OW_READ_PIO_REG_CRC12\r
341         ;ldi r_bcount,1\r
342         rjmp handle_end\r
343 h_readpioreg_end2:\r
344         ldi  r_mode,OW_SLEEP\r
345         clr r_sendflag\r
346         rjmp handle_end\r
347 h_readpioregcrc12:;init zweites CRC Byte\r
348         lds r_rwbyte,crcsave\r
349         ;ldi r_bcount,1\r
350         ldi r_mode,OW_READ_PIO_REG_CRC22\r
351         rjmp handle_end\r
352 h_readpioregcrc22: ; 2. CRC Byte gesendet\r
353         rjmp h_readpioreg_end2\r
354 \r
355 \r
356 hrc_readchanel2:\r
357         ldi r_sendflag,1 ;jetzt sendet der Slave zum Master\r
358         ldi r_mode,OW_READ_CHANEL2\r
359         ldi r_temp,8\r
360         sts gcontrol,r_temp\r
361         rjmp h_readchanel12\r
362 h_readchanel2:\r
363         ldi r_temp,4\r
364         sts gcontrol,r_temp\r
365 h_readchanel12:\r
366         cpi r_bytep,31\r
367         brge h_readchanelcrc12\r
368         lds r_rwbyte,stat_to_sample\r
369         sts pack2,r_rwbyte //sample \r
370         rjmp handle_end_inc\r
371 h_readchanelcrc12:\r
372         lds r_rwbyte,crc16\r
373         com r_rwbyte\r
374         lds r_temp,crc16+1\r
375         com r_temp\r
376         sts crcsave,r_temp\r
377         ldi r_mode,OW_READ_CHANEL_CRC2\r
378         ;ldi r_bcount,1\r
379         rjmp handle_end\r
380 h_readchanel_crc2:\r
381         clr r_bytep\r
382         ldi r_mode,OW_READ_CHANEL2\r
383         lds r_rwbyte,crcsave\r
384         rjmp handle_end\r
385         \r
386 h_writechanel2:\r
387         sts crcsave,r_rwbyte\r
388         ldi r_mode,OW_WRITE_COMCHANEL2\r
389         rjmp handle_end\r
390 h_writecomchanel2:\r
391         com r_rwbyte\r
392         lds r_temp,crcsave\r
393         cp r_rwbyte,r_temp\r
394         breq h_writeok2\r
395         rjmp handle_end_sleep\r
396 h_writeok2:\r
397         sts pack2+1,r_rwbyte\r
398         ldi r_temp2,1\r
399         sts gcontrol,r_temp2\r
400         clr r_sendflag\r
401         ldi r_rwbyte,0xAA\r
402         ldi r_mode,OW_WRITE_SENDAA2\r
403         ldi r_sendflag,1 ;jetzt sendet der Slave zum Master\r
404         rjmp handle_end\r
405 h_writesendaa2:\r
406         lds r_rwbyte,pack2\r
407         ldi r_mode,OW_WRITE_SEND_CHANEL2\r
408         rjmp handle_end\r
409 h_writesendchanel2:\r
410         rjmp handle_end_sleep\r
411 \r
412 \r
413 \r
414 hrc_reset_activity2:\r
415         ldi r_temp,2\r
416         sts gcontrol,r_temp\r
417         ldi r_rwbyte,0xAA\r
418         ldi r_mode,OW_RESET_ACTIVITY2\r
419         ldi r_sendflag,1 ;jetzt sendet der Slave zum Master\r
420         rjmp handle_end\r
421 h_resetactivity2:\r
422         rjmp handle_end_sleep\r
423 \r
424 \r
425 h_writeregaddr2:\r
426         cpi r_bytep,0  ;erstes Adressbyte ?\r
427         brne h_writeregddr_byte12 ;nein dann weiter\r
428         //andi r_rwbyte,0x1F  ; nur Adressen zwischen 0 und 0x1F zulassen\r
429         subi r_rwbyte,0x8B  \r
430         brmi h_writereg_end2\r
431         sts addr,r_rwbyte  ;speichern des ersten bytes\r
432         rjmp handle_end_inc\r
433 h_writeregddr_byte12:  ;zweiters Addressbyte wird nicht gespeichert!\r
434         ldi r_mode,OW_WRITE_REG2 ;weiter zu write Memory\r
435         ;;ldi r_bcount,1 ;ist unten\r
436         clr r_bytep\r
437         rjmp handle_end\r
438 h_writereg2:\r
439         lds r_temp,addr\r
440         configZ pack2+3,r_temp\r
441         st Z,r_rwbyte\r
442         cpi r_temp,5\r
443         brge h_writereg_end2\r
444         inc r_temp\r
445         sts addr,r_temp\r
446         rjmp handle_end_sleep\r
447                 \r
448 h_writereg_end2:\r
449         rjmp handle_end_sleep\r
450 \r
451 \r
452 \r
453 \r
454 \r
455 #include "../common/OWPinInterrupt.s"\r
456 .end