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