Initial import
[avr_bc100.git] / BaseTinyFirmware / IAR / Debug / List / OWI.lst
1 ###############################################################################\r
2 #                                                                             #\r
3 # IAR Atmel AVR C/C++ Compiler V4.30F/W32               12/Mar/2008  23:01:38 #\r
4 # Copyright 1996-2007 IAR Systems. All rights reserved.                       #\r
5 #                                                                             #\r
6 #    Source file  =  C:\home\kevin\pub\src\bc100_cal\IAR\OWI.c                #\r
7 #    Command line =  C:\home\kevin\pub\src\bc100_cal\IAR\OWI.c --cpu=tiny861  #\r
8 #                    -ms -o C:\home\kevin\pub\src\bc100_cal\IAR\Debug\Obj\    #\r
9 #                    -lC C:\home\kevin\pub\src\bc100_cal\IAR\Debug\List\ -lB  #\r
10 #                    C:\home\kevin\pub\src\bc100_cal\IAR\Debug\List\          #\r
11 #                    --initializers_in_flash -z2 --no_cse --no_inline         #\r
12 #                    --no_code_motion --no_cross_call --no_clustering         #\r
13 #                    --no_tbaa --debug -DENABLE_BIT_DEFINITIONS -e            #\r
14 #                    --require_prototypes -I "C:\Program Files\IAR            #\r
15 #                    Systems\Embedded Workbench 4.0\avr\INC\" -I "C:\Program  #\r
16 #                    Files\IAR Systems\Embedded Workbench 4.0\avr\INC\CLIB\"  #\r
17 #                    --eeprom_size 512                                        #\r
18 #    List file    =  C:\home\kevin\pub\src\bc100_cal\IAR\Debug\List\OWI.lst   #\r
19 #    Object file  =  C:\home\kevin\pub\src\bc100_cal\IAR\Debug\Obj\OWI.r90    #\r
20 #                                                                             #\r
21 #                                                                             #\r
22 ###############################################################################\r
23 \r
24 C:\home\kevin\pub\src\bc100_cal\IAR\OWI.c\r
25       1          /* This file has been prepared for Doxygen automatic documentation generation.*/\r
26       2          /*! \file ********************************************************************\r
27       3           *\r
28       4           * \brief\r
29       5           *      Functions for 1-Wire(R) bus communication\r
30       6           *\r
31       7           *      High level functions for transmission of full bytes on the 1-Wire(R)\r
32       8           *      bus and implementations of ROM commands.\n\r
33       9           *      Polled software only implementation of the basic bit-level signalling\r
34      10           *      in the 1-Wire(R) protocol.\n\r
35      11           *      Includes functions for computing and checking CRC8 & 16 values of data\r
36      12           *      sets, and of 64 bit ROM identifiers.\r
37      13           *      Supported devices:  All AVRs.\r
38      14           *\r
39      15           * \par Application Note:\r
40      16           *      AVR458: Charging Li-Ion Batteries with BC100\n\r
41      17           *      AVR463: Charging NiMH Batteries with BC100\n\r
42      18           *      One-wire protocol based on AVR318 - Dallas 1-Wire(R) master.\r
43      19           *\r
44      20           * \par Documentation:\r
45      21           *      For comprehensive code documentation, supported compilers, compiler\r
46      22           *      settings and supported devices see readme.html\r
47      23           *\r
48      24           * \author\r
49      25           *      Atmel Corporation: http://www.atmel.com \n\r
50      26           *      Support email: avr@atmel.com \n\r
51      27           *      Original author: \n\r
52      28           *\r
53      29           * $Name$\r
54      30           * $Revision: 2299 $\r
55      31           * $RCSfile$\r
56      32           * $URL: http://svn.norway.atmel.com/AppsAVR8/avr458_Charging_Li-Ion_Batteries_with_BC100/tag/20070904_release_1.0/code/IAR/OWI.c $\r
57      33           * $Date: 2007-08-23 12:55:51 +0200 (to, 23 aug 2007) $\n\r
58      34          ****************************************************************************/\r
59      35          \r
60      36          #include <ioavr.h>\r
61 \r
62    \                                 In  segment ABSOLUTE, at 0x3b\r
63    \   <unnamed> volatile __io _A_PORTA\r
64    \                     _A_PORTA:\r
65    \   00000000                      DS 1\r
66 \r
67    \                                 In  segment ABSOLUTE, at 0x3a\r
68    \   <unnamed> volatile __io _A_DDRA\r
69    \                     _A_DDRA:\r
70    \   00000000                      DS 1\r
71 \r
72    \                                 In  segment ABSOLUTE, at 0x39\r
73    \   <unnamed> volatile __io _A_PINA\r
74    \                     _A_PINA:\r
75    \   00000000                      DS 1\r
76      37          #include <inavr.h>\r
77      38          \r
78      39          #include "OWI.h"\r
79      40          \r
80      41          \r
81      42          //******************************************************************************\r
82      43          // Functions\r
83      44          //******************************************************************************\r
84      45          /*! \brief Initialization of the one wire bus(es). (Software only driver)\r
85      46           *  \r
86      47           *  This function initializes the 1-Wire bus(es) by releasing it and\r
87      48           *  waiting until any presence signals are finished.\r
88      49           *\r
89      50           *  \param  pins    A bitmask of the buses to initialize.\r
90      51           */\r
91 \r
92    \                                 In  segment CODE, align 2, keep-with-next\r
93      52          void OWI_Init(unsigned char pins){\r
94    \                     OWI_Init:\r
95      53                 OWI_RELEASE_BUS(pins);\r
96    \   00000000   2F10               MOV     R17, R16\r
97    \   00000002   9510               COM     R17\r
98    \   00000004   B32A               IN      R18, 0x1A\r
99    \   00000006   2321               AND     R18, R17\r
100    \   00000008   BB2A               OUT     0x1A, R18\r
101    \   0000000A   2F10               MOV     R17, R16\r
102    \   0000000C   9510               COM     R17\r
103    \   0000000E   B32B               IN      R18, 0x1B\r
104    \   00000010   2321               AND     R18, R17\r
105    \   00000012   BB2B               OUT     0x1B, R18\r
106      54                 // The first rising edge can be interpreted by a slave as the end of a\r
107      55                 // Reset-pulse. Delay for the required reset recovery time (H) to be \r
108      56                 // sure that the real reset is interpreted correctly.\r
109      57                 __delay_cycles(OWI_DELAY_H_STD_MODE);\r
110    \   00000014   EB2C               LDI     R18, 188\r
111    \   00000016   E033               LDI     R19, 3\r
112    \   00000018   5021               SUBI    R18, 1\r
113    \   0000001A   4030               SBCI    R19, 0\r
114    \   0000001C   F7E9               BRNE    $-4\r
115    \   0000001E   C000               RJMP    $+2\r
116      58          }\r
117    \   00000020   9508               RET\r
118    \   00000022                      REQUIRE _A_PORTA\r
119    \   00000022                      REQUIRE _A_DDRA\r
120      59          \r
121      60          \r
122      61          /*! \brief  Write a '1' bit to the bus(es). (Software only driver)\r
123      62           *\r
124      63           *  Generates the waveform for transmission of a '1' bit on the 1-Wire\r
125      64           *  bus.\r
126      65           *\r
127      66           *  \param  pins    A bitmask of the buses to write to.\r
128      67           */\r
129 \r
130    \                                 In  segment CODE, align 2, keep-with-next\r
131      68          void OWI_WriteBit1(unsigned char pins){\r
132    \                     OWI_WriteBit1:\r
133      69                 unsigned char intState;\r
134      70                 \r
135      71                 // Disable interrupts.\r
136      72                 intState = __save_interrupt();\r
137    \   00000000   B72F               IN      R18, 0x3F\r
138    \   00000002   2F12               MOV     R17, R18\r
139      73                 __disable_interrupt();\r
140    \   00000004   94F8               CLI\r
141      74                 \r
142      75                 // Drive bus low and delay.\r
143      76                 OWI_PULL_BUS_LOW(pins);\r
144    \   00000006   B32A               IN      R18, 0x1A\r
145    \   00000008   2B20               OR      R18, R16\r
146    \   0000000A   BB2A               OUT     0x1A, R18\r
147    \   0000000C   2F20               MOV     R18, R16\r
148    \   0000000E   9520               COM     R18\r
149    \   00000010   B33B               IN      R19, 0x1B\r
150    \   00000012   2332               AND     R19, R18\r
151    \   00000014   BB3B               OUT     0x1B, R19\r
152      77                 __delay_cycles(OWI_DELAY_A_STD_MODE);\r
153    \   00000016   E02B               LDI     R18, 11\r
154    \   00000018   952A               DEC     R18\r
155    \   0000001A   F7F1               BRNE    $-2\r
156    \   0000001C   C000               RJMP    $+2\r
157      78                 \r
158      79                 // Release bus and delay.\r
159      80                 OWI_RELEASE_BUS(pins);\r
160    \   0000001E   2F20               MOV     R18, R16\r
161    \   00000020   9520               COM     R18\r
162    \   00000022   B33A               IN      R19, 0x1A\r
163    \   00000024   2332               AND     R19, R18\r
164    \   00000026   BB3A               OUT     0x1A, R19\r
165    \   00000028   2F20               MOV     R18, R16\r
166    \   0000002A   9520               COM     R18\r
167    \   0000002C   B33B               IN      R19, 0x1B\r
168    \   0000002E   2332               AND     R19, R18\r
169    \   00000030   BB3B               OUT     0x1B, R19\r
170      81                 __delay_cycles(OWI_DELAY_B_STD_MODE);\r
171    \   00000032   EA26               LDI     R18, 166\r
172    \   00000034   952A               DEC     R18\r
173    \   00000036   F7F1               BRNE    $-2\r
174    \   00000038   0000               NOP\r
175      82                 \r
176      83                 // Restore interrupts.\r
177      84                 __restore_interrupt(intState);\r
178    \   0000003A   BF1F               OUT     0x3F, R17\r
179      85          }\r
180    \   0000003C   9508               RET\r
181    \   0000003E                      REQUIRE _A_PORTA\r
182    \   0000003E                      REQUIRE _A_DDRA\r
183      86          \r
184      87          /*! \brief  Write a '0' to the bus(es). (Software only driver)\r
185      88           *\r
186      89           *  Generates the waveform for transmission of a '0' bit on the 1-Wire(R)\r
187      90           *  bus.\r
188      91           *\r
189      92           *  \param  pins    A bitmask of the buses to write to.\r
190      93           */\r
191 \r
192    \                                 In  segment CODE, align 2, keep-with-next\r
193      94          void OWI_WriteBit0(unsigned char pins)\r
194    \                     OWI_WriteBit0:\r
195      95          {\r
196      96                 unsigned char intState;\r
197      97                 \r
198      98                 // Disable interrupts.\r
199      99                 intState = __save_interrupt();\r
200    \   00000000   B72F               IN      R18, 0x3F\r
201    \   00000002   2F12               MOV     R17, R18\r
202     100                 __disable_interrupt();\r
203    \   00000004   94F8               CLI\r
204     101                 \r
205     102                 // Drive bus low and delay.\r
206     103                 OWI_PULL_BUS_LOW(pins);\r
207    \   00000006   B32A               IN      R18, 0x1A\r
208    \   00000008   2B20               OR      R18, R16\r
209    \   0000000A   BB2A               OUT     0x1A, R18\r
210    \   0000000C   2F20               MOV     R18, R16\r
211    \   0000000E   9520               COM     R18\r
212    \   00000010   B33B               IN      R19, 0x1B\r
213    \   00000012   2332               AND     R19, R18\r
214    \   00000014   BB3B               OUT     0x1B, R19\r
215     104                 __delay_cycles(OWI_DELAY_C_STD_MODE);\r
216    \   00000016   E92B               LDI     R18, 155\r
217    \   00000018   952A               DEC     R18\r
218    \   0000001A   F7F1               BRNE    $-2\r
219    \   0000001C   C000               RJMP    $+2\r
220     105                 \r
221     106                 // Release bus and delay.\r
222     107                 OWI_RELEASE_BUS(pins);\r
223    \   0000001E   2F20               MOV     R18, R16\r
224    \   00000020   9520               COM     R18\r
225    \   00000022   B33A               IN      R19, 0x1A\r
226    \   00000024   2332               AND     R19, R18\r
227    \   00000026   BB3A               OUT     0x1A, R19\r
228    \   00000028   2F20               MOV     R18, R16\r
229    \   0000002A   9520               COM     R18\r
230    \   0000002C   B33B               IN      R19, 0x1B\r
231    \   0000002E   2332               AND     R19, R18\r
232    \   00000030   BB3B               OUT     0x1B, R19\r
233     108                 __delay_cycles(OWI_DELAY_D_STD_MODE);\r
234    \   00000032   E126               LDI     R18, 22\r
235    \   00000034   952A               DEC     R18\r
236    \   00000036   F7F1               BRNE    $-2\r
237    \   00000038   0000               NOP\r
238     109                 \r
239     110                 // Restore interrupts.\r
240     111                 __restore_interrupt(intState);\r
241    \   0000003A   BF1F               OUT     0x3F, R17\r
242     112          }\r
243    \   0000003C   9508               RET\r
244    \   0000003E                      REQUIRE _A_PORTA\r
245    \   0000003E                      REQUIRE _A_DDRA\r
246     113          \r
247     114          /*! \brief  Read a bit from the bus(es). (Software only driver)\r
248     115           *\r
249     116           *  Generates the waveform for reception of a bit on the 1-Wire(R) bus(es).\r
250     117           *\r
251     118           *  \param  pins    A bitmask of the bus(es) to read from.\r
252     119           *\r
253     120           *  \return A bitmask of the buses where a '1' was read.\r
254     121           */\r
255 \r
256    \                                 In  segment CODE, align 2, keep-with-next\r
257     122          unsigned char OWI_ReadBit(unsigned char pins)\r
258    \                     OWI_ReadBit:\r
259     123          {\r
260    \   00000000   2F10               MOV     R17, R16\r
261     124                 unsigned char intState;\r
262     125                 unsigned char bitsRead;\r
263     126                 \r
264     127                 // Disable interrupts.\r
265     128                 intState = __save_interrupt();\r
266    \   00000002   B73F               IN      R19, 0x3F\r
267    \   00000004   2F23               MOV     R18, R19\r
268     129                 __disable_interrupt();\r
269    \   00000006   94F8               CLI\r
270     130                 \r
271     131                 // Drive bus low and delay.\r
272     132                 OWI_PULL_BUS_LOW(pins);\r
273    \   00000008   B33A               IN      R19, 0x1A\r
274    \   0000000A   2B31               OR      R19, R17\r
275    \   0000000C   BB3A               OUT     0x1A, R19\r
276    \   0000000E   2F31               MOV     R19, R17\r
277    \   00000010   9530               COM     R19\r
278    \   00000012   B34B               IN      R20, 0x1B\r
279    \   00000014   2343               AND     R20, R19\r
280    \   00000016   BB4B               OUT     0x1B, R20\r
281     133                 __delay_cycles(OWI_DELAY_A_STD_MODE);\r
282    \   00000018   E03B               LDI     R19, 11\r
283    \   0000001A   953A               DEC     R19\r
284    \   0000001C   F7F1               BRNE    $-2\r
285    \   0000001E   C000               RJMP    $+2\r
286     134                 \r
287     135                 // Release bus and delay.\r
288     136                 OWI_RELEASE_BUS(pins);\r
289    \   00000020   2F31               MOV     R19, R17\r
290    \   00000022   9530               COM     R19\r
291    \   00000024   B34A               IN      R20, 0x1A\r
292    \   00000026   2343               AND     R20, R19\r
293    \   00000028   BB4A               OUT     0x1A, R20\r
294    \   0000002A   2F31               MOV     R19, R17\r
295    \   0000002C   9530               COM     R19\r
296    \   0000002E   B34B               IN      R20, 0x1B\r
297    \   00000030   2343               AND     R20, R19\r
298    \   00000032   BB4B               OUT     0x1B, R20\r
299     137                 __delay_cycles(OWI_DELAY_E_STD_MODE);\r
300    \   00000034   E133               LDI     R19, 19\r
301    \   00000036   953A               DEC     R19\r
302    \   00000038   F7F1               BRNE    $-2\r
303    \   0000003A   C000               RJMP    $+2\r
304     138                 \r
305     139                 // Sample bus and delay.\r
306     140                 bitsRead = OWI_PIN & pins;\r
307    \   0000003C   B339               IN      R19, 0x19\r
308    \   0000003E   2331               AND     R19, R17\r
309    \   00000040   2F03               MOV     R16, R19\r
310     141                 __delay_cycles(OWI_DELAY_F_STD_MODE);\r
311    \   00000042   E83E               LDI     R19, 142\r
312    \   00000044   953A               DEC     R19\r
313    \   00000046   F7F1               BRNE    $-2\r
314    \   00000048   0000               NOP\r
315     142                 \r
316     143                 // Restore interrupts.\r
317     144                 __restore_interrupt(intState);\r
318    \   0000004A   BF2F               OUT     0x3F, R18\r
319     145                 \r
320     146                 return bitsRead;\r
321    \   0000004C   9508               RET\r
322    \   0000004E                      REQUIRE _A_PORTA\r
323    \   0000004E                      REQUIRE _A_DDRA\r
324    \   0000004E                      REQUIRE _A_PINA\r
325     147          }\r
326     148          \r
327     149          \r
328     150          /*! \brief  Send a Reset signal and listen for Presence signal. (software\r
329     151           *  only driver)\r
330     152           *\r
331     153           *  Generates the waveform for transmission of a Reset pulse on the \r
332     154           *  1-Wire(R) bus and listens for presence signals.\r
333     155           *\r
334     156           *  \param  pins    A bitmask of the buses to send the Reset signal on.\r
335     157           *\r
336     158           *  \return A bitmask of the buses where a presence signal was detected.\r
337     159           */\r
338 \r
339    \                                 In  segment CODE, align 2, keep-with-next\r
340     160          unsigned char OWI_DetectPresence(unsigned char pins)\r
341    \                     OWI_DetectPresence:\r
342     161          {\r
343    \   00000000   2F10               MOV     R17, R16\r
344     162                 unsigned char intState;\r
345     163                 unsigned char presenceDetected;\r
346     164                 \r
347     165                 // Disable interrupts.\r
348     166                 intState = __save_interrupt();\r
349    \   00000002   B73F               IN      R19, 0x3F\r
350    \   00000004   2F23               MOV     R18, R19\r
351     167                 __disable_interrupt();\r
352    \   00000006   94F8               CLI\r
353     168                 \r
354     169                 // Drive bus low and delay.\r
355     170                 OWI_PULL_BUS_LOW(pins);\r
356    \   00000008   B33A               IN      R19, 0x1A\r
357    \   0000000A   2B31               OR      R19, R17\r
358    \   0000000C   BB3A               OUT     0x1A, R19\r
359    \   0000000E   2F31               MOV     R19, R17\r
360    \   00000010   9530               COM     R19\r
361    \   00000012   B34B               IN      R20, 0x1B\r
362    \   00000014   2343               AND     R20, R19\r
363    \   00000016   BB4B               OUT     0x1B, R20\r
364     171                 __delay_cycles(OWI_DELAY_H_STD_MODE);\r
365    \   00000018   EB4C               LDI     R20, 188\r
366    \   0000001A   E053               LDI     R21, 3\r
367    \   0000001C   5041               SUBI    R20, 1\r
368    \   0000001E   4050               SBCI    R21, 0\r
369    \   00000020   F7E9               BRNE    $-4\r
370    \   00000022   C000               RJMP    $+2\r
371     172                 \r
372     173                 // Release bus and delay.\r
373     174                 OWI_RELEASE_BUS(pins);\r
374    \   00000024   2F31               MOV     R19, R17\r
375    \   00000026   9530               COM     R19\r
376    \   00000028   B34A               IN      R20, 0x1A\r
377    \   0000002A   2343               AND     R20, R19\r
378    \   0000002C   BB4A               OUT     0x1A, R20\r
379    \   0000002E   2F31               MOV     R19, R17\r
380    \   00000030   9530               COM     R19\r
381    \   00000032   B34B               IN      R20, 0x1B\r
382    \   00000034   2343               AND     R20, R19\r
383    \   00000036   BB4B               OUT     0x1B, R20\r
384     175                 __delay_cycles(OWI_DELAY_I_STD_MODE);\r
385    \   00000038   EB36               LDI     R19, 182\r
386    \   0000003A   953A               DEC     R19\r
387    \   0000003C   F7F1               BRNE    $-2\r
388    \   0000003E   0000               NOP\r
389     176                 \r
390     177                 // Sample bus to detect presence signal and delay.\r
391     178                 presenceDetected = ((~OWI_PIN) & pins);\r
392    \   00000040   B339               IN      R19, 0x19\r
393    \   00000042   9530               COM     R19\r
394    \   00000044   2331               AND     R19, R17\r
395    \   00000046   2F03               MOV     R16, R19\r
396     179                 __delay_cycles(OWI_DELAY_J_STD_MODE);\r
397    \   00000048   E340               LDI     R20, 48\r
398    \   0000004A   E053               LDI     R21, 3\r
399    \   0000004C   5041               SUBI    R20, 1\r
400    \   0000004E   4050               SBCI    R21, 0\r
401    \   00000050   F7E9               BRNE    $-4\r
402    \   00000052   C000               RJMP    $+2\r
403     180                 \r
404     181                 // Restore interrupts.\r
405     182                 __restore_interrupt(intState);\r
406    \   00000054   BF2F               OUT     0x3F, R18\r
407     183                 \r
408     184                 return presenceDetected;\r
409    \   00000056   9508               RET\r
410    \   00000058                      REQUIRE _A_PORTA\r
411    \   00000058                      REQUIRE _A_DDRA\r
412    \   00000058                      REQUIRE _A_PINA\r
413     185          }\r
414     186          \r
415     187          \r
416     188          /*! \brief  Sends one byte of data on the 1-Wire(R) bus(es).\r
417     189           *  \r
418     190           *  This function automates the task of sending a complete byte\r
419     191           *  of data on the 1-Wire bus(es).\r
420     192           *\r
421     193           *  \param  data    The data to send on the bus(es).\r
422     194           *  \r
423     195           *  \param  pins    A bitmask of the buses to send the data to.\r
424     196           */\r
425 \r
426    \                                 In  segment CODE, align 2, keep-with-next\r
427     197          void OWI_SendByte(unsigned char data, unsigned char pins)\r
428    \                     OWI_SendByte:\r
429     198          {\r
430    \   00000000   ....               RCALL   ?PROLOGUE4_L09\r
431    \   00000002   2FA0               MOV     R26, R16\r
432    \   00000004   2F91               MOV     R25, R17\r
433     199                 unsigned char temp;\r
434     200                 unsigned char i;\r
435     201                 \r
436     202                 // Do once for each bit\r
437     203                 for (i = 0; i < 8; i++) {\r
438    \   00000006   E080               LDI     R24, 0\r
439    \                     ??OWI_SendByte_0:\r
440    \   00000008   3088               CPI     R24, 8\r
441    \   0000000A   F468               BRCC    ??OWI_SendByte_1\r
442     204                         // Determine if LSB is '0' or '1' and transmit corresponding\r
443     205                         // waveform on the bus.\r
444     206                         temp = data & 0x01;\r
445    \   0000000C   2F0A               MOV     R16, R26\r
446    \   0000000E   7001               ANDI    R16, 0x01\r
447    \   00000010   2FB0               MOV     R27, R16\r
448     207                         \r
449     208                         if (temp) {\r
450    \   00000012   23BB               TST     R27\r
451    \   00000014   F019               BREQ    ??OWI_SendByte_2\r
452     209                                 OWI_WriteBit1(pins);\r
453    \   00000016   2F09               MOV     R16, R25\r
454    \   00000018   ....               RCALL   OWI_WriteBit1\r
455    \   0000001A   C002               RJMP    ??OWI_SendByte_3\r
456     210                         } else {\r
457     211                                 OWI_WriteBit0(pins);\r
458    \                     ??OWI_SendByte_2:\r
459    \   0000001C   2F09               MOV     R16, R25\r
460    \   0000001E   ....               RCALL   OWI_WriteBit0\r
461     212                         }\r
462     213                 \r
463     214                         data >>= 1;  // Right shift the data to get next bit.\r
464    \                     ??OWI_SendByte_3:\r
465    \   00000020   95A6               LSR     R26\r
466     215                 }\r
467    \   00000022   9583               INC     R24\r
468    \   00000024   CFF1               RJMP    ??OWI_SendByte_0\r
469     216          }\r
470    \                     ??OWI_SendByte_1:\r
471    \   00000026   E0E4               LDI     R30, 4\r
472    \   00000028   ....               RJMP    ?EPILOGUE_B4_L09\r
473     217          \r
474     218          \r
475     219          /*! \brief  Receives one byte of data from the 1-Wire(R) bus.\r
476     220           *\r
477     221           *  This function automates the task of receiving a complete byte \r
478     222           *  of data from the 1-Wire bus.\r
479     223           *\r
480     224           *  \param  pin     A bitmask of the bus to read from.\r
481     225           *  \r
482     226           *  \return     The byte read from the bus.\r
483     227           */\r
484 \r
485    \                                 In  segment CODE, align 2, keep-with-next\r
486     228          unsigned char OWI_ReceiveByte(unsigned char pin)\r
487    \                     OWI_ReceiveByte:\r
488     229          {\r
489    \   00000000   ....               RCALL   ?PROLOGUE3_L09\r
490    \   00000002   2FA0               MOV     R26, R16\r
491     230                 unsigned char data;\r
492     231                 unsigned char i;\r
493     232                 \r
494     233                 // Clear the temporary input variable.\r
495     234                 data = 0x00;\r
496    \   00000004   E090               LDI     R25, 0\r
497     235                 \r
498     236                 // Do once for each bit\r
499     237                 for (i = 0; i < 8; i++) {\r
500    \   00000006   E080               LDI     R24, 0\r
501    \                     ??OWI_ReceiveByte_0:\r
502    \   00000008   3088               CPI     R24, 8\r
503    \   0000000A   F448               BRCC    ??OWI_ReceiveByte_1\r
504     238                         // Shift temporary input variable right.\r
505     239                         data >>= 1;\r
506    \   0000000C   9596               LSR     R25\r
507     240                         \r
508     241                         // Set the MSB if a '1' value is read from the bus.\r
509     242                         // Leave as it is ('0') else.\r
510     243                         if (OWI_ReadBit(pin)) {\r
511    \   0000000E   2F0A               MOV     R16, R26\r
512    \   00000010   ....               RCALL   OWI_ReadBit\r
513    \   00000012   2300               TST     R16\r
514    \   00000014   F011               BREQ    ??OWI_ReceiveByte_2\r
515     244                                 data |= 0x80;\r
516    \   00000016   6890               ORI     R25, 0x80\r
517    \   00000018   E001               LDI     R16, 1\r
518     245                         }\r
519     246                 }\r
520    \                     ??OWI_ReceiveByte_2:\r
521    \   0000001A   9583               INC     R24\r
522    \   0000001C   CFF5               RJMP    ??OWI_ReceiveByte_0\r
523     247                 \r
524     248                 return data;\r
525    \                     ??OWI_ReceiveByte_1:\r
526    \   0000001E   2F09               MOV     R16, R25\r
527    \   00000020   E0E3               LDI     R30, 3\r
528    \   00000022   ....               RJMP    ?EPILOGUE_B3_L09\r
529     249          }\r
530     250          \r
531     251          \r
532     252          /*! \brief  Sends the SKIP ROM command to the 1-Wire bus(es).\r
533     253           *\r
534     254           *  \param  pins    A bitmask of the buses to send the SKIP ROM command to.\r
535     255           */\r
536 \r
537    \                                 In  segment CODE, align 2, keep-with-next\r
538     256          void OWI_SkipRom(unsigned char pins)\r
539    \                     OWI_SkipRom:\r
540     257          {\r
541    \   00000000   938A               ST      -Y, R24\r
542    \   00000002   2F80               MOV     R24, R16\r
543     258                 // Send the SKIP ROM command on the bus.\r
544     259                 OWI_SendByte(OWI_ROM_SKIP, pins);\r
545    \   00000004   2F18               MOV     R17, R24\r
546    \   00000006   EC0C               LDI     R16, 204\r
547    \   00000008   ....               RCALL   OWI_SendByte\r
548     260          }\r
549    \   0000000A   9189               LD      R24, Y+\r
550    \   0000000C   9508               RET\r
551     261          \r
552     262          \r
553     263          /*! \brief  Sends the READ ROM command and reads back the ROM id.\r
554     264           *\r
555     265           *  \param  romValue    A pointer where the id will be placed.\r
556     266           *\r
557     267           *  \param  pin     A bitmask of the bus to read from.\r
558     268           */\r
559 \r
560    \                                 In  segment CODE, align 2, keep-with-next\r
561     269          void OWI_ReadRom(unsigned char * romValue, unsigned char pin)\r
562    \                     OWI_ReadRom:\r
563     270          {\r
564    \   00000000   ....               RCALL   ?PROLOGUE4_L09\r
565    \   00000002   01D8               MOVW    R27:R26, R17:R16\r
566    \   00000004   2F92               MOV     R25, R18\r
567     271                 unsigned char bytesLeft = 8;\r
568    \   00000006   E088               LDI     R24, 8\r
569     272                 \r
570     273                 // Send the READ ROM command on the bus.\r
571     274                 OWI_SendByte(OWI_ROM_READ, pin);\r
572    \   00000008   2F19               MOV     R17, R25\r
573    \   0000000A   E303               LDI     R16, 51\r
574    \   0000000C   ....               RCALL   OWI_SendByte\r
575     275                 \r
576     276                 // Do 8 times.\r
577     277                 while (bytesLeft > 0) {\r
578    \                     ??OWI_ReadRom_0:\r
579    \   0000000E   3081               CPI     R24, 1\r
580    \   00000010   F030               BRCS    ??OWI_ReadRom_1\r
581     278                         // Place the received data in memory.\r
582     279                         *romValue++ = OWI_ReceiveByte(pin);\r
583    \   00000012   2F09               MOV     R16, R25\r
584    \   00000014   ....               RCALL   OWI_ReceiveByte\r
585    \   00000016   930C               ST      X, R16\r
586    \   00000018   9611               ADIW    R27:R26, 1\r
587     280                         bytesLeft--;\r
588    \   0000001A   958A               DEC     R24\r
589    \   0000001C   CFF8               RJMP    ??OWI_ReadRom_0\r
590     281                 }\r
591     282          }\r
592    \                     ??OWI_ReadRom_1:\r
593    \   0000001E   E0E4               LDI     R30, 4\r
594    \   00000020   ....               RJMP    ?EPILOGUE_B4_L09\r
595     283          \r
596     284          \r
597     285          /*! \brief  Sends the MATCH ROM command and the ROM id to match against.\r
598     286           *\r
599     287           *  \param  romValue    A pointer to the ID to match against.\r
600     288           *\r
601     289           *  \param  pins    A bitmask of the buses to perform the MATCH ROM command on.\r
602     290           */\r
603 \r
604    \                                 In  segment CODE, align 2, keep-with-next\r
605     291          void OWI_MatchRom(unsigned char * romValue, unsigned char pins)\r
606    \                     OWI_MatchRom:\r
607     292          {\r
608    \   00000000   ....               RCALL   ?PROLOGUE4_L09\r
609    \   00000002   01D8               MOVW    R27:R26, R17:R16\r
610    \   00000004   2F92               MOV     R25, R18\r
611     293                 unsigned char bytesLeft = 8;   \r
612    \   00000006   E088               LDI     R24, 8\r
613     294                 \r
614     295                 // Send the MATCH ROM command.\r
615     296                 OWI_SendByte(OWI_ROM_MATCH, pins);\r
616    \   00000008   2F19               MOV     R17, R25\r
617    \   0000000A   E505               LDI     R16, 85\r
618    \   0000000C   ....               RCALL   OWI_SendByte\r
619     297                 \r
620     298                 // Do once for each byte.\r
621     299                 while (bytesLeft > 0) {\r
622    \                     ??OWI_MatchRom_0:\r
623    \   0000000E   3081               CPI     R24, 1\r
624    \   00000010   F030               BRCS    ??OWI_MatchRom_1\r
625     300                         // Transmit 1 byte of the ID to match.\r
626     301                         OWI_SendByte(*romValue++, pins);\r
627    \   00000012   2F19               MOV     R17, R25\r
628    \   00000014   910C               LD      R16, X\r
629    \   00000016   ....               RCALL   OWI_SendByte\r
630    \   00000018   9611               ADIW    R27:R26, 1\r
631     302                         bytesLeft--;\r
632    \   0000001A   958A               DEC     R24\r
633    \   0000001C   CFF8               RJMP    ??OWI_MatchRom_0\r
634     303                 }\r
635     304          }\r
636    \                     ??OWI_MatchRom_1:\r
637    \   0000001E   E0E4               LDI     R30, 4\r
638    \   00000020   ....               RJMP    ?EPILOGUE_B4_L09\r
639     305          \r
640     306          \r
641     307          /*! \brief  Sends the SEARCH ROM command and returns 1 id found on the \r
642     308           *          1-Wire(R) bus.\r
643     309           *\r
644     310           *  \param  bitPattern      A pointer to an 8 byte char array where the \r
645     311           *                          discovered identifier will be placed. When \r
646     312           *                          searching for several slaves, a copy of the \r
647     313           *                          last found identifier should be supplied in \r
648     314           *                          the array, or the search will fail.\r
649     315           *\r
650     316           *  \param  lastDeviation   The bit position where the algorithm made a \r
651     317           *                          choice the last time it was run. This argument \r
652     318           *                          should be 0 when a search is initiated. Supplying \r
653     319           *                          the return argument of this function when calling \r
654     320           *                          repeatedly will go through the complete slave \r
655     321           *                          search.\r
656     322           *\r
657     323           *  \param  pin             A bit-mask of the bus to perform a ROM search on.\r
658     324           *\r
659     325           *  \return The last bit position where there was a discrepancy between slave\r
660     326           *  addresses the last time this function was run. Returns OWI_ROM_SEARCH_FAILED\r
661     327           *  if an error was detected (e.g. a device was connected to the bus during the\r
662     328           *  search), or OWI_ROM_SEARCH_FINISHED when there are no more devices to be\r
663     329           *  discovered.\r
664     330           *\r
665     331           *  \note   See main.c for an example of how to utilize this function.\r
666     332           */\r
667 \r
668    \                                 In  segment CODE, align 2, keep-with-next\r
669     333          unsigned char OWI_SearchRom(unsigned char * bitPattern,\r
670    \                     OWI_SearchRom:\r
671     334                                                         unsigned char lastDeviation, unsigned char pin)\r
672     335          {\r
673    \   00000000   ....               RCALL   ?PROLOGUE9_L09\r
674    \   00000002                      REQUIRE ?Register_R4_is_cg_reg\r
675    \   00000002                      REQUIRE ?Register_R5_is_cg_reg\r
676    \   00000002                      REQUIRE ?Register_R6_is_cg_reg\r
677    \   00000002                      REQUIRE ?Register_R7_is_cg_reg\r
678    \   00000002                      REQUIRE ?Register_R8_is_cg_reg\r
679    \   00000002   0128               MOVW    R5:R4, R17:R16\r
680    \   00000004   2E82               MOV     R8, R18\r
681    \   00000006   2FB3               MOV     R27, R19\r
682     336                 unsigned char currentBit = 1;\r
683    \   00000008   E081               LDI     R24, 1\r
684     337                 unsigned char newDeviation = 0;\r
685    \   0000000A   E0A0               LDI     R26, 0\r
686     338                 unsigned char bitMask = 0x01;\r
687    \   0000000C   E091               LDI     R25, 1\r
688     339                 unsigned char bitA;\r
689     340                 unsigned char bitB;\r
690     341                 \r
691     342                 // Send SEARCH ROM command on the bus.\r
692     343                 OWI_SendByte(OWI_ROM_SEARCH, pin);\r
693    \   0000000E   2F1B               MOV     R17, R27\r
694    \   00000010   EF00               LDI     R16, 240\r
695    \   00000012   ....               RCALL   OWI_SendByte\r
696     344                 \r
697     345                 // Walk through all 64 bits.\r
698     346                 while (currentBit <= 64) {\r
699    \                     ??OWI_SearchRom_0:\r
700    \   00000014   3481               CPI     R24, 65\r
701    \   00000016   F008               BRCS    $+2+2\r
702    \   00000018   C04B               RJMP    ??OWI_SearchRom_1\r
703     347                         // Read bit from bus twice.\r
704     348                         bitA = OWI_ReadBit(pin);\r
705    \   0000001A   2F0B               MOV     R16, R27\r
706    \   0000001C   ....               RCALL   OWI_ReadBit\r
707    \   0000001E   2E60               MOV     R6, R16\r
708     349                         bitB = OWI_ReadBit(pin);\r
709    \   00000020   2F0B               MOV     R16, R27\r
710    \   00000022   ....               RCALL   OWI_ReadBit\r
711    \   00000024   2E70               MOV     R7, R16\r
712     350                         \r
713     351                         if (bitA && bitB) {\r
714    \   00000026   2066               TST     R6\r
715    \   00000028   F029               BREQ    ??OWI_SearchRom_2\r
716    \   0000002A   2077               TST     R7\r
717    \   0000002C   F019               BREQ    ??OWI_SearchRom_2\r
718     352                                 // Both bits 1 (Error).\r
719     353                                 newDeviation = OWI_ROM_SEARCH_FAILED;\r
720    \   0000002E   EFAF               LDI     R26, 255\r
721     354                                 return newDeviation;\r
722    \   00000030   2F0A               MOV     R16, R26\r
723    \   00000032   C03F               RJMP    ??OWI_SearchRom_3\r
724     355                         } else if (bitA ^ bitB) {\r
725    \                     ??OWI_SearchRom_2:\r
726    \   00000034   2D07               MOV     R16, R7\r
727    \   00000036   2506               EOR     R16, R6\r
728    \   00000038   2300               TST     R16\r
729    \   0000003A   F071               BREQ    ??OWI_SearchRom_4\r
730     356                                 // Bits A and B are different. All devices have the same bit here.\r
731     357                                 // Set the bit in bitPattern to this value.\r
732     358                                 if (bitA) {\r
733    \   0000003C   2066               TST     R6\r
734    \   0000003E   F029               BREQ    ??OWI_SearchRom_5\r
735     359                                         (*bitPattern) |= bitMask;\r
736    \   00000040   01F2               MOVW    R31:R30, R5:R4\r
737    \   00000042   8100               LD      R16, Z\r
738    \   00000044   2B09               OR      R16, R25\r
739    \   00000046   8300               ST      Z, R16\r
740    \   00000048   C01E               RJMP    ??OWI_SearchRom_6\r
741     360                                 } else {\r
742     361                                         (*bitPattern) &= ~bitMask;\r
743    \                     ??OWI_SearchRom_5:\r
744    \   0000004A   2F09               MOV     R16, R25\r
745    \   0000004C   9500               COM     R16\r
746    \   0000004E   01F2               MOVW    R31:R30, R5:R4\r
747    \   00000050   8110               LD      R17, Z\r
748    \   00000052   2310               AND     R17, R16\r
749    \   00000054   8310               ST      Z, R17\r
750    \   00000056   C017               RJMP    ??OWI_SearchRom_6\r
751     362                                 }\r
752     363                         } else {\r
753     364                                 // If this is where a choice was made the last time,\r
754     365                                 // a '1' bit is selected this time.\r
755     366                                 if (currentBit == lastDeviation) {\r
756    \                     ??OWI_SearchRom_4:\r
757    \   00000058   1588               CP      R24, R8\r
758    \   0000005A   F429               BRNE    ??OWI_SearchRom_7\r
759     367                                         (*bitPattern) |= bitMask;\r
760    \   0000005C   01F2               MOVW    R31:R30, R5:R4\r
761    \   0000005E   8100               LD      R16, Z\r
762    \   00000060   2B09               OR      R16, R25\r
763    \   00000062   8300               ST      Z, R16\r
764    \   00000064   C010               RJMP    ??OWI_SearchRom_6\r
765     368                                 }\r
766     369                                 \r
767     370                                 // For the rest of the id, '0' bits are selected when\r
768     371                                 // discrepancies occur.\r
769     372                                 else if (currentBit > lastDeviation) {\r
770    \                     ??OWI_SearchRom_7:\r
771    \   00000066   1688               CP      R8, R24\r
772    \   00000068   F440               BRCC    ??OWI_SearchRom_8\r
773     373                                         (*bitPattern) &= ~bitMask;\r
774    \   0000006A   2F09               MOV     R16, R25\r
775    \   0000006C   9500               COM     R16\r
776    \   0000006E   01F2               MOVW    R31:R30, R5:R4\r
777    \   00000070   8110               LD      R17, Z\r
778    \   00000072   2310               AND     R17, R16\r
779    \   00000074   8310               ST      Z, R17\r
780     374                                         newDeviation = currentBit;\r
781    \   00000076   2FA8               MOV     R26, R24\r
782    \   00000078   C006               RJMP    ??OWI_SearchRom_6\r
783     375                                 }\r
784     376                                 \r
785     377                                 // If current bit in bit pattern = 0, then this is\r
786     378                                 // out new deviation.\r
787     379                                 else if ( !(*bitPattern & bitMask)) {\r
788    \                     ??OWI_SearchRom_8:\r
789    \   0000007A   01F2               MOVW    R31:R30, R5:R4\r
790    \   0000007C   8100               LD      R16, Z\r
791    \   0000007E   2309               AND     R16, R25\r
792    \   00000080   2300               TST     R16\r
793    \   00000082   F409               BRNE    ??OWI_SearchRom_6\r
794     380                                         newDeviation = currentBit;\r
795    \   00000084   2FA8               MOV     R26, R24\r
796     381                                 }\r
797     382                                 \r
798     383                         // IF the bit is already 1, do nothing.\r
799     384                                 else {\r
800     385                                 }\r
801     386                         }\r
802     387                         \r
803     388                         // Send the selected bit to the bus.\r
804     389                         if ((*bitPattern) & bitMask) {\r
805    \                     ??OWI_SearchRom_6:\r
806    \   00000086   01F2               MOVW    R31:R30, R5:R4\r
807    \   00000088   8100               LD      R16, Z\r
808    \   0000008A   2309               AND     R16, R25\r
809    \   0000008C   2300               TST     R16\r
810    \   0000008E   F019               BREQ    ??OWI_SearchRom_9\r
811     390                                 OWI_WriteBit1(pin);\r
812    \   00000090   2F0B               MOV     R16, R27\r
813    \   00000092   ....               RCALL   OWI_WriteBit1\r
814    \   00000094   C002               RJMP    ??OWI_SearchRom_10\r
815     391                         } else {\r
816     392                                 OWI_WriteBit0(pin);\r
817    \                     ??OWI_SearchRom_9:\r
818    \   00000096   2F0B               MOV     R16, R27\r
819    \   00000098   ....               RCALL   OWI_WriteBit0\r
820     393                         }\r
821     394                         \r
822     395                         // Increment current bit.    \r
823     396                         currentBit++;\r
824    \                     ??OWI_SearchRom_10:\r
825    \   0000009A   9583               INC     R24\r
826     397                         \r
827     398                         // Adjust bitMask and bitPattern pointer.    \r
828     399                         bitMask <<= 1;\r
829    \   0000009C   0F99               LSL     R25\r
830     400                         if (!bitMask) {\r
831    \   0000009E   2399               TST     R25\r
832    \   000000A0   F009               BREQ    $+2+2\r
833    \   000000A2   CFB8               RJMP    ??OWI_SearchRom_0\r
834     401                                 bitMask = 0x01;\r
835    \   000000A4   E091               LDI     R25, 1\r
836     402                                 bitPattern++;\r
837    \   000000A6   E001               LDI     R16, 1\r
838    \   000000A8   0E40               ADD     R4, R16\r
839    \   000000AA   E000               LDI     R16, 0\r
840    \   000000AC   1E50               ADC     R5, R16\r
841    \   000000AE   CFB2               RJMP    ??OWI_SearchRom_0\r
842     403                         }\r
843     404                 }\r
844     405                 \r
845     406                 return newDeviation;\r
846    \                     ??OWI_SearchRom_1:\r
847    \   000000B0   2F0A               MOV     R16, R26\r
848    \                     ??OWI_SearchRom_3:\r
849    \   000000B2   E0E9               LDI     R30, 9\r
850    \   000000B4   ....               RJMP    ?EPILOGUE_B9_L09\r
851     407          }\r
852     408          \r
853     409          \r
854     410          /* Functions for handling CRC */\r
855     411          /*! \brief  Compute the CRC8 value of a data set.\r
856     412           *\r
857     413           *  This function will compute the CRC8 or DOW-CRC of inData using seed\r
858     414           *  as inital value for the CRC.\r
859     415           *\r
860     416           *  \param  inData  One byte of data to compute CRC from.\r
861     417           *\r
862     418           *  \param  seed    The starting value of the CRC.\r
863     419           *\r
864     420           *  \return The CRC8 of inData with seed as initial value.\r
865     421           *\r
866     422           *  \note   Setting seed to 0 computes the crc8 of the inData.\r
867     423           *\r
868     424           *  \note   Constantly passing the return value of this function \r
869     425           *          As the seed argument computes the CRC8 value of a\r
870     426           *          longer string of data.\r
871     427           */\r
872 \r
873    \                                 In  segment CODE, align 2, keep-with-next\r
874     428          unsigned char OWI_ComputeCRC8(unsigned char inData, unsigned char seed)\r
875    \                     OWI_ComputeCRC8:\r
876     429          {\r
877    \   00000000   2F30               MOV     R19, R16\r
878    \   00000002   2F01               MOV     R16, R17\r
879     430                 unsigned char bitsLeft;\r
880     431                 unsigned char temp;\r
881     432                 \r
882     433                 for (bitsLeft = 8; bitsLeft > 0; bitsLeft--) {\r
883    \   00000004   E018               LDI     R17, 8\r
884    \                     ??OWI_ComputeCRC8_0:\r
885    \   00000006   3011               CPI     R17, 1\r
886    \   00000008   F098               BRCS    ??OWI_ComputeCRC8_1\r
887     434                         temp = ((seed ^ inData) & 0x01);\r
888    \   0000000A   2F50               MOV     R21, R16\r
889    \   0000000C   7051               ANDI    R21, 0x01\r
890    \   0000000E   2F23               MOV     R18, R19\r
891    \   00000010   7021               ANDI    R18, 0x01\r
892    \   00000012   2725               EOR     R18, R21\r
893    \   00000014   7021               ANDI    R18, 0x01\r
894    \   00000016   2F42               MOV     R20, R18\r
895     435                         \r
896     436                         if (temp == 0) {\r
897    \   00000018   2344               TST     R20\r
898    \   0000001A   F411               BRNE    ??OWI_ComputeCRC8_2\r
899     437                         seed >>= 1;\r
900    \   0000001C   9506               LSR     R16\r
901    \   0000001E   C005               RJMP    ??OWI_ComputeCRC8_3\r
902     438                         } else {\r
903     439                                 seed ^= 0x18;\r
904    \                     ??OWI_ComputeCRC8_2:\r
905    \   00000020   E128               LDI     R18, 24\r
906    \   00000022   2702               EOR     R16, R18\r
907     440                                 seed >>= 1;\r
908    \   00000024   9506               LSR     R16\r
909     441                                 seed |= 0x80;\r
910    \   00000026   6800               ORI     R16, 0x80\r
911    \   00000028   E021               LDI     R18, 1\r
912     442                         }\r
913     443                         \r
914     444                         inData >>= 1;\r
915    \                     ??OWI_ComputeCRC8_3:\r
916    \   0000002A   9536               LSR     R19\r
917     445                 }\r
918    \   0000002C   951A               DEC     R17\r
919    \   0000002E   CFEB               RJMP    ??OWI_ComputeCRC8_0\r
920     446                 return seed;    \r
921    \                     ??OWI_ComputeCRC8_1:\r
922    \   00000030   9508               RET\r
923     447          }\r
924     448          \r
925     449          \r
926     450          /*! \brief  Compute the CRC16 value of a data set.\r
927     451           *\r
928     452           *  This function will compute the CRC16 of inData using seed\r
929     453           *  as inital value for the CRC.\r
930     454           *\r
931     455           *  \param  inData  One byte of data to compute CRC from.\r
932     456           *\r
933     457           *  \param  seed    The starting value of the CRC.\r
934     458           *\r
935     459           *  \return The CRC16 of inData with seed as initial value.\r
936     460           *\r
937     461           *  \note   Setting seed to 0 computes the crc16 of the inData.\r
938     462           *\r
939     463           *  \note   Constantly passing the return value of this function \r
940     464           *          As the seed argument computes the CRC16 value of a\r
941     465           *          longer string of data.\r
942     466           */\r
943 \r
944    \                                 In  segment CODE, align 2, keep-with-next\r
945     467          unsigned int OWI_ComputeCRC16(unsigned char inData, unsigned int seed)\r
946    \                     OWI_ComputeCRC16:\r
947     468          {\r
948    \   00000000   2F50               MOV     R21, R16\r
949     469                 unsigned char bitsLeft;\r
950     470                 unsigned char temp;\r
951     471                 \r
952     472                 for (bitsLeft = 8; bitsLeft > 0; bitsLeft--) {\r
953    \   00000002   E048               LDI     R20, 8\r
954    \                     ??OWI_ComputeCRC16_0:\r
955    \   00000004   3041               CPI     R20, 1\r
956    \   00000006   F0C0               BRCS    ??OWI_ComputeCRC16_1\r
957     473                         temp = ((seed ^ inData) & 0x01);\r
958    \   00000008   2F12               MOV     R17, R18\r
959    \   0000000A   7011               ANDI    R17, 0x01\r
960    \   0000000C   2F05               MOV     R16, R21\r
961    \   0000000E   7001               ANDI    R16, 0x01\r
962    \   00000010   2701               EOR     R16, R17\r
963    \   00000012   7001               ANDI    R16, 0x01\r
964    \   00000014   2F60               MOV     R22, R16\r
965     474                         \r
966     475                         if (temp == 0) {\r
967    \   00000016   2366               TST     R22\r
968    \   00000018   F419               BRNE    ??OWI_ComputeCRC16_2\r
969     476                                 seed >>= 1;\r
970    \   0000001A   9536               LSR     R19\r
971    \   0000001C   9527               ROR     R18\r
972    \   0000001E   C009               RJMP    ??OWI_ComputeCRC16_3\r
973     477                   } else {\r
974     478                                 seed ^= 0x4002;\r
975    \                     ??OWI_ComputeCRC16_2:\r
976    \   00000020   E002               LDI     R16, 2\r
977    \   00000022   E410               LDI     R17, 64\r
978    \   00000024   2720               EOR     R18, R16\r
979    \   00000026   2731               EOR     R19, R17\r
980     479                                 seed >>= 1;\r
981    \   00000028   9536               LSR     R19\r
982    \   0000002A   9527               ROR     R18\r
983     480                                 seed |= 0x8000;\r
984    \   0000002C   6830               ORI     R19, 0x80\r
985    \   0000002E   E001               LDI     R16, 1\r
986    \   00000030   E010               LDI     R17, 0\r
987     481                         }\r
988     482          \r
989     483                         inData >>= 1;\r
990    \                     ??OWI_ComputeCRC16_3:\r
991    \   00000032   9556               LSR     R21\r
992     484                 }\r
993    \   00000034   954A               DEC     R20\r
994    \   00000036   CFE6               RJMP    ??OWI_ComputeCRC16_0\r
995     485                 \r
996     486                 return seed;    \r
997    \                     ??OWI_ComputeCRC16_1:\r
998    \   00000038   0189               MOVW    R17:R16, R19:R18\r
999    \   0000003A   9508               RET\r
1000     487          }\r
1001     488          \r
1002     489          \r
1003     490          /*! \brief  Calculate and check the CRC of a 64 bit ROM identifier.\r
1004     491           *  \r
1005     492           *  This function computes the CRC8 value of the first 56 bits of a\r
1006     493           *  64 bit identifier. It then checks the calculated value against the\r
1007     494           *  CRC value stored in ROM.\r
1008     495           *\r
1009     496           *  \param  *romValue    A pointer to an array holding a 64 bit identifier.\r
1010     497           *\r
1011     498           *  \retval OWI_CRC_OK      The CRC's matched.\r
1012     499           *  \retval OWI_CRC_ERROR   Calculated and stored CRC did not match.\r
1013     500           */\r
1014 \r
1015    \                                 In  segment CODE, align 2, keep-with-next\r
1016     501          unsigned char OWI_CheckRomCRC(unsigned char *romValue)\r
1017    \                     OWI_CheckRomCRC:\r
1018     502          {\r
1019    \   00000000   ....               RCALL   ?PROLOGUE4_L09\r
1020    \   00000002   01D8               MOVW    R27:R26, R17:R16\r
1021     503                 unsigned char i;\r
1022     504                 unsigned char crc8 = 0;\r
1023    \   00000004   E090               LDI     R25, 0\r
1024     505                 \r
1025     506                 for (i = 0; i < 7; i++) {\r
1026    \   00000006   E080               LDI     R24, 0\r
1027    \                     ??OWI_CheckRomCRC_0:\r
1028    \   00000008   3087               CPI     R24, 7\r
1029    \   0000000A   F440               BRCC    ??OWI_CheckRomCRC_1\r
1030     507                         crc8 = OWI_ComputeCRC8(*romValue, crc8);\r
1031    \   0000000C   2F19               MOV     R17, R25\r
1032    \   0000000E   01FD               MOVW    R31:R30, R27:R26\r
1033    \   00000010   8100               LD      R16, Z\r
1034    \   00000012   ....               RCALL   OWI_ComputeCRC8\r
1035    \   00000014   2F90               MOV     R25, R16\r
1036     508                         romValue++;\r
1037    \   00000016   9611               ADIW    R27:R26, 1\r
1038     509                 }\r
1039    \   00000018   9583               INC     R24\r
1040    \   0000001A   CFF6               RJMP    ??OWI_CheckRomCRC_0\r
1041     510                 \r
1042     511                 if (crc8 == (*romValue)) {\r
1043    \                     ??OWI_CheckRomCRC_1:\r
1044    \   0000001C   910C               LD      R16, X\r
1045    \   0000001E   1790               CP      R25, R16\r
1046    \   00000020   F411               BRNE    ??OWI_CheckRomCRC_2\r
1047     512                         return OWI_CRC_OK;\r
1048    \   00000022   E000               LDI     R16, 0\r
1049    \   00000024   C001               RJMP    ??OWI_CheckRomCRC_3\r
1050     513                 }\r
1051     514                 \r
1052     515                 return OWI_CRC_ERROR;\r
1053    \                     ??OWI_CheckRomCRC_2:\r
1054    \   00000026   E001               LDI     R16, 1\r
1055    \                     ??OWI_CheckRomCRC_3:\r
1056    \   00000028   E0E4               LDI     R30, 4\r
1057    \   0000002A   ....               RJMP    ?EPILOGUE_B4_L09\r
1058     516          }\r
1059 \r
1060    Maximum stack usage in bytes:\r
1061 \r
1062      Function             CSTACK RSTACK\r
1063      --------             ------ ------\r
1064      OWI_CheckRomCRC          4      2\r
1065        -> OWI_ComputeCRC8     4      2\r
1066      OWI_ComputeCRC16         0      2\r
1067      OWI_ComputeCRC8          0      2\r
1068      OWI_DetectPresence       0      2\r
1069      OWI_Init                 0      2\r
1070      OWI_MatchRom             4      2\r
1071        -> OWI_SendByte        4      2\r
1072        -> OWI_SendByte        4      2\r
1073      OWI_ReadBit              0      2\r
1074      OWI_ReadRom              4      2\r
1075        -> OWI_SendByte        4      2\r
1076        -> OWI_ReceiveByte     4      2\r
1077      OWI_ReceiveByte          3      2\r
1078        -> OWI_ReadBit         3      2\r
1079      OWI_SearchRom            9      2\r
1080        -> OWI_SendByte        9      2\r
1081        -> OWI_ReadBit         9      2\r
1082        -> OWI_ReadBit         9      2\r
1083        -> OWI_WriteBit1       9      2\r
1084        -> OWI_WriteBit0       9      2\r
1085      OWI_SendByte             4      2\r
1086        -> OWI_WriteBit1       4      2\r
1087        -> OWI_WriteBit0       4      2\r
1088      OWI_SkipRom              1      2\r
1089        -> OWI_SendByte        1      2\r
1090      OWI_WriteBit0            0      2\r
1091      OWI_WriteBit1            0      2\r
1092 \r
1093 \r
1094    Segment part sizes:\r
1095 \r
1096      Function/Label     Bytes\r
1097      --------------     -----\r
1098      _A_PORTA              1\r
1099      _A_DDRA               1\r
1100      _A_PINA               1\r
1101      OWI_Init             34\r
1102      OWI_WriteBit1        62\r
1103      OWI_WriteBit0        62\r
1104      OWI_ReadBit          78\r
1105      OWI_DetectPresence   88\r
1106      OWI_SendByte         42\r
1107      OWI_ReceiveByte      36\r
1108      OWI_SkipRom          14\r
1109      OWI_ReadRom          34\r
1110      OWI_MatchRom         34\r
1111      OWI_SearchRom       182\r
1112      OWI_ComputeCRC8      50\r
1113      OWI_ComputeCRC16     60\r
1114      OWI_CheckRomCRC      44\r
1115 \r
1116  \r
1117    3 bytes in segment ABSOLUTE\r
1118  820 bytes in segment CODE\r
1119  \r
1120  820 bytes of CODE memory\r
1121    0 bytes of DATA memory (+ 3 bytes shared)\r
1122 \r
1123 Errors: none\r
1124 Warnings: none\r