Many changes from 2018
[owSlave2.git] / DS2450_ADC / 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 //#define _DB_\r
38 #include "../common/OWConfig.s"\r
39 #include "../common/OWCRC16.s"\r
40 \r
41 .extern pack,8\r
42 .comm addr,1 ;zweites Adressbyte ist unnoetig (Warum auch immer fuer 32 Byte 16 Bit Adressen verwendet werden....)\r
43 .comm crcsave,1 ; zwischenspeicherspeicher fuer crc nur zweites byte....\r
44 //.extern  am2302_temp,2\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_readmemoryaddr\r
53                 rjmp h_readmemory\r
54                 rjmp h_readmemorycrc1\r
55                 rjmp h_readmemorycrc2\r
56                 rjmp h_writememoryaddr\r
57                 rjmp h_writememory\r
58                 rjmp h_writememorycrc1\r
59                 rjmp h_writememorycrc2\r
60                 rjmp h_writememoryreadback\r
61                 rjmp h_convert\r
62                 rjmp h_convertcrc1\r
63                 rjmp h_convertcrc2\r
64                 rjmp h_convert_conv\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_MEMORY_ADDR OW_FIRST_COMMAND+0\r
74 #define OW_READ_MEMORY OW_FIRST_COMMAND+1\r
75 #define OW_READ_MEMORY_CRC1 OW_FIRST_COMMAND+2\r
76 #define OW_READ_MEMORY_CRC2 OW_FIRST_COMMAND+3\r
77 #define OW_WRITE_MEMORY_ADDR OW_FIRST_COMMAND+4\r
78 #define OW_WRITE_MEMORY OW_FIRST_COMMAND+5\r
79 #define OW_WRITE_MEMORY_CRC1 OW_FIRST_COMMAND+6\r
80 #define OW_WRITE_MEMORY_CRC2 OW_FIRST_COMMAND+7\r
81 #define OW_WRITE_MEMORY_READBACK OW_FIRST_COMMAND+8\r
82 #define OW_CONVERT OW_FIRST_COMMAND+9\r
83 #define OW_CONVERT_CRC1 OW_FIRST_COMMAND+10\r
84 #define OW_CONVERT_CRC2 OW_FIRST_COMMAND+11\r
85 #define OW_CONVERT_CONV 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 0xAA,OW_READ_MEMORY_ADDR\r
98         cset 0x55,OW_WRITE_MEMORY_ADDR\r
99         cset 0x3C,OW_CONVERT\r
100         FW_CONFIG_INFO\r
101 #ifdef _CHANGEABLE_ID_\r
102         CHANGE_ID_COMMANDS\r
103 #endif\r
104         ldi r_mode,OW_SLEEP\r
105         rjmp handle_end\r
106 \r
107 \r
108 h_readmemoryaddr:\r
109         cpi r_bytep,0  ;erstes Adressbyte ?\r
110         brne h_readmemory_addr_byte1 ;nein dann weiter\r
111         andi r_rwbyte,0x1F  ; nur Adressen zwischen 0 und 0x1F zulassen\r
112         sts addr,r_rwbyte  ;speichern des ersten bytes\r
113         rjmp handle_end_inc\r
114 h_readmemory_addr_byte1:  ;zweiters Addressbyte wird nicht gespeichert!\r
115         ldi r_mode,OW_READ_MEMORY ;weiter zu read Memory\r
116         ;;ldi r_bcount,1 ;ist unten\r
117         ldi r_sendflag,1 ;jetzt sendet der Slave zum Master\r
118         clr r_bytep\r
119         rjmp h_readmemory2\r
120 h_readmemory:\r
121         lds r_bytep,addr\r
122         inc r_bytep\r
123         sts addr,r_bytep\r
124         andi r_bytep,0x07\r
125         breq h_readmemory_init_crc\r
126 h_readmemory2:\r
127         lds r_bytep,addr\r
128         ;andi r_bytep,0x1F ist oben\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_readmemory_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_MEMORY_CRC1\r
140         ;ldi r_bcount,1\r
141         rjmp handle_end\r
142 h_readmemory_end:\r
143         //ldi  r_mode,OW_SLEEP\r
144         //clr r_sendflag\r
145         rjmp handle_end_sleep\r
146 h_readmemorycrc1:;init zweites CRC Byte\r
147         lds r_rwbyte,crcsave\r
148         ;ldi r_bcount,1\r
149         ldi r_mode,OW_READ_MEMORY_CRC2\r
150         rjmp handle_end\r
151 h_readmemorycrc2:;weiteres senden..... nach zweitem Byte\r
152         lds r_temp,addr\r
153         andi r_temp,0xE0\r
154         brne h_readmemory_end; ende des speichers\r
155         ldi r_mode,OW_READ_MEMORY\r
156         CRCInit1 ;Start with new CRC\r
157         rjmp h_readmemory2\r
158 \r
159 h_writememoryaddr:\r
160         cpi r_bytep,0  ;erstes Adressbyte ?\r
161         brne h_writememory_addr_byte1 ;nein dann weiter\r
162         andi r_rwbyte,0x1F  ; nur Adressen zwischen 0 und 0x1F zulassen\r
163         sts addr,r_rwbyte  ;speichern des ersten bytes\r
164         inc r_bytep\r
165         ;ldi r_bcount,1\r
166         rjmp handle_end\r
167 h_writememory_addr_byte1:  ;zweiters Addressbyte wird nicht gespeichert!\r
168         ldi r_mode,OW_WRITE_MEMORY ;weiter zu read Memory\r
169         ;ldi r_bcount,1 ;; _________________________________________________in handle_end integrieren.....\r
170         lds r_bytep,addr\r
171         rjmp handle_end ;read Memory Byte\r
172 h_writememory:\r
173         lds r_bytep,addr\r
174         configZ pack,r_bytep\r
175         st Z,r_rwbyte\r
176         ;ldi r_bcount,1\r
177         ldi r_mode,OW_WRITE_MEMORY_CRC1\r
178         ldi r_sendflag,1 ;jetzt sendet der Slave zum Master\r
179         lds r_rwbyte,crc\r
180         com r_rwbyte\r
181         lds r_temp,crc+1\r
182         com r_temp\r
183         sts crcsave,r_temp\r
184         rjmp handle_end\r
185 h_writememorycrc1:\r
186         lds r_rwbyte,crcsave\r
187         ;ldi r_bcount,1\r
188         ldi r_mode,OW_WRITE_MEMORY_CRC2\r
189         rjmp handle_end\r
190 h_writememorycrc2:\r
191         lds r_temp,addr\r
192         configZ pack,r_temp\r
193         ld r_rwbyte,Z\r
194         ;ldi r_bcount,1\r
195         ldi r_mode,OW_WRITE_MEMORY_READBACK\r
196         rjmp handle_end\r
197 h_writememoryreadback:\r
198         ldi r_temp,0x00\r
199         sts crc+1,r_temp\r
200         lds r_temp,addr\r
201         inc r_temp\r
202         sts addr,r_temp\r
203         sts crc,r_temp\r
204         ldi r_sendflag,0\r
205         ;ldi r_bcount,1\r
206         ldi r_mode,OW_WRITE_MEMORY\r
207         rjmp handle_end\r
208 \r
209 h_convert:\r
210         cpi r_bytep,0  ;erstes Adressbyte ?\r
211         brne h_convert_byte1 ;nein dann weiter\r
212         inc r_bytep\r
213         sts pack+0x20,r_rwbyte\r
214         ;ldi r_bcount,1\r
215         rjmp handle_end\r
216 h_convert_byte1: ;zweies byte glesen go crc#\r
217         sts pack+0x21,r_rwbyte\r
218         lds r_rwbyte,crc\r
219         com r_rwbyte\r
220         lds r_temp,crc+1\r
221         com r_temp\r
222         sts crcsave,r_temp\r
223         ldi r_mode,OW_CONVERT_CRC1\r
224         ;ldi r_bcount,1\r
225         ldi r_sendflag,1\r
226         rjmp handle_end \r
227 h_convertcrc1:\r
228         lds r_rwbyte,crcsave\r
229         ;ldi r_bcount,1\r
230         ldi r_mode,OW_CONVERT_CRC2\r
231         rjmp handle_end\r
232 h_convertcrc2:\r
233         ldi r_temp,1\r
234         sts gcontrol,r_temp\r
235         ;ldi r_bcount,1\r
236         ldi r_mode,OW_CONVERT_CONV\r
237         ;clr r_sendflag\r
238         ldi r_sendflag,3 ;set bit 0 and 1 for no zero polling\r
239 h_convert_conv:\r
240         ldi r_bcount,0\r
241         ldi r_rwbyte,0\r
242         rjmp handle_end_no_bcount       \r
243 \r
244 \r
245 \r
246 \r
247 #include "../common/OWPinInterrupt.s"\r
248 .end