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