Many changes from 2018
[owSlave2.git] / DS2450_SGP30 / OWDS2450.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  __4MHZ__\r
37 \r
38 \r
39 \r
40 #include "../common/OWConfig.s"\r
41 #include "../common/OWCRC16.s"\r
42 \r
43 .extern pack,8\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 \r
49 \r
50 .macro CHIP_INIT        \r
51 .endm\r
52 \r
53 .macro COMMAND_TABLE\r
54                 rjmp h_readmemoryaddr\r
55                 rjmp h_readmemory\r
56                 rjmp h_readmemorycrc1\r
57                 rjmp h_readmemorycrc2\r
58                 rjmp h_writememoryaddr\r
59                 rjmp h_writememory\r
60                 rjmp h_writememorycrc1\r
61                 rjmp h_writememorycrc2\r
62                 rjmp h_writememoryreadback\r
63                 rjmp h_convert\r
64                 rjmp h_convertcrc1\r
65                 rjmp h_convertcrc2\r
66                 rjmp h_convert_conv\r
67 .endm\r
68 \r
69 #include "../common/OWRomFunctions.s"\r
70 #include "../common/OWTimerInterrupt.s"\r
71 \r
72 \r
73 \r
74 ; Ab hier Geraeteabhaenging\r
75 #define OW_READ_MEMORY_ADDR OW_FIRST_COMMAND+0\r
76 #define OW_READ_MEMORY OW_FIRST_COMMAND+1\r
77 #define OW_READ_MEMORY_CRC1 OW_FIRST_COMMAND+2\r
78 #define OW_READ_MEMORY_CRC2 OW_FIRST_COMMAND+3\r
79 #define OW_WRITE_MEMORY_ADDR OW_FIRST_COMMAND+4\r
80 #define OW_WRITE_MEMORY OW_FIRST_COMMAND+5\r
81 #define OW_WRITE_MEMORY_CRC1 OW_FIRST_COMMAND+6\r
82 #define OW_WRITE_MEMORY_CRC2 OW_FIRST_COMMAND+7\r
83 #define OW_WRITE_MEMORY_READBACK OW_FIRST_COMMAND+8\r
84 #define OW_CONVERT OW_FIRST_COMMAND+9\r
85 #define OW_CONVERT_CRC1 OW_FIRST_COMMAND+10\r
86 #define OW_CONVERT_CRC2 OW_FIRST_COMMAND+11\r
87 #define OW_CONVERT_CONV OW_FIRST_COMMAND+12\r
88 \r
89 ;---------------------------------------------------\r
90 ;       READ COMMAND and start operation\r
91 ;---------------------------------------------------\r
92 \r
93 \r
94 h_readcommand:\r
95         clr r_bytep\r
96 #ifndef _DIS_FLASH_\r
97         FLASH_COMMANDS ; muss zu erst sein....\r
98 #endif\r
99         cset 0xAA,OW_READ_MEMORY_ADDR\r
100         cset 0x55,OW_WRITE_MEMORY_ADDR\r
101         cset 0x3C,OW_CONVERT\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_readmemoryaddr:\r
111         cpi r_bytep,0  ;erstes Adressbyte ?\r
112         brne h_readmemory_addr_byte1 ;nein dann weiter\r
113         andi r_rwbyte,0x1F  ; nur Adressen zwischen 0 und 0x1F zulassen\r
114         sts addr,r_rwbyte  ;speichern des ersten bytes\r
115         rjmp handle_end_inc\r
116 h_readmemory_addr_byte1:  ;zweiters Addressbyte wird nicht gespeichert!\r
117         ldi r_mode,OW_READ_MEMORY ;weiter zu read Memory\r
118         ;;ldi r_bcount,1 ;ist unten\r
119         ldi r_sendflag,1 ;jetzt sendet der Slave zum Master\r
120         clr r_bytep\r
121         rjmp h_readmemory2\r
122 h_readmemory:\r
123         lds r_bytep,addr\r
124         inc r_bytep\r
125         sts addr,r_bytep\r
126         andi r_bytep,0x07\r
127         breq h_readmemory_init_crc\r
128 h_readmemory2:\r
129         lds r_bytep,addr\r
130         ;andi r_bytep,0x1F ist oben\r
131         configZ pack,r_bytep\r
132         ld   r_rwbyte,Z\r
133         ;ldi r_bcount,1\r
134         rjmp handle_end ;sendet das Byte und geht zu h_readmemory\r
135 h_readmemory_init_crc:; init erstes CRC byte\r
136         lds r_rwbyte,crc\r
137         com r_rwbyte\r
138         lds r_temp,crc+1\r
139         com r_temp\r
140         sts crcsave,r_temp\r
141         ldi r_mode,OW_READ_MEMORY_CRC1\r
142         ;ldi r_bcount,1\r
143         rjmp handle_end\r
144 h_readmemory_end:\r
145         ldi  r_mode,OW_SLEEP\r
146         clr r_sendflag\r
147         rjmp handle_end\r
148 h_readmemorycrc1:;init zweites CRC Byte\r
149         lds r_rwbyte,crcsave\r
150         ;ldi r_bcount,1\r
151         ldi r_mode,OW_READ_MEMORY_CRC2\r
152         rjmp handle_end\r
153 h_readmemorycrc2:;weiteres senden..... nach zweitem Byte\r
154         lds r_temp,addr\r
155         andi r_temp,0xE0\r
156         brne h_readmemory_end; ende des speichers\r
157         ldi r_mode,OW_READ_MEMORY\r
158         CRCInit1 ;Start with new CRC\r
159         rjmp h_readmemory2\r
160 \r
161 h_writememoryaddr:\r
162         cpi r_bytep,0  ;erstes Adressbyte ?\r
163         brne h_writememory_addr_byte1 ;nein dann weiter\r
164         andi r_rwbyte,0x1F  ; nur Adressen zwischen 0 und 0x1F zulassen\r
165         sts addr,r_rwbyte  ;speichern des ersten bytes\r
166         inc r_bytep\r
167         ;ldi r_bcount,1\r
168         rjmp handle_end\r
169 h_writememory_addr_byte1:  ;zweiters Addressbyte wird nicht gespeichert!\r
170         ldi r_mode,OW_WRITE_MEMORY ;weiter zu read Memory\r
171         ;ldi r_bcount,1 ;; _________________________________________________in handle_end integrieren.....\r
172         lds r_bytep,addr\r
173         rjmp handle_end ;read Memory Byte\r
174 h_writememory:\r
175         lds r_bytep,addr\r
176         configZ pack,r_bytep\r
177         st Z,r_rwbyte\r
178         ;ldi r_bcount,1\r
179         ldi r_mode,OW_WRITE_MEMORY_CRC1\r
180         ldi r_sendflag,1 ;jetzt sendet der Slave zum Master\r
181         lds r_rwbyte,crc\r
182         com r_rwbyte\r
183         lds r_temp,crc+1\r
184         com r_temp\r
185         sts crcsave,r_temp\r
186         rjmp handle_end\r
187 h_writememorycrc1:\r
188         lds r_rwbyte,crcsave\r
189         ;ldi r_bcount,1\r
190         ldi r_mode,OW_WRITE_MEMORY_CRC2\r
191         rjmp handle_end\r
192 h_writememorycrc2:\r
193         lds r_temp,addr\r
194         configZ pack,r_temp\r
195         ld r_rwbyte,Z\r
196         ;ldi r_bcount,1\r
197         ldi r_mode,OW_WRITE_MEMORY_READBACK\r
198         rjmp handle_end\r
199 h_writememoryreadback:\r
200         ldi r_temp,0x00\r
201         sts crc+1,r_temp\r
202         lds r_temp,addr\r
203         inc r_temp\r
204         sts addr,r_temp\r
205         sts crc,r_temp\r
206         ldi r_sendflag,0\r
207         ;ldi r_bcount,1\r
208         ldi r_mode,OW_WRITE_MEMORY\r
209         rjmp handle_end\r
210 \r
211 h_convert:\r
212         cpi r_bytep,0  ;erstes Adressbyte ?\r
213         brne h_convert_byte1 ;nein dann weiter\r
214         inc r_bytep\r
215         sts pack+0x20,r_rwbyte\r
216         ;ldi r_bcount,1\r
217         rjmp handle_end\r
218 h_convert_byte1: ;zweies byte glesen go crc#\r
219         sts pack+0x21,r_rwbyte\r
220         lds r_rwbyte,crc\r
221         com r_rwbyte\r
222         lds r_temp,crc+1\r
223         com r_temp\r
224         sts crcsave,r_temp\r
225         ldi r_mode,OW_CONVERT_CRC1\r
226         ;ldi r_bcount,1\r
227         ldi r_sendflag,1\r
228         rjmp handle_end \r
229 h_convertcrc1:\r
230         lds r_rwbyte,crcsave\r
231         ;ldi r_bcount,1\r
232         ldi r_mode,OW_CONVERT_CRC2\r
233         rjmp handle_end\r
234 h_convertcrc2:\r
235         ldi r_temp,1\r
236         sts gcontrol,r_temp\r
237         ;ldi r_bcount,1\r
238         ldi r_mode,OW_CONVERT_CONV\r
239         ;clr r_sendflag\r
240         ldi r_sendflag,3 ;set bit 0 and 1 for no zero polling\r
241 h_convert_conv:\r
242         ldi r_bcount,0\r
243         ldi r_rwbyte,0\r
244         rjmp handle_end_no_bcount       \r
245 \r
246 \r
247 \r
248 \r
249 #include "../common/OWPinInterrupt.s"\r
250 .end