Many changes from 2018
[owSlave2.git] / common / OWDS2408.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 pack,8\r
41 .comm addr,1 ;zweites Adressbyte ist unnoetig (Warum auch immer fuer 32 Byte 16 Bit Adressen verwendet werden....)\r
42 .comm crcsave,1 ; zwischenspeicherspeicher fuer crc nur zweites byte....\r
43 //.extern  am2302_temp,2\r
44 .comm stat_to_sample,1\r
45 \r
46 \r
47 \r
48 .macro CHIP_INIT        \r
49 .endm\r
50 \r
51 .macro COMMAND_TABLE\r
52                 rjmp h_readpioregaddr\r
53                 rjmp h_readpioreg\r
54                 rjmp h_readpioregcrc1\r
55                 rjmp h_readpioregcrc2\r
56                 rjmp h_readchanel\r
57                 rjmp h_readchanel_crc\r
58                 rjmp h_writechanel\r
59                 rjmp h_writecomchanel\r
60                 rjmp h_writesendaa\r
61                 rjmp h_writesendchanel\r
62                 rjmp h_resetactivity\r
63                 rjmp h_writeregaddr\r
64                 rjmp h_writereg\r
65 .endm\r
66 \r
67 #include "../common/OWRomFunctions.s"\r
68 #include "../common/OWTimerInterrupt.s"\r
69 \r
70 \r
71 \r
72 ; Ab hier Geraeteabhaenging\r
73 #define OW_READ_PIO_REG_ADDR OW_FIRST_COMMAND+0\r
74 #define OW_READ_PIO_REG OW_FIRST_COMMAND+1\r
75 #define OW_READ_PIO_REG_CRC1 OW_FIRST_COMMAND+2\r
76 #define OW_READ_PIO_REG_CRC2 OW_FIRST_COMMAND+3\r
77 #define OW_READ_CHANEL OW_FIRST_COMMAND+4\r
78 #define OW_READ_CHANEL_CRC OW_FIRST_COMMAND+5\r
79 #define OW_WRITE_CHANEL OW_FIRST_COMMAND+6\r
80 #define OW_WRITE_COMCHANEL OW_FIRST_COMMAND+7\r
81 #define OW_WRITE_SENDAA OW_FIRST_COMMAND+8\r
82 #define OW_WRITE_SEND_CHANEL OW_FIRST_COMMAND+9\r
83 #define OW_RESET_ACTIVITY OW_FIRST_COMMAND+10\r
84 #define OW_WRITE_REG_ADDR OW_FIRST_COMMAND+11\r
85 #define OW_WRITE_REG OW_FIRST_COMMAND+12\r
86 \r
87 ;---------------------------------------------------\r
88 ;       READ COMMAND and start operation\r
89 ;---------------------------------------------------\r
90 \r
91 \r
92 h_readcommand:\r
93         clr r_bytep\r
94 #ifndef _DIS_FLASH_\r
95         FLASH_COMMANDS ; muss zu erst sein....\r
96 #endif\r
97         cset 0xF0,OW_READ_PIO_REG_ADDR\r
98         cljmp 0xF5,hrc_readchanel\r
99         cset 0x5A,OW_WRITE_CHANEL\r
100         cljmp 0xC3,hrc_reset_activity\r
101         cset 0xCC,OW_WRITE_REG_ADDR\r
102         FW_CONFIG_INFO\r
103 #ifdef _CHANGEABLE_ID_\r
104         CHANGE_ID_COMMANDS\r
105 #endif\r
106         ldi r_mode,OW_SLEEP\r
107         rjmp handle_end\r
108 \r
109 \r
110 h_readpioregaddr:\r
111         cpi r_bytep,0  ;erstes Adressbyte ?\r
112         brne h_readpioreg_addr_byte1 ;nein dann weiter\r
113         //andi r_rwbyte,0x1F  ; nur Adressen zwischen 0 und 0x1F zulassen\r
114         subi r_rwbyte,0x89  ;beim lesen von 0x88 --> 0xFF inc addr -> 0x00\r
115         sts addr,r_rwbyte  ;speichern des ersten bytes\r
116         rjmp handle_end_inc\r
117 h_readpioreg_addr_byte1:  ;zweiters Addressbyte wird nicht gespeichert!\r
118         ldi r_mode,OW_READ_PIO_REG ;weiter zu read Memory\r
119         ;;ldi r_bcount,1 ;ist unten\r
120         ldi r_sendflag,1 ;jetzt sendet der Slave zum Master\r
121         clr r_bytep\r
122 h_readpioreg:\r
123         lds r_bytep,addr\r
124         inc r_bytep\r
125         sts addr,r_bytep\r
126         cpi r_bytep,0x08\r
127         breq h_readpioreg_init_crc\r
128         brge h_readpioreg_end ; groeser dann nix senden\r
129         configZ pack,r_bytep\r
130         ld   r_rwbyte,Z\r
131         ;ldi r_bcount,1\r
132         rjmp handle_end ;sendet das Byte und geht zu h_readmemory\r
133 h_readpioreg_init_crc:; init erstes CRC byte\r
134         lds r_rwbyte,crc\r
135         com r_rwbyte\r
136         lds r_temp,crc+1\r
137         com r_temp\r
138         sts crcsave,r_temp\r
139         ldi r_mode,OW_READ_PIO_REG_CRC1\r
140         ;ldi r_bcount,1\r
141         rjmp handle_end\r
142 h_readpioreg_end:\r
143         ldi  r_mode,OW_SLEEP\r
144         clr r_sendflag\r
145         rjmp handle_end\r
146 h_readpioregcrc1:;init zweites CRC Byte\r
147         lds r_rwbyte,crcsave\r
148         ;ldi r_bcount,1\r
149         ldi r_mode,OW_READ_PIO_REG_CRC2\r
150         rjmp handle_end\r
151 h_readpioregcrc2: ; 2. CRC Byte gesendet\r
152         rjmp h_readpioreg_end\r
153 \r
154 \r
155 hrc_readchanel:\r
156         ldi r_sendflag,1 ;jetzt sendet der Slave zum Master\r
157         ldi r_mode,OW_READ_CHANEL\r
158         ldi r_temp,8\r
159         sts gcontrol,r_temp\r
160         rjmp h_readchanel1\r
161 h_readchanel:\r
162         ldi r_temp,4\r
163         sts gcontrol,r_temp\r
164 h_readchanel1:\r
165         cpi r_bytep,31\r
166         brge h_readchanelcrc1\r
167         lds r_rwbyte,stat_to_sample\r
168         sts pack,r_rwbyte //sample \r
169         rjmp handle_end_inc\r
170 h_readchanelcrc1:\r
171         lds r_rwbyte,crc\r
172         com r_rwbyte\r
173         lds r_temp,crc+1\r
174         com r_temp\r
175         sts crcsave,r_temp\r
176         ldi r_mode,OW_READ_CHANEL_CRC\r
177         ;ldi r_bcount,1\r
178         rjmp handle_end\r
179 h_readchanel_crc:\r
180         clr r_bytep\r
181         ldi r_mode,OW_READ_CHANEL\r
182         lds r_rwbyte,crcsave\r
183         rjmp handle_end\r
184         \r
185 h_writechanel:\r
186         sts crcsave,r_rwbyte\r
187         ldi r_mode,OW_WRITE_COMCHANEL\r
188         rjmp handle_end\r
189 h_writecomchanel:\r
190         com r_rwbyte\r
191         lds r_temp,crcsave\r
192         cp r_rwbyte,r_temp\r
193         breq h_writeok\r
194         rjmp handle_end_sleep\r
195 h_writeok:\r
196         sts pack+1,r_rwbyte\r
197         ldi r_temp2,1\r
198         sts gcontrol,r_temp2\r
199         clr r_sendflag\r
200         ldi r_rwbyte,0xAA\r
201         ldi r_mode,OW_WRITE_SENDAA\r
202         ldi r_sendflag,1 ;jetzt sendet der Slave zum Master\r
203         rjmp handle_end\r
204 h_writesendaa:\r
205         lds r_rwbyte,pack\r
206         ldi r_mode,OW_WRITE_SEND_CHANEL\r
207         rjmp handle_end\r
208 h_writesendchanel:\r
209         rjmp handle_end_sleep\r
210 \r
211 \r
212 \r
213 hrc_reset_activity:\r
214         ldi r_temp,2\r
215         sts gcontrol,r_temp\r
216         ldi r_rwbyte,0xAA\r
217         ldi r_mode,OW_RESET_ACTIVITY\r
218         ldi r_sendflag,1 ;jetzt sendet der Slave zum Master\r
219         rjmp handle_end\r
220 h_resetactivity:\r
221         rjmp handle_end_sleep\r
222 \r
223 \r
224 h_writeregaddr:\r
225         cpi r_bytep,0  ;erstes Adressbyte ?\r
226         brne h_writeregddr_byte1 ;nein dann weiter\r
227         //andi r_rwbyte,0x1F  ; nur Adressen zwischen 0 und 0x1F zulassen\r
228         subi r_rwbyte,0x8B  \r
229         brmi h_writereg_end\r
230         sts addr,r_rwbyte  ;speichern des ersten bytes\r
231         rjmp handle_end_inc\r
232 h_writeregddr_byte1:  ;zweiters Addressbyte wird nicht gespeichert!\r
233         ldi r_mode,OW_WRITE_REG ;weiter zu write Memory\r
234         ;;ldi r_bcount,1 ;ist unten\r
235         clr r_bytep\r
236         rjmp handle_end\r
237 h_writereg:\r
238         lds r_temp,addr\r
239         configZ pack+3,r_temp\r
240         st Z,r_rwbyte\r
241         cpi r_temp,5\r
242         brge h_writereg_end     \r
243         inc r_temp\r
244         sts addr,r_temp\r
245         rjmp handle_end_sleep\r
246                 \r
247 h_writereg_end:\r
248         rjmp handle_end_sleep\r
249 \r
250 \r
251 \r
252 \r
253 \r
254 #include "../common/OWPinInterrupt.s"\r
255 .end