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