?? main.lst
字號:
98:ds18b20.h ****
99:ds18b20.h ****
100:ds18b20.h **** /*-------------------------------------------------------
101:ds18b20.h **** * 配置(使能)AVR與DS18B20的接口
102:ds18b20.h **** */
103:ds18b20.h **** void ds18b20_config(void)
104:ds18b20.h **** {
144 .LM8:
145 /* prologue: frame size=0 */
146 /* prologue end (size=0) */
105:ds18b20.h **** DDRD &= ~DQ_18B20; // 輸入模式(上電時為高電平)
148 .LM9:
149 0024 8B98 cbi 49-0x20,3
106:ds18b20.h **** PORTD &= ~DQ_18B20; // 輸出鎖存器寫0,以后不再更改
151 .LM10:
152 0026 9398 cbi 50-0x20,3
153 /* epilogue: frame size=0 */
154 0028 0895 ret
155 /* epilogue end (size=1) */
156 /* function ds18b20_config size 3 (2) */
158 .Lscope2:
160 .global ds18b20_reset
162 ds18b20_reset:
107:ds18b20.h **** }
108:ds18b20.h ****
109:ds18b20.h **** /*-------------------------------------------------------
110:ds18b20.h **** * 復位1-wire總線,并探測是否有溫度芯片DS18B20(TO-92
111:ds18b20.h **** * 封裝)掛在總線上,有返回SUCC,沒有返回FAIL
112:ds18b20.h **** */
113:ds18b20.h **** unsigned char ds18b20_reset(void)
114:ds18b20.h **** {
164 .LM11:
165 /* prologue: frame size=0 */
166 /* prologue end (size=0) */
115:ds18b20.h **** unsigned char bus_flag;
116:ds18b20.h ****
117:ds18b20.h **** DQ_TO_0(); // 設置1-wire總線為低電平(占領總線)...
168 .LM12:
169 002a 8B9A sbi 49-0x20,3
170 .LBB2:
172 .Ltext3:
1:d:/WinAVR/bin/../lib/gcc/avr/3.4.3/../../../../avr/include/avr/delay.h **** /* Copyright (c) 2002, Marek Michalkiewicz
2:d:/WinAVR/bin/../lib/gcc/avr/3.4.3/../../../../avr/include/avr/delay.h **** Copyright (c) 2004, Joerg Wunsch
3:d:/WinAVR/bin/../lib/gcc/avr/3.4.3/../../../../avr/include/avr/delay.h **** All rights reserved.
4:d:/WinAVR/bin/../lib/gcc/avr/3.4.3/../../../../avr/include/avr/delay.h ****
5:d:/WinAVR/bin/../lib/gcc/avr/3.4.3/../../../../avr/include/avr/delay.h **** Redistribution and use in source and binary forms, with or without
6:d:/WinAVR/bin/../lib/gcc/avr/3.4.3/../../../../avr/include/avr/delay.h **** modification, are permitted provided that the following conditions are met:
7:d:/WinAVR/bin/../lib/gcc/avr/3.4.3/../../../../avr/include/avr/delay.h ****
8:d:/WinAVR/bin/../lib/gcc/avr/3.4.3/../../../../avr/include/avr/delay.h **** * Redistributions of source code must retain the above copyright
9:d:/WinAVR/bin/../lib/gcc/avr/3.4.3/../../../../avr/include/avr/delay.h **** notice, this list of conditions and the following disclaimer.
10:d:/WinAVR/bin/../lib/gcc/avr/3.4.3/../../../../avr/include/avr/delay.h ****
11:d:/WinAVR/bin/../lib/gcc/avr/3.4.3/../../../../avr/include/avr/delay.h **** * Redistributions in binary form must reproduce the above copyright
12:d:/WinAVR/bin/../lib/gcc/avr/3.4.3/../../../../avr/include/avr/delay.h **** notice, this list of conditions and the following disclaimer in
13:d:/WinAVR/bin/../lib/gcc/avr/3.4.3/../../../../avr/include/avr/delay.h **** the documentation and/or other materials provided with the
14:d:/WinAVR/bin/../lib/gcc/avr/3.4.3/../../../../avr/include/avr/delay.h **** distribution.
15:d:/WinAVR/bin/../lib/gcc/avr/3.4.3/../../../../avr/include/avr/delay.h ****
16:d:/WinAVR/bin/../lib/gcc/avr/3.4.3/../../../../avr/include/avr/delay.h **** * Neither the name of the copyright holders nor the names of
17:d:/WinAVR/bin/../lib/gcc/avr/3.4.3/../../../../avr/include/avr/delay.h **** contributors may be used to endorse or promote products derived
18:d:/WinAVR/bin/../lib/gcc/avr/3.4.3/../../../../avr/include/avr/delay.h **** from this software without specific prior written permission.
19:d:/WinAVR/bin/../lib/gcc/avr/3.4.3/../../../../avr/include/avr/delay.h ****
20:d:/WinAVR/bin/../lib/gcc/avr/3.4.3/../../../../avr/include/avr/delay.h **** THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS "AS IS"
21:d:/WinAVR/bin/../lib/gcc/avr/3.4.3/../../../../avr/include/avr/delay.h **** AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE
22:d:/WinAVR/bin/../lib/gcc/avr/3.4.3/../../../../avr/include/avr/delay.h **** IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE
23:d:/WinAVR/bin/../lib/gcc/avr/3.4.3/../../../../avr/include/avr/delay.h **** ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT OWNER OR CONTRIBUTORS BE
24:d:/WinAVR/bin/../lib/gcc/avr/3.4.3/../../../../avr/include/avr/delay.h **** LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR
25:d:/WinAVR/bin/../lib/gcc/avr/3.4.3/../../../../avr/include/avr/delay.h **** CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF
26:d:/WinAVR/bin/../lib/gcc/avr/3.4.3/../../../../avr/include/avr/delay.h **** SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS
27:d:/WinAVR/bin/../lib/gcc/avr/3.4.3/../../../../avr/include/avr/delay.h **** INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN
28:d:/WinAVR/bin/../lib/gcc/avr/3.4.3/../../../../avr/include/avr/delay.h **** CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE)
29:d:/WinAVR/bin/../lib/gcc/avr/3.4.3/../../../../avr/include/avr/delay.h **** ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE
30:d:/WinAVR/bin/../lib/gcc/avr/3.4.3/../../../../avr/include/avr/delay.h **** POSSIBILITY OF SUCH DAMAGE. */
31:d:/WinAVR/bin/../lib/gcc/avr/3.4.3/../../../../avr/include/avr/delay.h ****
32:d:/WinAVR/bin/../lib/gcc/avr/3.4.3/../../../../avr/include/avr/delay.h **** /* $Id: delay.h,v 1.9 2004/12/22 10:16:54 joerg_wunsch Exp $ */
33:d:/WinAVR/bin/../lib/gcc/avr/3.4.3/../../../../avr/include/avr/delay.h ****
34:d:/WinAVR/bin/../lib/gcc/avr/3.4.3/../../../../avr/include/avr/delay.h **** /*
35:d:/WinAVR/bin/../lib/gcc/avr/3.4.3/../../../../avr/include/avr/delay.h **** avr/delay.h - loops for small accurate delays
36:d:/WinAVR/bin/../lib/gcc/avr/3.4.3/../../../../avr/include/avr/delay.h **** */
37:d:/WinAVR/bin/../lib/gcc/avr/3.4.3/../../../../avr/include/avr/delay.h ****
38:d:/WinAVR/bin/../lib/gcc/avr/3.4.3/../../../../avr/include/avr/delay.h **** #ifndef _AVR_DELAY_H_
39:d:/WinAVR/bin/../lib/gcc/avr/3.4.3/../../../../avr/include/avr/delay.h **** #define _AVR_DELAY_H_ 1
40:d:/WinAVR/bin/../lib/gcc/avr/3.4.3/../../../../avr/include/avr/delay.h ****
41:d:/WinAVR/bin/../lib/gcc/avr/3.4.3/../../../../avr/include/avr/delay.h **** #include <inttypes.h>
42:d:/WinAVR/bin/../lib/gcc/avr/3.4.3/../../../../avr/include/avr/delay.h ****
43:d:/WinAVR/bin/../lib/gcc/avr/3.4.3/../../../../avr/include/avr/delay.h **** /** \defgroup avr_delay Busy-wait delay loops
44:d:/WinAVR/bin/../lib/gcc/avr/3.4.3/../../../../avr/include/avr/delay.h **** \code
45:d:/WinAVR/bin/../lib/gcc/avr/3.4.3/../../../../avr/include/avr/delay.h **** #define F_CPU 1000000UL // 1 MHz
46:d:/WinAVR/bin/../lib/gcc/avr/3.4.3/../../../../avr/include/avr/delay.h **** //#define F_CPU 14.7456E6
47:d:/WinAVR/bin/../lib/gcc/avr/3.4.3/../../../../avr/include/avr/delay.h **** #include <avr/delay.h>
48:d:/WinAVR/bin/../lib/gcc/avr/3.4.3/../../../../avr/include/avr/delay.h **** \endcode
49:d:/WinAVR/bin/../lib/gcc/avr/3.4.3/../../../../avr/include/avr/delay.h ****
50:d:/WinAVR/bin/../lib/gcc/avr/3.4.3/../../../../avr/include/avr/delay.h **** The functions in this header file implement simple delay loops
51:d:/WinAVR/bin/../lib/gcc/avr/3.4.3/../../../../avr/include/avr/delay.h **** that perform a busy-waiting. They are typically used to
52:d:/WinAVR/bin/../lib/gcc/avr/3.4.3/../../../../avr/include/avr/delay.h **** facilitate short delays in the program execution. They are
53:d:/WinAVR/bin/../lib/gcc/avr/3.4.3/../../../../avr/include/avr/delay.h **** implemented as count-down loops with a well-known CPU cycle
54:d:/WinAVR/bin/../lib/gcc/avr/3.4.3/../../../../avr/include/avr/delay.h **** count per loop iteration. As such, no other processing can
55:d:/WinAVR/bin/../lib/gcc/avr/3.4.3/../../../../avr/include/avr/delay.h **** occur simultaneously. It should be kept in mind that the
56:d:/WinAVR/bin/../lib/gcc/avr/3.4.3/../../../../avr/include/avr/delay.h **** functions described here do not disable interrupts.
57:d:/WinAVR/bin/../lib/gcc/avr/3.4.3/../../../../avr/include/avr/delay.h ****
58:d:/WinAVR/bin/../lib/gcc/avr/3.4.3/../../../../avr/include/avr/delay.h **** In general, for long delays, the use of hardware timers is
59:d:/WinAVR/bin/../lib/gcc/avr/3.4.3/../../../../avr/include/avr/delay.h **** much preferrable, as they free the CPU, and allow for
60:d:/WinAVR/bin/../lib/gcc/avr/3.4.3/../../../../avr/include/avr/delay.h **** concurrent processing of other events while the timer is
61:d:/WinAVR/bin/../lib/gcc/avr/3.4.3/../../../../avr/include/avr/delay.h **** running. However, in particular for very short delays, the
62:d:/WinAVR/bin/../lib/gcc/avr/3.4.3/../../../../avr/include/avr/delay.h **** overhead of setting up a hardware timer is too much compared
63:d:/WinAVR/bin/../lib/gcc/avr/3.4.3/../../../../avr/include/avr/delay.h **** to the overall delay time.
64:d:/WinAVR/bin/../lib/gcc/avr/3.4.3/../../../../avr/include/avr/delay.h ****
65:d:/WinAVR/bin/../lib/gcc/avr/3.4.3/../../../../avr/include/avr/delay.h **** Two inline functions are provided for the actual delay algorithms.
66:d:/WinAVR/bin/../lib/gcc/avr/3.4.3/../../../../avr/include/avr/delay.h ****
67:d:/WinAVR/bin/../lib/gcc/avr/3.4.3/../../../../avr/include/avr/delay.h **** Two wrapper functions allow the specification of microsecond, and
68:d:/WinAVR/bin/../lib/gcc/avr/3.4.3/../../../../avr/include/avr/delay.h **** millisecond delays directly, using the application-supplied macro
69:d:/WinAVR/bin/../lib/gcc/avr/3.4.3/../../../../avr/include/avr/delay.h **** F_CPU as the CPU clock frequency (in Hertz). These functions
70:d:/WinAVR/bin/../lib/gcc/avr/3.4.3/../../../../avr/include/avr/delay.h **** operate on double typed arguments, however when optimization is
71:d:/WinAVR/bin/../lib/gcc/avr/3.4.3/../../../../avr/include/avr/delay.h **** turned on, the entire floating-point calculation will be done at
72:d:/WinAVR/bin/../lib/gcc/avr/3.4.3/../../../../avr/include/avr/delay.h **** compile-time.
73:d:/WinAVR/bin/../lib/gcc/avr/3.4.3/../../../../avr/include/avr/delay.h **** */
74:d:/WinAVR/bin/../lib/gcc/avr/3.4.3/../../../../avr/include/avr/delay.h ****
75:d:/WinAVR/bin/../lib/gcc/avr/3.4.3/../../../../avr/include/avr/delay.h **** /** \ingroup avr_delay
76:d:/WinAVR/bin/../lib/gcc/avr/3.4.3/../../../../avr/include/avr/delay.h ****
77:d:/WinAVR/bin/../lib/gcc/avr/3.4.3/../../../../avr/include/avr/delay.h **** Delay loop using an 8-bit counter \c __count, so up to 256
78:d:/WinAVR/bin/../lib/gcc/avr/3.4.3/../../../../avr/include/avr/delay.h **** iterations are possible. (The value 256 would have to be passed
79:d:/WinAVR/bin/../lib/gcc/avr/3.4.3/../../../../avr/include/avr/delay.h **** as 0.) The loop executes three CPU cycles per iteration, not
80:d:/WinAVR/bin/../lib/gcc/avr/3.4.3/../../../../avr/include/avr/delay.h **** including the overhead the compiler needs to setup the counter
81:d:/WinAVR/bin/../lib/gcc/avr/3.4.3/../../../../avr/include/avr/delay.h **** register.
82:d:/WinAVR/bin/../lib/gcc/avr/3.4.3/../../../../avr/include/avr/delay.h ****
83:d:/WinAVR/bin/../lib/gcc/avr/3.4.3/../../../../avr/include/avr/delay.h **** Thus, at a CPU speed of 1 MHz, delays of up to 768 microseconds
84:d:/WinAVR/bin/../lib/gcc/avr/3.4.3/../../../../avr/include/avr/delay.h **** can be achieved.
85:d:/WinAVR/bin/../lib/gcc/avr/3.4.3/../../../../avr/include/avr/delay.h **** */
86:d:/WinAVR/bin/../lib/gcc/avr/3.4.3/../../../../avr/include/avr/delay.h **** static __inline__ void
87:d:/WinAVR/bin/../lib/gcc/avr/3.4.3/../../../../avr/include/avr/delay.h **** _delay_loop_1(uint8_t __count)
88:d:/WinAVR/bin/../lib/gcc/avr/3.4.3/../../../../avr/include/avr/delay.h **** {
89:d:/WinAVR/bin/../lib/gcc/avr/3.4.3/../../../../avr/include/avr/delay.h **** __asm__ volatile (
90:d:/WinAVR/bin/../lib/gcc/avr/3.4.3/../../../../avr/include/avr/delay.h **** "1: dec %0" "\n\t"
91:d:/WinAVR/bin/../lib/gcc/avr/3.4.3/../../../../avr/include/avr/delay.h **** "brne 1b"
92:d:/WinAVR/bin/../lib/gcc/avr/3.4.3/../../../../avr/include/avr/delay.h **** : "=r" (__count)
93:d:/WinAVR/bin/../lib/gcc/avr/3.4.3/../../../../avr/include/avr/delay.h **** : "0" (__count)
94:d:/WinAVR/bin/../lib/gcc/avr/3.4.3/../../../../avr/include/avr/delay.h **** );
95:d:/WinAVR/bin/../lib/gcc/avr/3.4.3/../../../../avr/include/avr/delay.h **** }
96:d:/WinAVR/bin/../lib/gcc/avr/3.4.3/../../../../avr/include/avr/delay.h ****
97:d:/WinAVR/bin/../lib/gcc/avr/3.4.3/../../../../avr/include/avr/delay.h **** /** \ingroup avr_delay
98:d:/WinAVR/bin/../lib/gcc/avr/3.4.3/../../../../avr/include/avr/delay.h ****
99:d:/WinAVR/bin/../lib/gcc/avr/3.4.3/../../../../avr/include/avr/delay.h **** Delay loop using a 16-bit counter \c __count, so up to 65536
100:d:/WinAVR/bin/../lib/gcc/avr/3.4.3/../../../../avr/include/avr/delay.h **** iterations are possible. (The value 65536 would have to be
101:d:/WinAVR/bin/../lib/gcc/avr/3.4.3/../../../../avr/include/avr/delay.h **** passed as 0.) The loop executes four CPU cycles per iteration,
102:d:/WinAVR/bin/../lib/gcc/avr/3.4.3/../../../../avr/include/avr/delay.h **** not including the overhead the compiler requires to setup the
103:d:/WinAVR/bin/../lib/gcc/avr/3.4.3/../../../../avr/include/avr/delay.h **** counter register pair.
104:d:/WinAVR/bin/../lib/gcc/avr/3.4.3/../../../../avr/include/avr/delay.h ****
105:d:/WinAVR/bin/../lib/gcc/avr/3.4.3/../../../../avr/include/avr/delay.h **** Thus, at a CPU speed of 1 MHz, delays of up to about 262.1
106:d:/WinAVR/bin/../lib/gcc/avr/3.4.3/../../../../avr/include/avr/delay.h **** milliseconds can be achieved.
107:d:/WinAVR/bin/../lib/gcc/avr/3.4.3/../../../../avr/include/avr/delay.h **** */
108:d:/WinAVR/bin/../lib/gcc/avr/3.4.3/../../../../avr/include/avr/delay.h **** static __inline__ void
109:d:/WinAVR/bin/../lib/gcc/avr/3.4.3/../../../../avr/include/avr/delay.h **** _delay_loop_2(uint16_t __count)
110:d:/WinAVR/bin/../lib/gcc/avr/3.4.3/../../../../avr/include/avr/delay.h **** {
174 .LM13:
175 002c 83E7 ldi r24,lo8(1907)
176 002e 97E0 ldi r25,hi8(1907)
177 .LBB3:
111:d:/WinAVR/bin/../lib/gcc/avr/3.4.3/../../../../avr/include/avr/delay.h **** __asm__ volatile (
179 .LM14:
180 /* #APP */
181 0030 0197 1: sbiw r24,1
182 0032 F1F7 brne 1b
183 /* #NOAPP */
184 .LBE3:
185 .LBE2:
187 .Ltext4:
118:ds18b20.h ****
119:ds18b20.h **** /* 現在延遲480us~960us, 與硬件密切相關,但應盡可能選小值(480us),
120:ds18b20.h **** 把抖動留給系統(比如在延遲期間發生中斷導致延遲變長)。
121:ds18b20.h **** */
122:ds18b20.h **** wait_us(690); // 490us
123:ds18b20.h ****
124:ds18b20.h **** cli(); // 下面這段時間要求比較嚴格,為保險起見,關中斷
189 .LM15:
190 /* #APP */
191 0034 F894 cli
125:ds18b20.h **** DQ_TO_1(); // 設置1-wire總線為高電平(釋放總線)
193 .LM16:
194 /* #NOAPP */
195 0036 8B98 cbi 49-0x20,3
196 .LBB4:
198 .Ltext5:
200 .LM17:
201 0038 81EF ldi r24,lo8(241)
202 003a 90E0 ldi r25,hi8(241)
203 .LBB5:
205 .LM18:
206 /* #APP */
207 003c 0197 1: sbiw r24,1
208 003e F1F7 brne 1b
209 /* #NOAPP */
210 .LBE5:
211 .LBE4:
213 .Ltext6:
126:ds18b20.h ****
127:ds18b20.h **** /* 這個浮點數是由編譯器計算好的,而不是由你的MCU在運行時臨時計算的,
128:ds18b20.h **** 所以不會占用用戶MCU的時間,不必擔心(看看前面的宏你就可以確定了)
129:ds18b20.h **** */
130:ds18b20.h **** wait_us(87.5); // 最佳時間: 60us+7.5us!(忙延時,只是一種策略)
131:ds18b20.h ****
132:ds18b20.h **** // 探測總線上是否有器件
133:ds18b20.h **** if(DQ_status()) bus_flag=FAIL; // 復位單總線但沒有發現有器件在線
215 .LM19:
216 0040 839B sbis 48-0x20,3
217 0042 02C0 rjmp .L38
219 .LM20:
220 0044 20E0 ldi r18,lo8(0)
221 0046 01C0 rjmp .L39
222 .L38:
134:ds18b20.h **** else bus_flag=SUCC; // 復位單總線并發現有器件在線
224 .LM21:
225 0048 21E0 ldi r18,lo8(1)
226 .L39:
135:ds18b20.h ****
136:ds18b20.h **** sei(); // 退出臨界代碼區(開中斷)
228 .LM22:
229 /* #APP */
230 004a 7894 sei
231 /* #NOAPP */
232 .LBB6:
234 .Ltext7:
236 .LM23:
237 004c 81E8 ldi r24,lo8(1665)
238 004e 96E0 ldi r25,hi8(1665)
239 .LBB7:
241 .LM24:
242 /* #APP */
243 0050 0197 1: sbiw r24,1
244 0052 F1F7 brne 1b
245 /* #NOAPP */
246 .LBE7:
247 .LBE6:
249 .Ltext8:
137:ds18b20.h ****
138:ds18b20.h **** /* 保證Master釋放總線的時間(不是說總線處于高電平的時間)不小于
139:ds18b20.h **** 480us即可,這一時間從讀總線狀態之前就開始了,所以這里把這個
140:ds18b20.h **** 時間計算在內。在Master釋放總線的前半段,也是被動器件聲明它
141:ds18b20.h **** 們在線之時。
142:ds18b20.h **** */
143:ds18b20.h **** wait_us(690-87.5); // 490-67.5us
144:ds18b20.h ****
145:ds18b20.h **** return(bus_flag);
146:ds18b20.h **** }
251 .LM25:
252 0054 822F mov r24,r18
?? 快捷鍵說明
復制代碼
Ctrl + C
搜索代碼
Ctrl + F
全屏模式
F11
切換主題
Ctrl + Shift + D
顯示快捷鍵
?
增大字號
Ctrl + =
減小字號
Ctrl + -