Many changes from 2018
[owSlave2.git] / common / OWDS18B20_DS18B20.S
1 \r
2 // Copyright (c) 2017, 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 //#define  __4MHZ__\r
38 //#define _DB_\r
39 \r
40 #include "../common/OWConfig.s"\r
41 #include "../common/OWCRC8.s"\r
42 \r
43 .extern pack1,8\r
44 \r
45 .extern pack2,8\r
46 \r
47 \r
48 \r
49 .comm block,1 ; Block der augegeben, geschrieben wird (Parameter von READ/WRITE Scratchpad)\r
50 .comm cpsp,1 ; Copy Scratchpad marker\r
51 \r
52 \r
53 .macro CHIP_INIT        ;r_temp is pushed other Registers should be saved\r
54         ldi r_temp,0\r
55         sts cpsp,r_temp\r
56 Init_EEPROM_read:\r
57         push r_bytep\r
58         push r_rwbyte\r
59         sbic _SFR_IO_ADDR(EECR), EEPE\r
60         rjmp Init_EEPROM_read\r
61         ldi r_temp,0\r
62         out _SFR_IO_ADDR(EEARH), r_temp\r
63         ldi r_temp,2\r
64         out _SFR_IO_ADDR(EEARL), r_temp\r
65         sbi _SFR_IO_ADDR(EECR), EERE\r
66         in r_temp,_SFR_IO_ADDR(EEDR)\r
67         sbrs r_temp,7\r
68         rcall hrc_recall_eeprom_func1\r
69         pop r_rwbyte\r
70         pop r_bytep\r
71 .endm\r
72 \r
73 .macro COMMAND_TABLE\r
74                 rjmp h_readscratchpad1\r
75                 rjmp h_writescratchpad1\r
76                 rjmp h_convert_run1\r
77                 rjmp h_readscratchpad2\r
78                 rjmp h_writescratchpad2\r
79                 rjmp h_convert_run2\r
80 .endm\r
81 \r
82 #include "../common/OWRomFunctionsDual.s"\r
83 #include "../common/OWTimerInterrupt.s"\r
84 \r
85 \r
86 \r
87 ; Ab hier Geraeteabhaenging\r
88 #define OW_READ_SCRATCHPAD1 OW_FIRST_COMMAND+0\r
89 #define OW_WRITE_SCRATCHPAD1 OW_FIRST_COMMAND+1\r
90 #define OW_CONVERT_RUN1  OW_FIRST_COMMAND+2\r
91 #define OW_READ_SCRATCHPAD2 OW_FIRST_COMMAND+3\r
92 #define OW_WRITE_SCRATCHPAD2 OW_FIRST_COMMAND+4\r
93 #define OW_CONVERT_RUN2  OW_FIRST_COMMAND+5\r
94 \r
95 \r
96 ;---------------------------------------------------\r
97 ;       READ COMMAND and start operation\r
98 ;---------------------------------------------------\r
99 \r
100 #ifdef _HANDLE_CC_COMMAND_\r
101 h_readcommand12:\r
102         clr r_bytep\r
103         cjmp 0x44,hrc_set_convertT12\r
104         ldi r_mode,OW_SLEEP\r
105         rjmp handle_end\r
106 #endif\r
107 \r
108 \r
109 h_readcommand1:\r
110         clr r_bytep\r
111 #ifndef _DIS_FLASH_\r
112         FLASH_COMMANDS ; muss zu erst sein....\r
113 #endif\r
114         cjmp 0xBE,hrc_set_readscratchpad1\r
115         cjmp 0x4E,hrc_set_writescratchpad1\r
116         cjmp 0x44,hrc_set_convertT1\r
117         cjmp 0x48,hrc_copy_scratchpad1\r
118         cjmp 0xB8,hrc_recall_eeprom1\r
119         FW_CONFIG_INFO1\r
120 #ifdef _CHANGEABLE_ID_\r
121         CHANGE_ID_COMMANDS\r
122 #endif\r
123         ldi r_mode,OW_SLEEP\r
124         rjmp handle_end\r
125 \r
126 hrc_set_readscratchpad1:\r
127         ldi r_mode,OW_READ_SCRATCHPAD1\r
128         ldi r_sendflag,1\r
129         CRCInit2\r
130         rjmp h_readscratchpad1\r
131 \r
132 hrc_set_writescratchpad1:\r
133         ldi r_mode,OW_WRITE_SCRATCHPAD1\r
134         ldi r_bytep,2 ;start to write in 2\r
135         rjmp handle_end\r
136 \r
137 hrc_recall_eeprom1:\r
138         rcall hrc_recall_eeprom_func1\r
139         rjmp handle_end\r
140 \r
141 #ifdef _HANDLE_CC_COMMAND_\r
142 hrc_set_convertT12:\r
143         ldi r_temp,3\r
144         sts gcontrol,r_temp\r
145         rjmp hrc_set_convertT12b  //egal ob hrc_set_convertT12b oder hrc_set_convertT22b\r
146 #endif\r
147 \r
148 hrc_set_convertT1:\r
149         ldi r_temp,1\r
150         sts gcontrol,r_temp\r
151 hrc_set_convertT12b:\r
152         ldi r_mode,OW_CONVERT_RUN1\r
153         ldi r_sendflag,3 ;set bit 0 and 1 for no zero polling\r
154 h_convert_run1:\r
155         ldi r_bcount,0\r
156         ldi r_rwbyte,0\r
157         rjmp handle_end_no_bcount       \r
158 \r
159 \r
160 \r
161 hrc_copy_scratchpad1:\r
162         ldi r_bytep,2\r
163         configZ pack1,r_bytep\r
164         clr r_bytep\r
165 hrc_copy_scratchpad_EEPROM_write1:\r
166         sbic _SFR_IO_ADDR(EECR), EEPE   \r
167         rjmp hrc_copy_scratchpad_EEPROM_write1\r
168         ldi r_temp, (0<<EEPM1)|(0<<EEPM0)\r
169         out _SFR_IO_ADDR(EECR), r_temp\r
170         ldi r_temp,0\r
171         out _SFR_IO_ADDR(EEARH),r_temp\r
172         out _SFR_IO_ADDR(EEARL), r_bytep\r
173         ld  r_rwbyte,Z+\r
174         out _SFR_IO_ADDR(EEDR), r_rwbyte\r
175         sbi _SFR_IO_ADDR(EECR), EEMPE\r
176         sbi _SFR_IO_ADDR(EECR), EEPE\r
177         inc r_bytep\r
178         cpi r_bytep,3\r
179         brne hrc_copy_scratchpad_EEPROM_write1\r
180         rjmp handle_end\r
181 \r
182 \r
183 hrc_recall_eeprom_func1:\r
184         ldi r_bytep,2\r
185         configZ pack1,r_bytep\r
186         clr r_bytep\r
187         clr r_temp\r
188 hrc_recall_eeprom_EEPROM_read1:\r
189         sbic _SFR_IO_ADDR(EECR), EEPE\r
190         rjmp hrc_recall_eeprom_EEPROM_read1\r
191         out _SFR_IO_ADDR(EEARH), r_temp\r
192         out _SFR_IO_ADDR(EEARL), r_bytep\r
193         sbi _SFR_IO_ADDR(EECR), EERE\r
194         in r_rwbyte,_SFR_IO_ADDR(EEDR)\r
195         st Z+,r_rwbyte\r
196         inc r_bytep\r
197         cpi r_bytep,3\r
198         brne hrc_recall_eeprom_EEPROM_read1\r
199         ret\r
200 \r
201 \r
202 \r
203 \r
204 \r
205 \r
206 ;---------------------------------------------------\r
207 ;   READ SCRATCHPAD\r
208 ;---------------------------------------------------\r
209 \r
210 h_readscratchpad1:\r
211         cpi  r_bytep,8\r
212         breq h_readscratchpad_crc1\r
213         cpi  r_bytep,9\r
214         breq h_readscratchpad_all1\r
215         configZ pack1,r_bytep\r
216         ld   r_rwbyte,Z\r
217         rjmp h_readscratchpad_endc1\r
218 h_readscratchpad_crc1:\r
219         lds  r_rwbyte,crc\r
220 h_readscratchpad_endc1:\r
221         inc  r_bytep\r
222         ldi  r_bcount,1 \r
223         rjmp handle_end\r
224 h_readscratchpad_all1:\r
225         rjmp handle_end_sleep\r
226 \r
227 \r
228 \r
229 \r
230 \r
231 ;---------------------------------------------------\r
232 ;   WRITE SCRATCHPAD\r
233 ;---------------------------------------------------\r
234 \r
235 h_writescratchpad1:\r
236         configZ pack1,r_bytep\r
237         inc  r_bytep\r
238         cpi  r_bytep,5\r
239         breq h_writescratchpad_all1\r
240         st   Z,r_rwbyte\r
241         rjmp handle_end\r
242 h_writescratchpad_all1:\r
243         ;ori r_rwbyte,0x1F ; Alle unteren Bits sind immer 1 -->VOC use different\r
244         st   Z,r_rwbyte\r
245         rjmp handle_end_sleep\r
246 \r
247 ;*****************************************************************************************************************************************************************************************\r
248 ;*****************************************************************************************************************************************************************************************\r
249 ;*****************************************************************************************************************************************************************************************\r
250 ;*****************************************************************************************************************************************************************************************\r
251 ;*****************************************************************************************************************************************************************************************\r
252 \r
253 \r
254 \r
255 h_readcommand2:\r
256         clr r_bytep\r
257 #ifndef _DIS_FLASH_\r
258         FLASH_COMMANDS ; muss zu erst sein....\r
259 #endif\r
260         cjmp 0xBE,hrc_set_readscratchpad2\r
261         cjmp 0x4E,hrc_set_writescratchpad2\r
262         cjmp 0x44,hrc_set_convertT2\r
263         cjmp 0x48,hrc_copy_scratchpad2\r
264         cjmp 0xB8,hrc_recall_eeprom2\r
265         FW_CONFIG_INFO2\r
266 #ifdef _CHANGEABLE_ID_\r
267         CHANGE_ID_COMMANDS\r
268 #endif\r
269         ldi r_mode,OW_SLEEP\r
270         rjmp handle_end\r
271 \r
272 hrc_set_readscratchpad2:\r
273         ldi r_mode,OW_READ_SCRATCHPAD2\r
274         ldi r_sendflag,1\r
275         CRCInit2\r
276         rjmp h_readscratchpad2\r
277 \r
278 hrc_set_writescratchpad2:\r
279         ldi r_mode,OW_WRITE_SCRATCHPAD2\r
280         ldi r_bytep,2 ;start to write in 2\r
281         rjmp handle_end\r
282 \r
283 hrc_recall_eeprom2:\r
284         rcall hrc_recall_eeprom_func2\r
285         rjmp handle_end\r
286 \r
287 hrc_set_convertT2:\r
288         ldi r_temp,1\r
289         sts gcontrol,r_temp\r
290 hrc_set_convertT22b:\r
291         ldi r_mode,OW_CONVERT_RUN2\r
292         ldi r_sendflag,3 ;set bit 0 and 1 for no zero polling\r
293 h_convert_run2:\r
294         ldi r_bcount,0\r
295         ldi r_rwbyte,0\r
296         rjmp handle_end_no_bcount       \r
297 \r
298 \r
299 \r
300 hrc_copy_scratchpad2:\r
301         ldi r_bytep,2\r
302         configZ pack2,r_bytep\r
303         clr r_bytep\r
304 hrc_copy_scratchpad_EEPROM_write2:\r
305         sbic _SFR_IO_ADDR(EECR), EEPE   \r
306         rjmp hrc_copy_scratchpad_EEPROM_write2\r
307         ldi r_temp, (0<<EEPM1)|(0<<EEPM0)\r
308         out _SFR_IO_ADDR(EECR), r_temp\r
309         ldi r_temp,0\r
310         out _SFR_IO_ADDR(EEARH),r_temp\r
311         out _SFR_IO_ADDR(EEARL), r_bytep\r
312         ld  r_rwbyte,Z+\r
313         out _SFR_IO_ADDR(EEDR), r_rwbyte\r
314         sbi _SFR_IO_ADDR(EECR), EEMPE\r
315         sbi _SFR_IO_ADDR(EECR), EEPE\r
316         inc r_bytep\r
317         cpi r_bytep,3\r
318         brne hrc_copy_scratchpad_EEPROM_write2\r
319         rjmp handle_end\r
320 \r
321 \r
322 hrc_recall_eeprom_func2:\r
323         ldi r_bytep,2\r
324         configZ pack2,r_bytep\r
325         //clr r_bytep\r
326         ldi r_bytep,8\r
327         clr r_temp\r
328 hrc_recall_eeprom_EEPROM_read2:\r
329         sbic _SFR_IO_ADDR(EECR), EEPE\r
330         rjmp hrc_recall_eeprom_EEPROM_read2\r
331         out _SFR_IO_ADDR(EEARH), r_temp\r
332         out _SFR_IO_ADDR(EEARL), r_bytep\r
333         sbi _SFR_IO_ADDR(EECR), EERE\r
334         in r_rwbyte,_SFR_IO_ADDR(EEDR)\r
335         st Z+,r_rwbyte\r
336         inc r_bytep\r
337         cpi r_bytep,3\r
338         brne hrc_recall_eeprom_EEPROM_read2\r
339         ret\r
340 \r
341 \r
342 \r
343 \r
344 \r
345 \r
346 ;---------------------------------------------------\r
347 ;   READ SCRATCHPAD\r
348 ;---------------------------------------------------\r
349 \r
350 h_readscratchpad2:\r
351         cpi  r_bytep,8\r
352         breq h_readscratchpad_crc2\r
353         cpi  r_bytep,9\r
354         breq h_readscratchpad_all2\r
355         configZ pack2,r_bytep\r
356         ld   r_rwbyte,Z\r
357         rjmp h_readscratchpad_endc2\r
358 h_readscratchpad_crc2:\r
359         lds  r_rwbyte,crc\r
360 h_readscratchpad_endc2:\r
361         inc  r_bytep\r
362         ldi  r_bcount,1 \r
363         rjmp handle_end\r
364 h_readscratchpad_all2:\r
365         rjmp handle_end_sleep\r
366 \r
367 \r
368 \r
369 \r
370 \r
371 ;---------------------------------------------------\r
372 ;   WRITE SCRATCHPAD\r
373 ;---------------------------------------------------\r
374 \r
375 h_writescratchpad2:\r
376         configZ pack2,r_bytep\r
377         inc  r_bytep\r
378         cpi  r_bytep,5\r
379         breq h_writescratchpad_all2\r
380         st   Z,r_rwbyte\r
381         rjmp handle_end\r
382 h_writescratchpad_all2:\r
383         ;ori r_rwbyte,0x1F ; Alle unteren Bits sind immer 1 -->VOC use different\r
384         st   Z,r_rwbyte\r
385         rjmp handle_end_sleep\r
386 \r
387 \r
388 \r
389 \r
390 \r
391 #include "../common/OWPinInterrupt.s"\r
392 .end\r