?? ds18b20.lst
字號(hào):
1 .file "ds18b20.c"
2 .arch atmega8
3 __SREG__ = 0x3f
4 __SP_H__ = 0x3e
5 __SP_L__ = 0x3d
6 __tmp_reg__ = 0
7 __zero_reg__ = 1
8 .global __do_copy_data
9 .global __do_clear_bss
11 .text
12 .Ltext0:
124 .global convert_is_succ
125 .global convert_is_succ
126 .section .bss
129 convert_is_succ:
130 0000 00 .skip 1,0
131 .text
133 .global ds18b20_config
135 ds18b20_config:
1:drive/ds18b20.c **** #include "inc/config.h"
2:drive/ds18b20.c ****
3:drive/ds18b20.c ****
4:drive/ds18b20.c **** #define DQ_18B20 (1<<3) // PD3
5:drive/ds18b20.c **** #define DQ_TO_0() (DDRD |= DQ_18B20) // PD3='0'
6:drive/ds18b20.c **** #define DQ_TO_1() (DDRD &= ~DQ_18B20) // PD3='float'
7:drive/ds18b20.c **** #define DQ_status() (PIND & DQ_18B20) // read PD3 pin
8:drive/ds18b20.c ****
9:drive/ds18b20.c **** /* 請(qǐng)認(rèn)真檢查你的AVR微控制器的時(shí)鐘頻率! 特別注意:頻率
10:drive/ds18b20.c **** * 定義的單位是MHz! 并且請(qǐng)使用浮點(diǎn)數(shù)! 假如你的晶振是12MHz,
11:drive/ds18b20.c **** * 你應(yīng)該寫成12.0000或12.0之類。
12:drive/ds18b20.c **** * 我的實(shí)驗(yàn)電路的晶振是8.0000MHz
13:drive/ds18b20.c **** */
14:drive/ds18b20.c **** #ifndef CPU_CRYSTAL
15:drive/ds18b20.c **** #define CPU_CRYSTAL (8.0000)
16:drive/ds18b20.c **** #endif
17:drive/ds18b20.c ****
18:drive/ds18b20.c **** #define wait_us(us)\
19:drive/ds18b20.c **** _delay_loop_2((u16)((us)*CPU_CRYSTAL/4))
20:drive/ds18b20.c ****
21:drive/ds18b20.c **** /*---------------- 函數(shù)原型聲明 ------------------*/
22:drive/ds18b20.c **** // 1個(gè)初始化模塊
23:drive/ds18b20.c **** void ds18b20_config(void); // 配置端口
24:drive/ds18b20.c ****
25:drive/ds18b20.c **** // 3個(gè)基本模塊
26:drive/ds18b20.c **** inline BOOL ds18b20_reset(void); // 復(fù)位DS18B20
27:drive/ds18b20.c **** void ds18b20_write(u08 dat); // 寫字節(jié)到DS18B20
28:drive/ds18b20.c **** u08 ds18b20_read(void); // 讀字節(jié)從DS18B20
29:drive/ds18b20.c ****
30:drive/ds18b20.c **** // 2個(gè)應(yīng)用模塊
31:drive/ds18b20.c **** BOOL convert_T(void); // 啟動(dòng)溫度轉(zhuǎn)換
32:drive/ds18b20.c **** u08 read_T(void); // 讀取轉(zhuǎn)換值
33:drive/ds18b20.c ****
34:drive/ds18b20.c ****
35:drive/ds18b20.c **** /*-------------------------------------------------------
36:drive/ds18b20.c **** * 配置(使能)AVR與DS18B20的接口
37:drive/ds18b20.c **** */
38:drive/ds18b20.c **** void ds18b20_config(void)
39:drive/ds18b20.c **** {
137 .LM1:
138 /* prologue: frame size=0 */
139 /* prologue end (size=0) */
40:drive/ds18b20.c **** DDRD &= ~DQ_18B20; // 輸入模式(上電時(shí)為高電平)
141 .LM2:
142 0000 8B98 cbi 49-0x20,3
41:drive/ds18b20.c **** PORTD &= ~DQ_18B20; // 輸出鎖存器寫0,以后不再更改
144 .LM3:
145 0002 9398 cbi 50-0x20,3
146 /* epilogue: frame size=0 */
147 0004 0895 ret
148 /* epilogue end (size=1) */
149 /* function ds18b20_config size 3 (2) */
151 .Lscope0:
153 .global _ds18b20_reset
155 _ds18b20_reset:
42:drive/ds18b20.c **** }
43:drive/ds18b20.c ****
44:drive/ds18b20.c **** /*-------------------------------------------------------
45:drive/ds18b20.c **** * 復(fù)位1-wire總線,并探測(cè)是否有溫度芯片DS18B20(TO-92
46:drive/ds18b20.c **** * 封裝)掛在總線上,有返回SUCC,沒有返回FAIL
47:drive/ds18b20.c **** */
48:drive/ds18b20.c **** BOOL _ds18b20_reset(void)
49:drive/ds18b20.c **** {
157 .LM4:
158 /* prologue: frame size=0 */
159 /* prologue end (size=0) */
50:drive/ds18b20.c **** BOOL bus_flag;
51:drive/ds18b20.c ****
52:drive/ds18b20.c **** DQ_TO_0(); // 設(shè)置1-wire總線為低電平(占領(lǐng)總線)...
161 .LM5:
162 0006 8B9A sbi 49-0x20,3
163 .LBB2:
165 .Ltext1:
1:d:/WinAVR/avr/include/util/delay.h **** /* Copyright (c) 2002, Marek Michalkiewicz
2:d:/WinAVR/avr/include/util/delay.h **** Copyright (c) 2004,2005 Joerg Wunsch
3:d:/WinAVR/avr/include/util/delay.h **** All rights reserved.
4:d:/WinAVR/avr/include/util/delay.h ****
5:d:/WinAVR/avr/include/util/delay.h **** Redistribution and use in source and binary forms, with or without
6:d:/WinAVR/avr/include/util/delay.h **** modification, are permitted provided that the following conditions are met:
7:d:/WinAVR/avr/include/util/delay.h ****
8:d:/WinAVR/avr/include/util/delay.h **** * Redistributions of source code must retain the above copyright
9:d:/WinAVR/avr/include/util/delay.h **** notice, this list of conditions and the following disclaimer.
10:d:/WinAVR/avr/include/util/delay.h ****
11:d:/WinAVR/avr/include/util/delay.h **** * Redistributions in binary form must reproduce the above copyright
12:d:/WinAVR/avr/include/util/delay.h **** notice, this list of conditions and the following disclaimer in
13:d:/WinAVR/avr/include/util/delay.h **** the documentation and/or other materials provided with the
14:d:/WinAVR/avr/include/util/delay.h **** distribution.
15:d:/WinAVR/avr/include/util/delay.h ****
16:d:/WinAVR/avr/include/util/delay.h **** * Neither the name of the copyright holders nor the names of
17:d:/WinAVR/avr/include/util/delay.h **** contributors may be used to endorse or promote products derived
18:d:/WinAVR/avr/include/util/delay.h **** from this software without specific prior written permission.
19:d:/WinAVR/avr/include/util/delay.h ****
20:d:/WinAVR/avr/include/util/delay.h **** THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS "AS IS"
21:d:/WinAVR/avr/include/util/delay.h **** AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE
22:d:/WinAVR/avr/include/util/delay.h **** IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE
23:d:/WinAVR/avr/include/util/delay.h **** ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT OWNER OR CONTRIBUTORS BE
24:d:/WinAVR/avr/include/util/delay.h **** LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR
25:d:/WinAVR/avr/include/util/delay.h **** CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF
26:d:/WinAVR/avr/include/util/delay.h **** SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS
27:d:/WinAVR/avr/include/util/delay.h **** INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN
28:d:/WinAVR/avr/include/util/delay.h **** CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE)
29:d:/WinAVR/avr/include/util/delay.h **** ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE
30:d:/WinAVR/avr/include/util/delay.h **** POSSIBILITY OF SUCH DAMAGE. */
31:d:/WinAVR/avr/include/util/delay.h ****
32:d:/WinAVR/avr/include/util/delay.h **** /* $Id: delay.h,v 1.1.2.1 2005/12/12 23:19:49 joerg_wunsch Exp $ */
33:d:/WinAVR/avr/include/util/delay.h ****
34:d:/WinAVR/avr/include/util/delay.h **** #ifndef _UTIL_DELAY_H_
35:d:/WinAVR/avr/include/util/delay.h **** #define _UTIL_DELAY_H_ 1
36:d:/WinAVR/avr/include/util/delay.h ****
37:d:/WinAVR/avr/include/util/delay.h **** #include <inttypes.h>
38:d:/WinAVR/avr/include/util/delay.h ****
39:d:/WinAVR/avr/include/util/delay.h **** /** \defgroup util_delay <util/delay.h>: Busy-wait delay loops
40:d:/WinAVR/avr/include/util/delay.h **** \code
41:d:/WinAVR/avr/include/util/delay.h **** #define F_CPU 1000000UL // 1 MHz
42:d:/WinAVR/avr/include/util/delay.h **** //#define F_CPU 14.7456E6
43:d:/WinAVR/avr/include/util/delay.h **** #include <util/delay.h>
44:d:/WinAVR/avr/include/util/delay.h **** \endcode
45:d:/WinAVR/avr/include/util/delay.h ****
46:d:/WinAVR/avr/include/util/delay.h **** \note As an alternative method, it is possible to pass the
47:d:/WinAVR/avr/include/util/delay.h **** F_CPU macro down to the compiler from the Makefile.
48:d:/WinAVR/avr/include/util/delay.h **** Obviously, in that case, no \c \#define statement should be
49:d:/WinAVR/avr/include/util/delay.h **** used.
50:d:/WinAVR/avr/include/util/delay.h ****
51:d:/WinAVR/avr/include/util/delay.h **** The functions in this header file implement simple delay loops
52:d:/WinAVR/avr/include/util/delay.h **** that perform a busy-waiting. They are typically used to
53:d:/WinAVR/avr/include/util/delay.h **** facilitate short delays in the program execution. They are
54:d:/WinAVR/avr/include/util/delay.h **** implemented as count-down loops with a well-known CPU cycle
55:d:/WinAVR/avr/include/util/delay.h **** count per loop iteration. As such, no other processing can
56:d:/WinAVR/avr/include/util/delay.h **** occur simultaneously. It should be kept in mind that the
57:d:/WinAVR/avr/include/util/delay.h **** functions described here do not disable interrupts.
58:d:/WinAVR/avr/include/util/delay.h ****
59:d:/WinAVR/avr/include/util/delay.h **** In general, for long delays, the use of hardware timers is
60:d:/WinAVR/avr/include/util/delay.h **** much preferrable, as they free the CPU, and allow for
61:d:/WinAVR/avr/include/util/delay.h **** concurrent processing of other events while the timer is
62:d:/WinAVR/avr/include/util/delay.h **** running. However, in particular for very short delays, the
63:d:/WinAVR/avr/include/util/delay.h **** overhead of setting up a hardware timer is too much compared
64:d:/WinAVR/avr/include/util/delay.h **** to the overall delay time.
65:d:/WinAVR/avr/include/util/delay.h ****
66:d:/WinAVR/avr/include/util/delay.h **** Two inline functions are provided for the actual delay algorithms.
67:d:/WinAVR/avr/include/util/delay.h ****
68:d:/WinAVR/avr/include/util/delay.h **** Two wrapper functions allow the specification of microsecond, and
69:d:/WinAVR/avr/include/util/delay.h **** millisecond delays directly, using the application-supplied macro
70:d:/WinAVR/avr/include/util/delay.h **** F_CPU as the CPU clock frequency (in Hertz). These functions
71:d:/WinAVR/avr/include/util/delay.h **** operate on double typed arguments, however when optimization is
72:d:/WinAVR/avr/include/util/delay.h **** turned on, the entire floating-point calculation will be done at
73:d:/WinAVR/avr/include/util/delay.h **** compile-time.
74:d:/WinAVR/avr/include/util/delay.h ****
75:d:/WinAVR/avr/include/util/delay.h **** \note When using _delay_us() and _delay_ms(), the expressions
76:d:/WinAVR/avr/include/util/delay.h **** passed as arguments to these functions shall be compile-time
77:d:/WinAVR/avr/include/util/delay.h **** constants, otherwise the floating-point calculations to setup the
78:d:/WinAVR/avr/include/util/delay.h **** loops will be done at run-time, thereby drastically increasing
79:d:/WinAVR/avr/include/util/delay.h **** both the resulting code size, as well as the time required to
80:d:/WinAVR/avr/include/util/delay.h **** setup the loops.
81:d:/WinAVR/avr/include/util/delay.h **** */
82:d:/WinAVR/avr/include/util/delay.h ****
83:d:/WinAVR/avr/include/util/delay.h **** #if !defined(__DOXYGEN__)
84:d:/WinAVR/avr/include/util/delay.h **** static inline void _delay_loop_1(uint8_t __count) __attribute__((always_inline));
85:d:/WinAVR/avr/include/util/delay.h **** static inline void _delay_loop_2(uint16_t __count) __attribute__((always_inline));
86:d:/WinAVR/avr/include/util/delay.h **** static inline void _delay_us(double __us) __attribute__((always_inline));
87:d:/WinAVR/avr/include/util/delay.h **** static inline void _delay_ms(double __ms) __attribute__((always_inline));
88:d:/WinAVR/avr/include/util/delay.h **** #endif
89:d:/WinAVR/avr/include/util/delay.h ****
90:d:/WinAVR/avr/include/util/delay.h **** /** \ingroup util_delay
91:d:/WinAVR/avr/include/util/delay.h ****
92:d:/WinAVR/avr/include/util/delay.h **** Delay loop using an 8-bit counter \c __count, so up to 256
93:d:/WinAVR/avr/include/util/delay.h **** iterations are possible. (The value 256 would have to be passed
94:d:/WinAVR/avr/include/util/delay.h **** as 0.) The loop executes three CPU cycles per iteration, not
95:d:/WinAVR/avr/include/util/delay.h **** including the overhead the compiler needs to setup the counter
96:d:/WinAVR/avr/include/util/delay.h **** register.
97:d:/WinAVR/avr/include/util/delay.h ****
98:d:/WinAVR/avr/include/util/delay.h **** Thus, at a CPU speed of 1 MHz, delays of up to 768 microseconds
99:d:/WinAVR/avr/include/util/delay.h **** can be achieved.
100:d:/WinAVR/avr/include/util/delay.h **** */
101:d:/WinAVR/avr/include/util/delay.h **** void
102:d:/WinAVR/avr/include/util/delay.h **** _delay_loop_1(uint8_t __count)
103:d:/WinAVR/avr/include/util/delay.h **** {
104:d:/WinAVR/avr/include/util/delay.h **** __asm__ volatile (
105:d:/WinAVR/avr/include/util/delay.h **** "1: dec %0" "\n\t"
106:d:/WinAVR/avr/include/util/delay.h **** "brne 1b"
107:d:/WinAVR/avr/include/util/delay.h **** : "=r" (__count)
108:d:/WinAVR/avr/include/util/delay.h **** : "0" (__count)
109:d:/WinAVR/avr/include/util/delay.h **** );
110:d:/WinAVR/avr/include/util/delay.h **** }
111:d:/WinAVR/avr/include/util/delay.h ****
112:d:/WinAVR/avr/include/util/delay.h **** /** \ingroup util_delay
113:d:/WinAVR/avr/include/util/delay.h ****
114:d:/WinAVR/avr/include/util/delay.h **** Delay loop using a 16-bit counter \c __count, so up to 65536
115:d:/WinAVR/avr/include/util/delay.h **** iterations are possible. (The value 65536 would have to be
116:d:/WinAVR/avr/include/util/delay.h **** passed as 0.) The loop executes four CPU cycles per iteration,
117:d:/WinAVR/avr/include/util/delay.h **** not including the overhead the compiler requires to setup the
118:d:/WinAVR/avr/include/util/delay.h **** counter register pair.
119:d:/WinAVR/avr/include/util/delay.h ****
120:d:/WinAVR/avr/include/util/delay.h **** Thus, at a CPU speed of 1 MHz, delays of up to about 262.1
121:d:/WinAVR/avr/include/util/delay.h **** milliseconds can be achieved.
122:d:/WinAVR/avr/include/util/delay.h **** */
123:d:/WinAVR/avr/include/util/delay.h **** void
124:d:/WinAVR/avr/include/util/delay.h **** _delay_loop_2(uint16_t __count)
125:d:/WinAVR/avr/include/util/delay.h **** {
167 .LM6:
168 0008 84ED ldi r24,lo8(980)
169 000a 93E0 ldi r25,hi8(980)
170 .LBB3:
126:d:/WinAVR/avr/include/util/delay.h **** __asm__ volatile (
172 .LM7:
173 /* #APP */
174 000c 0197 1: sbiw r24,1
175 000e F1F7 brne 1b
176 /* #NOAPP */
177 .LBE3:
178 .LBE2:
180 .Ltext2:
53:drive/ds18b20.c ****
54:drive/ds18b20.c **** /* 現(xiàn)在延遲480us~960us, 與硬件密切相關(guān),但應(yīng)盡可能選小值(480us),
55:drive/ds18b20.c **** 把抖動(dòng)留給系統(tǒng)(比如在延遲期間發(fā)生中斷導(dǎo)致延遲變長)。
56:drive/ds18b20.c **** */
57:drive/ds18b20.c **** wait_us(490); // 490us
58:drive/ds18b20.c ****
59:drive/ds18b20.c **** cli(); // 下面這段時(shí)間要求比較嚴(yán)格,為保險(xiǎn)起見,關(guān)中斷
182 .LM8:
183 /* #APP */
184 0010 F894 cli
60:drive/ds18b20.c **** DQ_TO_1(); // 設(shè)置1-wire總線為高電平(釋放總線)
186 .LM9:
187 /* #NOAPP */
188 0012 8B98 cbi 49-0x20,3
189 .LBB4:
191 .Ltext3:
193 .LM10:
194 0014 87E8 ldi r24,lo8(135)
195 0016 90E0 ldi r25,hi8(135)
196 .LBB5:
198 .LM11:
199 /* #APP */
200 0018 0197 1: sbiw r24,1
201 001a F1F7 brne 1b
202 /* #NOAPP */
203 .LBE5:
204 .LBE4:
206 .Ltext4:
61:drive/ds18b20.c ****
62:drive/ds18b20.c **** /* 這個(gè)浮點(diǎn)數(shù)是由編譯器計(jì)算好的,而不是由你的MCU在運(yùn)行時(shí)臨時(shí)計(jì)算的,
63:drive/ds18b20.c **** 所以不會(huì)占用用戶MCU的時(shí)間,不必?fù)?dān)心(看看前面的宏你就可以確定了)
64:drive/ds18b20.c **** */
65:drive/ds18b20.c **** wait_us(67.5); // 最佳時(shí)間: 60us+7.5us!(忙延時(shí),只是一種策略)
66:drive/ds18b20.c ****
67:drive/ds18b20.c **** // 探測(cè)總線上是否有器件
68:drive/ds18b20.c **** if(DQ_status()) bus_flag=FAIL; // 復(fù)位單總線但沒有發(fā)現(xiàn)有器件在線
208 .LM12:
209 001c 839B sbis 48-0x20,3
210 001e 02C0 rjmp .L5
212 .LM13:
213 0020 20E0 ldi r18,lo8(0)
214 0022 01C0 rjmp .L6
215 .L5:
69:drive/ds18b20.c **** else bus_flag=SUCC; // 復(fù)位單總線并發(fā)現(xiàn)有器件在線
217 .LM14:
218 0024 21E0 ldi r18,lo8(1)
219 .L6:
70:drive/ds18b20.c ****
71:drive/ds18b20.c **** sei(); // 退出臨界代碼區(qū)(開中斷)
221 .LM15:
222 /* #APP */
223 0026 7894 sei
224 /* #NOAPP */
225 .LBB6:
227 .Ltext5:
229 .LM16:
230 0028 8DE4 ldi r24,lo8(845)
231 002a 93E0 ldi r25,hi8(845)
232 .LBB7:
234 .LM17:
235 /* #APP */
236 002c 0197 1: sbiw r24,1
237 002e F1F7 brne 1b
238 /* #NOAPP */
239 .LBE7:
240 .LBE6:
242 .Ltext6:
72:drive/ds18b20.c ****
73:drive/ds18b20.c **** /* 保證Master釋放總線的時(shí)間(不是說總線處于高電平的時(shí)間)不小于
74:drive/ds18b20.c **** 480us即可,這一時(shí)間從讀總線狀態(tài)之前就開始了,所以這里把這個(gè)
75:drive/ds18b20.c **** 時(shí)間計(jì)算在內(nèi)。在Master釋放總線的前半段,也是被動(dòng)器件聲明它
76:drive/ds18b20.c **** 們?cè)诰€之時(shí)。
77:drive/ds18b20.c **** */
78:drive/ds18b20.c **** wait_us(490-67.5); // 490-67.5us
79:drive/ds18b20.c ****
80:drive/ds18b20.c **** return(bus_flag);
81:drive/ds18b20.c **** }
244 .LM18:
245 0030 822F mov r24,r18
246 0032 9927 clr r25
247 /* epilogue: frame size=0 */
248 0034 0895 ret
249 /* epilogue end (size=1) */
250 /* function _ds18b20_reset size 32 (31) */
264 .Lscope1:
266 .global ds18b20_reset
268 ds18b20_reset:
82:drive/ds18b20.c ****
83:drive/ds18b20.c **** /*--------------------------------------------------------
?? 快捷鍵說明
復(fù)制代碼
Ctrl + C
搜索代碼
Ctrl + F
全屏模式
F11
切換主題
Ctrl + Shift + D
顯示快捷鍵
?
增大字號(hào)
Ctrl + =
減小字號(hào)
Ctrl + -