Many changes from 2018
[owSlave2.git] / common / OWDS2450_DS2450.S
1 \r
2 // Copyright (c) 2018, 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 \r
37 #include "../common/OWConfig.s"\r
38 #include "../common/OWCRC16.s"\r
39 \r
40 .extern pack1,20\r
41 .extern pack2,20\r
42 \r
43 //Bleiben gleich denn es werden nicht beide gleichzeitig abgefragt\r
44 .comm addr,1 ;zweites Adressbyte ist unnoetig (Warum auch immer fuer 32 Byte 16 Bit Adressen verwendet werden....)\r
45 .comm crcsave,1 ; zwischenspeicherspeicher fuer crc nur zweites byte....\r
46 //.extern  am2302_temp,2\r
47 \r
48 .comm gcontrol1,1\r
49 .comm gcontrol2,1\r
50 \r
51 .macro CHIP_INIT        \r
52 .endm\r
53 \r
54 .macro COMMAND_TABLE\r
55                 rjmp h_readmemoryaddr1\r
56                 rjmp h_readmemory1\r
57                 rjmp h_readmemorycrc11\r
58                 rjmp h_readmemorycrc21\r
59                 rjmp h_writememoryaddr1\r
60                 rjmp h_writememory1\r
61                 rjmp h_writememorycrc11\r
62                 rjmp h_writememorycrc21\r
63                 rjmp h_writememoryreadback1\r
64                 rjmp h_convert1\r
65                 rjmp h_convertcrc11\r
66                 rjmp h_convertcrc21\r
67                 rjmp h_convert_conv1\r
68 \r
69                 rjmp h_readmemoryaddr2\r
70                 rjmp h_readmemory2\r
71                 rjmp h_readmemorycrc12\r
72                 rjmp h_readmemorycrc22\r
73                 rjmp h_writememoryaddr2\r
74                 rjmp h_writememory2\r
75                 rjmp h_writememorycrc12\r
76                 rjmp h_writememorycrc22\r
77                 rjmp h_writememoryreadback2\r
78                 rjmp h_convert2\r
79                 rjmp h_convertcrc12\r
80                 rjmp h_convertcrc22\r
81                 rjmp h_convert_conv2\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_MEMORY_ADDR1 OW_FIRST_COMMAND+0\r
91 #define OW_READ_MEMORY1 OW_FIRST_COMMAND+1\r
92 #define OW_READ_MEMORY_CRC11 OW_FIRST_COMMAND+2\r
93 #define OW_READ_MEMORY_CRC21 OW_FIRST_COMMAND+3\r
94 #define OW_WRITE_MEMORY_ADDR1 OW_FIRST_COMMAND+4\r
95 #define OW_WRITE_MEMORY1 OW_FIRST_COMMAND+5\r
96 #define OW_WRITE_MEMORY_CRC11 OW_FIRST_COMMAND+6\r
97 #define OW_WRITE_MEMORY_CRC21 OW_FIRST_COMMAND+7\r
98 #define OW_WRITE_MEMORY_READBACK1 OW_FIRST_COMMAND+8\r
99 #define OW_CONVERT1 OW_FIRST_COMMAND+9\r
100 #define OW_CONVERT_CRC11 OW_FIRST_COMMAND+10\r
101 #define OW_CONVERT_CRC21 OW_FIRST_COMMAND+11\r
102 #define OW_CONVERT_CONV1 OW_FIRST_COMMAND+12\r
103 \r
104 #define OW_READ_MEMORY_ADDR2 OW_FIRST_COMMAND+13\r
105 #define OW_READ_MEMORY2 OW_FIRST_COMMAND+14\r
106 #define OW_READ_MEMORY_CRC12 OW_FIRST_COMMAND+15\r
107 #define OW_READ_MEMORY_CRC22 OW_FIRST_COMMAND+16\r
108 #define OW_WRITE_MEMORY_ADDR2 OW_FIRST_COMMAND+17\r
109 #define OW_WRITE_MEMORY2 OW_FIRST_COMMAND+18\r
110 #define OW_WRITE_MEMORY_CRC12 OW_FIRST_COMMAND+19\r
111 #define OW_WRITE_MEMORY_CRC22 OW_FIRST_COMMAND+20\r
112 #define OW_WRITE_MEMORY_READBACK2 OW_FIRST_COMMAND+21\r
113 #define OW_CONVERT2 OW_FIRST_COMMAND+22\r
114 #define OW_CONVERT_CRC12 OW_FIRST_COMMAND+23\r
115 #define OW_CONVERT_CRC22 OW_FIRST_COMMAND+24\r
116 #define OW_CONVERT_CONV2 OW_FIRST_COMMAND+25\r
117 \r
118 \r
119 \r
120 ;---------------------------------------------------\r
121 ;       READ COMMAND and start operation\r
122 ;---------------------------------------------------\r
123 \r
124 \r
125 h_readcommand1:\r
126         clr r_bytep\r
127 #ifndef _DIS_FLASH_\r
128         FLASH_COMMANDS ; muss zu erst sein....\r
129 #endif\r
130         cset 0xAA,OW_READ_MEMORY_ADDR1\r
131         cset 0x55,OW_WRITE_MEMORY_ADDR1\r
132         cset 0x3C,OW_CONVERT1\r
133         FW_CONFIG_INFO1\r
134 #ifdef _CHANGEABLE_ID_\r
135         CHANGE_ID_COMMANDS\r
136 #endif\r
137         ldi r_mode,OW_SLEEP\r
138         rjmp handle_end\r
139 \r
140 \r
141 h_readmemoryaddr1:\r
142         cpi r_bytep,0  ;erstes Adressbyte ?\r
143         brne h_readmemory_addr_byte11 ;nein dann weiter\r
144         andi r_rwbyte,0x1F  ; nur Adressen zwischen 0 und 0x1F zulassen\r
145         sts addr,r_rwbyte  ;speichern des ersten bytes\r
146         rjmp handle_end_inc\r
147 h_readmemory_addr_byte11:  ;zweiters Addressbyte wird nicht gespeichert!\r
148         ldi r_mode,OW_READ_MEMORY1 ;weiter zu read Memory\r
149         ;;ldi r_bcount,1 ;ist unten\r
150         ldi r_sendflag,1 ;jetzt sendet der Slave zum Master\r
151         clr r_bytep\r
152         rjmp h_readmemory21\r
153 h_readmemory1:\r
154         lds r_bytep,addr\r
155         inc r_bytep\r
156         sts addr,r_bytep\r
157         andi r_bytep,0x07\r
158         breq h_readmemory_init_crc1\r
159 h_readmemory21:\r
160         lds r_bytep,addr\r
161         ;andi r_bytep,0x1F ist oben\r
162         configZ pack1,r_bytep\r
163         ld   r_rwbyte,Z\r
164         ;ldi r_bcount,1\r
165         rjmp handle_end ;sendet das Byte und geht zu h_readmemory\r
166 h_readmemory_init_crc1:; init erstes CRC byte\r
167         lds r_rwbyte,crc\r
168         com r_rwbyte\r
169         lds r_temp,crc+1\r
170         com r_temp\r
171         sts crcsave,r_temp\r
172         ldi r_mode,OW_READ_MEMORY_CRC11\r
173         ;ldi r_bcount,1\r
174         rjmp handle_end\r
175 h_readmemory_end1:\r
176         ldi  r_mode,OW_SLEEP\r
177         clr r_sendflag\r
178         rjmp handle_end\r
179 h_readmemorycrc11:;init zweites CRC Byte\r
180         lds r_rwbyte,crcsave\r
181         ;ldi r_bcount,1\r
182         ldi r_mode,OW_READ_MEMORY_CRC21\r
183         rjmp handle_end\r
184 h_readmemorycrc21:;weiteres senden..... nach zweitem Byte\r
185         lds r_temp,addr\r
186         andi r_temp,0xE0\r
187         brne h_readmemory_end1; ende des speichers\r
188         ldi r_mode,OW_READ_MEMORY1\r
189         CRCInit1 ;Start with new CRC\r
190         rjmp h_readmemory21\r
191 \r
192 h_writememoryaddr1:\r
193         cpi r_bytep,0  ;erstes Adressbyte ?\r
194         brne h_writememory_addr_byte11 ;nein dann weiter\r
195         andi r_rwbyte,0x1F  ; nur Adressen zwischen 0 und 0x1F zulassen\r
196         sts addr,r_rwbyte  ;speichern des ersten bytes\r
197         inc r_bytep\r
198         ;ldi r_bcount,1\r
199         rjmp handle_end\r
200 h_writememory_addr_byte11:  ;zweiters Addressbyte wird nicht gespeichert!\r
201         ldi r_mode,OW_WRITE_MEMORY1 ;weiter zu read Memory\r
202         ;ldi r_bcount,1 ;; _________________________________________________in handle_end integrieren.....\r
203         lds r_bytep,addr\r
204         rjmp handle_end ;read Memory Byte\r
205 h_writememory1:\r
206         lds r_bytep,addr\r
207         configZ pack1,r_bytep\r
208         st Z,r_rwbyte\r
209         ;ldi r_bcount,1\r
210         ldi r_mode,OW_WRITE_MEMORY_CRC11\r
211         ldi r_sendflag,1 ;jetzt sendet der Slave zum Master\r
212         lds r_rwbyte,crc\r
213         com r_rwbyte\r
214         lds r_temp,crc+1\r
215         com r_temp\r
216         sts crcsave,r_temp\r
217         rjmp handle_end\r
218 h_writememorycrc11:\r
219         lds r_rwbyte,crcsave\r
220         ;ldi r_bcount,1\r
221         ldi r_mode,OW_WRITE_MEMORY_CRC21\r
222         rjmp handle_end\r
223 h_writememorycrc21:\r
224         lds r_temp,addr\r
225         configZ pack1,r_temp\r
226         ld r_rwbyte,Z\r
227         ;ldi r_bcount,1\r
228         ldi r_mode,OW_WRITE_MEMORY_READBACK1\r
229         rjmp handle_end\r
230 h_writememoryreadback1:\r
231         ldi r_temp,0x00\r
232         sts crc+1,r_temp\r
233         lds r_temp,addr\r
234         inc r_temp\r
235         sts addr,r_temp\r
236         sts crc,r_temp\r
237         ldi r_sendflag,0\r
238         ;ldi r_bcount,1\r
239         ldi r_mode,OW_WRITE_MEMORY1\r
240         rjmp handle_end\r
241 \r
242 h_convert1:\r
243         cpi r_bytep,0  ;erstes Adressbyte ?\r
244         brne h_convert_byte11 ;nein dann weiter\r
245         inc r_bytep\r
246         sts pack1+0x20,r_rwbyte\r
247         ;ldi r_bcount,1\r
248         rjmp handle_end\r
249 h_convert_byte11: ;zweies byte glesen go crc#\r
250         sts pack1+0x21,r_rwbyte\r
251         lds r_rwbyte,crc\r
252         com r_rwbyte\r
253         lds r_temp,crc+1\r
254         com r_temp\r
255         sts crcsave,r_temp\r
256         ldi r_mode,OW_CONVERT_CRC11\r
257         ;ldi r_bcount,1\r
258         ldi r_sendflag,1\r
259         rjmp handle_end \r
260 h_convertcrc11:\r
261         lds r_rwbyte,crcsave\r
262         ;ldi r_bcount,1\r
263         ldi r_mode,OW_CONVERT_CRC21\r
264         rjmp handle_end\r
265 h_convertcrc21:\r
266         ldi r_temp,1\r
267         sts gcontrol1,r_temp\r
268         ;ldi r_bcount,1\r
269         ldi r_mode,OW_CONVERT_CONV1\r
270         ;clr r_sendflag\r
271         ldi r_sendflag,3 ;set bit 0 and 1 for no zero polling\r
272 h_convert_conv1:\r
273         ldi r_bcount,0\r
274         ldi r_rwbyte,0\r
275         rjmp handle_end_no_bcount\r
276 \r
277 /////////////////////////////////////////////////////////////////////\r
278 \r
279 \r
280 ;---------------------------------------------------\r
281 ;       READ COMMAND and start operation\r
282 ;---------------------------------------------------\r
283 \r
284 \r
285 h_readcommand2:\r
286         clr r_bytep\r
287 #ifndef _DIS_FLASH_\r
288         FLASH_COMMANDS ; muss zu erst sein....\r
289 #endif\r
290         cset 0xAA,OW_READ_MEMORY_ADDR2\r
291         cset 0x55,OW_WRITE_MEMORY_ADDR2\r
292         cset 0x3C,OW_CONVERT2\r
293         FW_CONFIG_INFO2\r
294 #ifdef _CHANGEABLE_ID_\r
295         CHANGE_ID_COMMANDS\r
296 #endif\r
297         ldi r_mode,OW_SLEEP\r
298         rjmp handle_end\r
299 \r
300 \r
301 h_readmemoryaddr2:\r
302         cpi r_bytep,0  ;erstes Adressbyte ?\r
303         brne h_readmemory_addr_byte12 ;nein dann weiter\r
304         andi r_rwbyte,0x1F  ; nur Adressen zwischen 0 und 0x1F zulassen\r
305         sts addr,r_rwbyte  ;speichern des ersten bytes\r
306         rjmp handle_end_inc\r
307 h_readmemory_addr_byte12:  ;zweiters Addressbyte wird nicht gespeichert!\r
308         ldi r_mode,OW_READ_MEMORY2 ;weiter zu read Memory\r
309         ;;ldi r_bcount,1 ;ist unten\r
310         ldi r_sendflag,1 ;jetzt sendet der Slave zum Master\r
311         clr r_bytep\r
312         rjmp h_readmemory22\r
313 h_readmemory2:\r
314         lds r_bytep,addr\r
315         inc r_bytep\r
316         sts addr,r_bytep\r
317         andi r_bytep,0x07\r
318         breq h_readmemory_init_crc2\r
319 h_readmemory22:\r
320         lds r_bytep,addr\r
321         ;andi r_bytep,0x1F ist oben\r
322         configZ pack2,r_bytep\r
323         ld   r_rwbyte,Z\r
324         ;ldi r_bcount,1\r
325         rjmp handle_end ;sendet das Byte und geht zu h_readmemory\r
326 h_readmemory_init_crc2:; init erstes CRC byte\r
327         lds r_rwbyte,crc\r
328         com r_rwbyte\r
329         lds r_temp,crc+1\r
330         com r_temp\r
331         sts crcsave,r_temp\r
332         ldi r_mode,OW_READ_MEMORY_CRC12\r
333         ;ldi r_bcount,1\r
334         rjmp handle_end\r
335 h_readmemory_end2:\r
336         ldi  r_mode,OW_SLEEP\r
337         clr r_sendflag\r
338         rjmp handle_end\r
339 h_readmemorycrc12:;init zweites CRC Byte\r
340         lds r_rwbyte,crcsave\r
341         ;ldi r_bcount,1\r
342         ldi r_mode,OW_READ_MEMORY_CRC22\r
343         rjmp handle_end\r
344 h_readmemorycrc22:;weiteres senden..... nach zweitem Byte\r
345         lds r_temp,addr\r
346         andi r_temp,0xE0\r
347         brne h_readmemory_end2; ende des speichers\r
348         ldi r_mode,OW_READ_MEMORY2\r
349         CRCInit1 ;Start with new CRC\r
350         rjmp h_readmemory22\r
351 \r
352 h_writememoryaddr2:\r
353         cpi r_bytep,0  ;erstes Adressbyte ?\r
354         brne h_writememory_addr_byte12 ;nein dann weiter\r
355         andi r_rwbyte,0x1F  ; nur Adressen zwischen 0 und 0x1F zulassen\r
356         sts addr,r_rwbyte  ;speichern des ersten bytes\r
357         inc r_bytep\r
358         ;ldi r_bcount,1\r
359         rjmp handle_end\r
360 h_writememory_addr_byte12:  ;zweiters Addressbyte wird nicht gespeichert!\r
361         ldi r_mode,OW_WRITE_MEMORY2 ;weiter zu read Memory\r
362         ;ldi r_bcount,1 ;; _________________________________________________in handle_end integrieren.....\r
363         lds r_bytep,addr\r
364         rjmp handle_end ;read Memory Byte\r
365 h_writememory2:\r
366         lds r_bytep,addr\r
367         configZ pack2,r_bytep\r
368         st Z,r_rwbyte\r
369         ;ldi r_bcount,1\r
370         ldi r_mode,OW_WRITE_MEMORY_CRC12\r
371         ldi r_sendflag,1 ;jetzt sendet der Slave zum Master\r
372         lds r_rwbyte,crc\r
373         com r_rwbyte\r
374         lds r_temp,crc+1\r
375         com r_temp\r
376         sts crcsave,r_temp\r
377         rjmp handle_end\r
378 h_writememorycrc12:\r
379         lds r_rwbyte,crcsave\r
380         ;ldi r_bcount,1\r
381         ldi r_mode,OW_WRITE_MEMORY_CRC22\r
382         rjmp handle_end\r
383 h_writememorycrc22:\r
384         lds r_temp,addr\r
385         configZ pack2,r_temp\r
386         ld r_rwbyte,Z\r
387         ;ldi r_bcount,1\r
388         ldi r_mode,OW_WRITE_MEMORY_READBACK2\r
389         rjmp handle_end\r
390 h_writememoryreadback2:\r
391         ldi r_temp,0x00\r
392         sts crc+1,r_temp\r
393         lds r_temp,addr\r
394         inc r_temp\r
395         sts addr,r_temp\r
396         sts crc,r_temp\r
397         ldi r_sendflag,0\r
398         ;ldi r_bcount,1\r
399         ldi r_mode,OW_WRITE_MEMORY2\r
400         rjmp handle_end\r
401 \r
402 h_convert2:\r
403         cpi r_bytep,0  ;erstes Adressbyte ?\r
404         brne h_convert_byte12 ;nein dann weiter\r
405         inc r_bytep\r
406         sts pack2+0x20,r_rwbyte\r
407         ;ldi r_bcount,1\r
408         rjmp handle_end\r
409 h_convert_byte12: ;zweies byte glesen go crc#\r
410         sts pack2+0x21,r_rwbyte\r
411         lds r_rwbyte,crc\r
412         com r_rwbyte\r
413         lds r_temp,crc+1\r
414         com r_temp\r
415         sts crcsave,r_temp\r
416         ldi r_mode,OW_CONVERT_CRC12\r
417         ;ldi r_bcount,1\r
418         ldi r_sendflag,1\r
419         rjmp handle_end \r
420 h_convertcrc12:\r
421         lds r_rwbyte,crcsave\r
422         ;ldi r_bcount,1\r
423         ldi r_mode,OW_CONVERT_CRC22\r
424         rjmp handle_end\r
425 h_convertcrc22:\r
426         ldi r_temp,1\r
427         sts gcontrol2,r_temp\r
428         ;ldi r_bcount,1\r
429         ldi r_mode,OW_CONVERT_CONV2\r
430         ;clr r_sendflag\r
431         ldi r_sendflag,3 ;set bit 0 and 1 for no zero polling\r
432 h_convert_conv2:\r
433         ldi r_bcount,0\r
434         ldi r_rwbyte,0\r
435         rjmp handle_end_no_bcount\r
436 \r
437 \r
438 \r
439 #include "../common/OWPinInterrupt.s"\r
440 .end