DS2423 FHEM LEDs
[owSlave2.git] / common / OWDS2423_DS2413.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/OWCRC16.s"\r
41 \r
42 .extern pack1,45\r
43 .extern counters1,16\r
44 \r
45 //.extern pack2,45\r
46 .extern counters2,16\r
47 \r
48 #define pack2 pack1 \r
49 ;same EEPROM for Attiny44 \r
50 .extern pin_state,1\r
51 .extern pin_set,1\r
52 .comm resv1,1\r
53 .macro CHIP_INIT        ;r_temp is pushed other Registers should be saved\r
54 .endm\r
55 \r
56 .macro COMMAND_TABLE\r
57                 rjmp h_writescratchpad1\r
58                 rjmp h_writescratchpad_crc1\r
59                 rjmp h_readscratchpad1\r
60                 rjmp h_copyscratchpad1\r
61                 rjmp h_readmemory_addr1\r
62                 rjmp h_readmemory1\r
63                 rjmp h_readmemorycounter_addr1\r
64                 rjmp h_readmemorycounter1\r
65                 rjmp h_readmemorycounter_ex1\r
66 \r
67                 rjmp h_accessread2\r
68                 rjmp h_accesswrite2\r
69                 rjmp h_accesswrite_read2\r
70 .endm\r
71 \r
72 #include "../common/OWRomFunctionsDual.s"\r
73 #include "../common/OWTimerInterrupt.s"\r
74 \r
75 \r
76 \r
77 ; Ab hier Geraeteabhaenging\r
78 #define OW_WRITE_SCRATCHPAD1 OW_FIRST_COMMAND+0\r
79 #define OW_WRITE_SCRATCHPAD_CRC1 OW_FIRST_COMMAND+1\r
80 #define OW_READ_SCRATCHPAD1 OW_FIRST_COMMAND+2\r
81 #define OW_COPY_SCRATCHPAD1 OW_FIRST_COMMAND+3\r
82 #define OW_READ_MEMORY_ADDR1 OW_FIRST_COMMAND+4\r
83 #define OW_READ_MEMORY1 OW_FIRST_COMMAND+5\r
84 #define OW_READ_MEMORYCOUNTER_ADDR1 OW_FIRST_COMMAND+6\r
85 #define OW_READ_MEMORYCOUNTER1 OW_FIRST_COMMAND+7\r
86 #define OW_READ_MEMORYCOUNTER_EX1 OW_FIRST_COMMAND+8\r
87 \r
88 #define OW_ACCESSREAD2 OW_FIRST_COMMAND+9\r
89 #define OW_ACCESSWRITE2 OW_FIRST_COMMAND+10\r
90 #define OW_ACCESSWRITE_READ2 OW_FIRST_COMMAND+11\r
91 \r
92 \r
93 ;---------------------------------------------------\r
94 ;       READ COMMAND and start operation\r
95 ;---------------------------------------------------\r
96 \r
97 h_readcommand1:\r
98         clr r_bytep\r
99 #ifndef _DIS_FLASH_\r
100         FLASH_COMMANDS ; muss zu erst sein....\r
101 #endif\r
102         cset 0x0F,OW_WRITE_SCRATCHPAD1\r
103         cjmp 0xAA,hrc_set_readscratchpad1\r
104         cset 0x5A,OW_COPY_SCRATCHPAD1\r
105         cset 0xF0,OW_READ_MEMORY_ADDR1\r
106         cset 0xA5,OW_READ_MEMORYCOUNTER_ADDR1\r
107         FW_CONFIG_INFO1\r
108 #ifdef _CHANGEABLE_ID_\r
109         CHANGE_ID_COMMANDS\r
110 #endif\r
111         ldi r_mode,OW_SLEEP\r
112         rjmp handle_end\r
113 \r
114 hrc_set_readscratchpad1:\r
115         ldi r_mode,OW_READ_SCRATCHPAD1\r
116         ldi r_sendflag,1\r
117         rjmp h_readscratchpad1\r
118 \r
119 h_writescratchpad1:\r
120         configZ pack1,r_bytep\r
121         inc  r_bytep\r
122         st   Z,r_rwbyte\r
123         cpi  r_bytep,2\r
124         breq h_writescratchpad_block1\r
125         brsh h_writescratchpad_set_eoffset1 ;;33\r
126         rjmp handle_end  ;handle_end zu weit entfernt fuer br...\r
127 h_writescratchpad_set_eoffset1:\r
128         cpi  r_bytep,35\r
129         breq h_writescratchpad_setcrc1\r
130         mov r_temp,r_bytep\r
131         subi r_temp,4\r
132         sts pack1+2,r_temp ;AA und PF cleared\r
133         rjmp handle_end\r
134 ;Start writeing to 32 Byte Block ; skip status byte     \r
135 h_writescratchpad_block1:\r
136         lds r_temp,pack1 ; Adresse low byte\r
137         andi r_temp,0x1F ;32 byte\r
138         add r_bytep,r_temp ;Zur angegebenen Startadresse springen\r
139         ;ori r_temp,0x20 ; Set PF flag\r
140         sts pack1+2,r_temp  ;E4:E0 vorher setzen\r
141         ; Byte 3 ueberspringen\r
142         rjmp handle_end_inc\r
143 \r
144 h_writescratchpad_setcrc1:\r
145         ;copy crc to pack\r
146         lds r_temp,crc\r
147         com r_temp\r
148         sts pack1+43,r_temp\r
149         lds r_temp,crc+1\r
150         com r_temp ; invertieren , komischer name.....\r
151         sts pack1+44,r_temp\r
152         ldi  r_mode,OW_WRITE_SCRATCHPAD_CRC1\r
153         ldi r_sendflag,1\r
154         ldi r_bytep,43\r
155 h_writescratchpad_crc1:\r
156         cpi r_bytep,45\r
157         breq h_writescratchpad_crc_end1\r
158         configZ pack1,r_bytep\r
159         ld r_rwbyte,Z\r
160         rjmp handle_end_inc\r
161 h_writescratchpad_crc_end1:\r
162         rjmp handle_end_sleep\r
163         \r
164         \r
165 h_readscratchpad1:\r
166         cpi r_bytep,35\r
167         breq h_readscratchpad_end1\r
168         cpi r_bytep,3\r
169         brne h_readscratchpad_read_byte1\r
170 h_readscratchpad_set_offset1:\r
171         lds r_temp,pack1\r
172         andi r_temp,0x1F\r
173         ldi r_temp2,3\r
174         add r_temp,r_temp2\r
175         mov r_bytep,r_temp\r
176 h_readscratchpad_read_byte1:\r
177         configZ pack1,r_bytep\r
178         ld r_rwbyte,Z\r
179         rjmp handle_end_inc\r
180 h_readscratchpad_end1:\r
181         rjmp handle_end_sleep\r
182 \r
183 \r
184 \r
185 h_copyscratchpad1:\r
186         cpi  r_bytep,3\r
187         brsh h_copyscratchpad_ok1\r
188         configZ pack1,r_bytep\r
189         inc  r_bytep\r
190         ld   r_temp,Z\r
191         cp r_temp,r_rwbyte\r
192         brne h_copyscratchpad_nok1\r
193         cpi  r_bytep,3\r
194         breq h_copyscratchpad_ok1\r
195         ldi  r_bcount,1 \r
196         rjmp handle_end\r
197 h_copyscratchpad_ok1:\r
198         ldi r_rwbyte,0xAA\r
199         ldi r_sendflag,1\r
200         rjmp handle_end\r
201 h_copyscratchpad_nok1:\r
202         lds r_temp,pack1+3\r
203         andi r_temp,~0x80\r
204         sts pack1+3,r_temp\r
205         rjmp handle_end_sleep\r
206 \r
207 \r
208 h_readmemory_addr1:\r
209         cpi r_bytep,0\r
210         brne h_readmrmory_addr_byte11\r
211         sts pack1,r_rwbyte\r
212         rjmp handle_end_inc\r
213 h_readmrmory_addr_byte11:\r
214         sts pack1+1,r_rwbyte\r
215         ldi r_mode,OW_READ_MEMORY1\r
216         ldi r_sendflag,1\r
217         clr r_bytep\r
218         rjmp h_readmemory21\r
219 h_readmemory1:\r
220         lds r_bytep,pack1\r
221         lds r_temp2,pack1+1\r
222         inc r_bytep\r
223         clr r_temp\r
224         adc r_temp2,r_temp\r
225         sbrc r_temp2,1\r
226         rjmp h_readmemory_end1\r
227         sts pack1+1,r_temp\r
228         sts pack1,r_bytep\r
229 h_readmemory21:\r
230         lds r_bytep,pack1\r
231         andi r_bytep,0x1F\r
232         configZ pack1+3,r_bytep\r
233         ld   r_rwbyte,Z\r
234         rjmp handle_end\r
235 h_readmemory_end1:\r
236         rjmp handle_end_sleep\r
237 \r
238 \r
239 \r
240 \r
241 \r
242 \r
243 \r
244 \r
245 h_readmemorycounter_addr1:\r
246         cpi r_bytep,0\r
247         brne h_readmrmorycounter_addr_byte11\r
248         sts pack1,r_rwbyte\r
249         inc r_bytep\r
250         ;ldi r_bcount,1\r
251         rjmp handle_end\r
252 h_readmrmorycounter_addr_byte11:\r
253         sts pack1+1,r_rwbyte\r
254         ldi r_mode,OW_READ_MEMORYCOUNTER1\r
255         ;ldi r_bcount,1 \r
256         ldi r_sendflag,1\r
257         clr r_bytep\r
258         rjmp h_readmemorycounter21\r
259 h_readmemorycounter1:\r
260         lds r_bytep,pack1\r
261         lds r_temp2,pack1+1\r
262         ldi r_temp,1  ;inc leider kein c flag\r
263         add r_bytep,r_temp\r
264         clr r_temp\r
265         adc r_temp2,r_temp\r
266         mov r_temp,r_bytep\r
267         andi r_temp,0x1F\r
268         breq h_readmemorycounter_next1\r
269         sts pack1+1,r_temp2\r
270         sts pack1,r_bytep\r
271 h_readmemorycounter21:  ;Lesen von dem worauf die erstenzwei bytes zeigen\r
272         lds r_bytep,pack1\r
273         andi r_bytep,0x1F\r
274         configZ pack1+3,r_bytep\r
275         ld   r_rwbyte,Z\r
276         ;ldi r_bcount,1\r
277         rjmp handle_end\r
278 //h_readmemorycounter_end:\r
279 //      ldi  r_mode,OW_SLEEP\r
280 //      clr r_sendflag\r
281 //      rjmp handle_end\r
282 h_readmemorycounter_next1:  ; rest lesen\r
283         ldi  r_mode,OW_READ_MEMORYCOUNTER_EX1\r
284         ldi r_bytep,34\r
285         lds r_temp2,pack1\r
286         lds r_temp,pack1+1\r
287         lsl r_temp2\r
288         rol r_temp\r
289         cpi r_temp,3\r
290         brne h_readmemorycounter_cFF1\r
291         andi r_temp2,0xC0\r
292         swap r_temp2\r
293 \r
294         ;cpi r_temp,0xE0\r
295 \r
296         configZ counters1,r_temp2\r
297         ld r_temp,Z+\r
298         sts pack1+35,r_temp     \r
299         ld r_temp,Z+\r
300         sts pack1+36,r_temp     \r
301         ld r_temp,Z+\r
302         sts pack1+37,r_temp     \r
303         ld r_temp,Z+\r
304         sts pack1+38,r_temp     \r
305         rjmp h_readmemorycounter_ex1\r
306 h_readmemorycounter_cFF1:\r
307         ldi r_temp,0xFF\r
308         sts pack1+35,r_temp     \r
309         sts pack1+36,r_temp     \r
310         sts pack1+37,r_temp     \r
311         sts pack1+38,r_temp     \r
312 \r
313 h_readmemorycounter_ex1:\r
314         inc r_bytep\r
315         cpi r_bytep,45\r
316         breq h_readmemorycounter_ex_end1\r
317         cpi r_bytep,43\r
318         brne h_readmemorycounter_ex21\r
319         lds r_temp,crc\r
320         com r_temp\r
321         sts pack1+43,r_temp\r
322         lds r_temp,crc+1\r
323         com r_temp\r
324         sts pack1+44,r_temp\r
325 h_readmemorycounter_ex21:\r
326         ;ldi r_bcount,1\r
327         configZ pack1,r_bytep\r
328         ld   r_rwbyte,Z\r
329         rjmp handle_end\r
330 h_readmemorycounter_ex_end1:\r
331         lds r_bytep,pack1\r
332         lds r_temp2,pack1+1\r
333         ldi r_temp,1  ;inc leider kein c flag\r
334         add r_bytep,r_temp\r
335         clr r_temp\r
336         adc r_temp2,r_temp\r
337         sbrc r_temp2,1 ;am ene von allem \r
338         rjmp h_readmemorycounter_ex_sleep1\r
339         CRCInit1\r
340         ldi  r_mode,OW_READ_MEMORYCOUNTER1\r
341         sts pack1+1,r_temp2\r
342         sts pack1,r_bytep\r
343         rjmp h_readmemorycounter21\r
344 h_readmemorycounter_ex_sleep1:\r
345         ldi r_mode,OW_SLEEP\r
346         clr r_sendflag\r
347         rjmp handle_end\r
348 \r
349 \r
350 \r
351 \r
352 ;*****************************************************************************************************************************************************************************************\r
353 ;*****************************************************************************************************************************************************************************************\r
354 ;*****************************************************************************************************************************************************************************************\r
355 ;*****************************************************************************************************************************************************************************************\r
356 ;*****************************************************************************************************************************************************************************************\r
357 \r
358 \r
359 h_readcommand2:\r
360         clr r_bytep\r
361 #ifndef _DIS_FLASH_\r
362         FLASH_COMMANDS ; muss zu erst sein....\r
363 #endif\r
364         cjmp 0xF5,hrc_accessread2\r
365         cset 0x5A,OW_ACCESSWRITE2\r
366 /*      cset 0xBE,OW_READ_SCRATCHPAD_ADR2\r
367         cset 0x4E,OW_WRITE_SCRATCHPAD_ADR2\r
368         cjmp 0x44,hrc_set_convertT2\r
369         cjmp 0xB4,hrc_set_convertV2*/\r
370         FW_CONFIG_INFO2\r
371         //cljmp 0x85,hrc_fw_configinfo2\r
372 #ifdef _CHANGEABLE_ID_\r
373         CHANGE_ID_COMMANDS\r
374 #endif\r
375         rjmp handle_end_sleep\r
376 \r
377 \r
378 hrc_accessread2:\r
379         ldi r_sendflag,1\r
380         ldi r_mode,OW_ACCESSREAD2\r
381 h_accessread2:\r
382         lds r_temp,pin_state\r
383         andi r_temp,0x0F\r
384         mov r_rwbyte,r_temp\r
385         com r_rwbyte\r
386         swap r_rwbyte\r
387         andi r_rwbyte,0xF0\r
388         or r_rwbyte,r_temp\r
389         rjmp handle_end\r
390 \r
391 \r
392 \r
393 \r
394 h_accesswrite_read2:\r
395         rjmp handle_end_sleep\r
396         \r
397 \r
398 \r
399 h_accesswrite2:\r
400         cpi  r_bytep,1\r
401         breq h_accesswrite_compl2\r
402         sts resv1,r_rwbyte\r
403         rjmp handle_end_inc\r
404 h_accesswrite_compl2:\r
405         com r_rwbyte\r
406         lds r_temp,resv1\r
407         cp r_temp,r_rwbyte\r
408         brne h_accesswrite_error2\r
409         sts  pin_set,r_rwbyte\r
410         ldi r_mode,OW_ACCESSWRITE_READ2\r
411         ldi r_rwbyte,0xAA\r
412         ldi r_sendflag,1\r
413         rjmp handle_end_inc\r
414 h_accesswrite_error2:\r
415         rjmp handle_end_sleep\r
416 /*\r
417 ;---------------------------------------------------\r
418 ;   WRITE SCRATCHPAD\r
419 ;---------------------------------------------------\r
420 h_writescratchpad_adr2:\r
421         lsl r_rwbyte\r
422         lsl r_rwbyte\r
423         lsl r_rwbyte\r
424 #if  defined(__AVR_ATtiny25__)\r
425         andi r_rwbyte,0x01 ;nur Page 0 und 1 und das immer wiederholen\r
426 #endif\r
427         sts block,r_rwbyte\r
428         ldi r_mode,OW_WRITE_SCRATCHPAD2\r
429         ldi  r_bcount,1 \r
430         rjmp handle_end \r
431 h_writescratchpad2:\r
432         cpi  r_bytep,8\r
433         breq h_writescratchpad_all2\r
434         lds  r_temp,block\r
435         add  r_temp,r_bytep\r
436         configZ pack2,r_temp\r
437         st   Z,r_rwbyte\r
438         rjmp handle_end_inc\r
439 h_writescratchpad_all2:\r
440         rjmp handle_end_sleep\r
441 \r
442 \r
443 \r
444 \r
445 \r
446 \r
447         */\r
448 \r
449 \r
450 #include "../common/OWPinInterrupt.s"\r
451 .end\r