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