📄 thermometer.lss
字号:
if (idx == 0xFF)
TM_Write_byte(0xCC); /* skip ROM */
else
{
TM_Write_byte(0x55); /* match ROM */
8c4: 85 e5 ldi r24, 0x55 ; 85
8c6: 0e 94 7d 03 call 0x6fa ; 0x6fa <TM_Write_byte>
8ca: 18 e0 ldi r17, 0x08 ; 8
cnt = 8;
do
TM_Write_byte(*ptr_tmp++);
8cc: 89 91 ld r24, Y+
8ce: 0e 94 7d 03 call 0x6fa ; 0x6fa <TM_Write_byte>
while (--cnt);
8d2: 11 50 subi r17, 0x01 ; 1
8d4: d9 f7 brne .-10 ; 0x8cc <TM_Sample_temperature+0x4c>
}
TM_Write_byte(0x44); /* start conversion */
8d6: 84 e4 ldi r24, 0x44 ; 68
8d8: 0e 94 7d 03 call 0x6fa ; 0x6fa <TM_Write_byte>
TM_Exit_Critical(); /* reenable interrupts */
8dc: 0f 90 pop r0
8de: 0f be out 0x3f, r0 ; 63
}
8e0: df 91 pop r29
8e2: cf 91 pop r28
8e4: 1f 91 pop r17
8e6: 08 95 ret
000008e8 <TM_Read_temperature>:
* 0xFFFF (-1) Device not present
* 0x8000 Error during read (improper CRC)
* > 0 Temperature value
*/
u_int TM_Read_temperature(u_char idx)
{
8e8: ef 92 push r14
8ea: ff 92 push r15
8ec: 0f 93 push r16
8ee: 1f 93 push r17
8f0: df 93 push r29
8f2: cf 93 push r28
8f4: cd b7 in r28, 0x3d ; 61
8f6: de b7 in r29, 0x3e ; 62
8f8: 29 97 sbiw r28, 0x09 ; 9
8fa: 0f b6 in r0, 0x3f ; 63
8fc: f8 94 cli
8fe: de bf out 0x3e, r29 ; 62
900: 0f be out 0x3f, r0 ; 63
902: cd bf out 0x3d, r28 ; 61
904: 28 2f mov r18, r24
#if DS_DEBUG && MULTI_DEVICE
hex_dump((char *)ptr_tmp, 8);
#endif
TM_Enter_Critical(); /* disable interrupts */
906: 0f b6 in r0, 0x3f ; 63
908: f8 94 cli
90a: 0f 92 push r0
*/
static u_char TM_Reset(void)
{
u_char presence;
sbi(DS_DDR, DQ); /* set DQ pin direction - output */
90c: d1 9a sbi 0x1a, 1 ; 26
cbi(DS_PORT, DQ); /* pull DQ line low */
90e: d9 98 cbi 0x1b, 1 ; 27
910: 80 ea ldi r24, 0xA0 ; 160
912: 8a 95 dec r24
914: f1 f7 brne .-4 ; 0x912 <TM_Read_temperature+0x2a>
//TM_Delay(32); /* leave it low for 480us */
_delay_us(480); //delay 480us
/* allow DQ line to return high */
cbi(DS_DDR, DQ); /* set DQ pin direction - input */
916: d1 98 cbi 0x1a, 1 ; 26
918: 84 e1 ldi r24, 0x14 ; 20
91a: 8a 95 dec r24
91c: f1 f7 brne .-4 ; 0x91a <TM_Read_temperature+0x32>
// TM_Delay(4); /* wait for presence */
_delay_us(60); //delay 4*15us
/* get presence signal */
if(bit_is_set(DS_PIN, DQ))
91e: 89 b3 in r24, 0x19 ; 25
920: 94 e6 ldi r25, 0x64 ; 100
922: 9a 95 dec r25
924: f1 f7 brne .-4 ; 0x922 <TM_Read_temperature+0x3a>
#endif
TM_Enter_Critical(); /* disable interrupts */
/* Read previously sampled value ("packet" which last byte is CRC of previous) */
if (TM_Reset())
926: 81 ff sbrs r24, 1
928: 05 c0 rjmp .+10 ; 0x934 <TM_Read_temperature+0x4c>
{ TM_Exit_Critical(); /* reenable interrupts */
92a: 0f 90 pop r0
92c: 0f be out 0x3f, r0 ; 63
92e: 2f ef ldi r18, 0xFF ; 255
930: 3f ef ldi r19, 0xFF ; 255
932: 5c c0 rjmp .+184 ; 0x9ec <TM_Read_temperature+0x104>
u_int temper;
u_char temp_buf[9];
#define crc_read ((u_char)temp_buf[8]) /* last byte is CRC */
#if (DS_DEBUG && MULTI_DEVICE) || MULTI_DEVICE
u_char *ptr_tmp = &tm_romdta[8*idx];
934: 02 2f mov r16, r18
936: 10 e0 ldi r17, 0x00 ; 0
938: 43 e0 ldi r20, 0x03 ; 3
93a: 00 0f add r16, r16
93c: 11 1f adc r17, r17
93e: 4a 95 dec r20
940: e1 f7 brne .-8 ; 0x93a <TM_Read_temperature+0x52>
942: 0e 57 subi r16, 0x7E ; 126
944: 1e 4f sbci r17, 0xFE ; 254
}
#if !MULTI_DEVICE
TM_Write_byte(0xCC); /* skip ROM */
#else
TM_Write_byte(0x55); /* match ROM */
946: 85 e5 ldi r24, 0x55 ; 85
948: 0e 94 7d 03 call 0x6fa ; 0x6fa <TM_Write_byte>
94c: 38 e0 ldi r19, 0x08 ; 8
94e: f3 2e mov r15, r19
cnt = 8;
do
TM_Write_byte(*ptr_tmp++);
950: d8 01 movw r26, r16
952: 8d 91 ld r24, X+
954: 8d 01 movw r16, r26
956: 0e 94 7d 03 call 0x6fa ; 0x6fa <TM_Write_byte>
while (--cnt);
95a: fa 94 dec r15
95c: c9 f7 brne .-14 ; 0x950 <TM_Read_temperature+0x68>
#endif
TM_Write_byte(0xBE); /* read Scratch Pad */
95e: 8e eb ldi r24, 0xBE ; 190
960: 0e 94 7d 03 call 0x6fa ; 0x6fa <TM_Write_byte>
964: 7e 01 movw r14, r28
966: 08 94 sec
968: e1 1c adc r14, r1
96a: f1 1c adc r15, r1
96c: 87 01 movw r16, r14
96e: e1 e0 ldi r30, 0x01 ; 1
for(cnt=0; cnt <= 8; cnt++) temp_buf[cnt] = TM_Read_byte();
970: 75 e0 ldi r23, 0x05 ; 5
972: 64 e1 ldi r22, 0x14 ; 20
974: ae 01 movw r20, r28
976: 46 5f subi r20, 0xF6 ; 246
978: 5f 4f sbci r21, 0xFF ; 255
do
TM_Write_byte(*ptr_tmp++);
while (--cnt);
#endif
TM_Write_byte(0xBE); /* read Scratch Pad */
97a: 20 e0 ldi r18, 0x00 ; 0
97c: 38 e0 ldi r19, 0x08 ; 8
*/
static u_char TM_Read_bit(void)
{
u_char val;
sbi(DS_DDR, DQ); /* set DQ pin direction - output */
97e: d1 9a sbi 0x1a, 1 ; 26
cbi(DS_PORT, DQ); /* pull DQ low to start timeslot */
980: d9 98 cbi 0x1b, 1 ; 27
982: 8e 2f mov r24, r30
984: 8a 95 dec r24
986: f1 f7 brne .-4 ; 0x984 <TM_Read_temperature+0x9c>
// _NOP(); /* wait 68 ns */
//COMPRESS_REENABLE;
_delay_us(0.2); //delay 200ns
sbi(DS_PORT, DQ); /* then return high DQ = 1 */
988: d9 9a sbi 0x1b, 1 ; 27
98a: 87 2f mov r24, r23
98c: 8a 95 dec r24
98e: f1 f7 brne .-4 ; 0x98c <TM_Read_temperature+0xa4>
//TM_Delay(1); /* wait 15 us */
_delay_us(15); //delay 15us
cbi(DS_DDR, DQ); /* set DQ pin direction - input */
990: d1 98 cbi 0x1a, 1 ; 26
sbi(DS_PORT, DQ); /* enable AVR internal pull-up resistor */
992: d9 9a sbi 0x1b, 1 ; 27
bit_is_set(DS_PIN, DQ) ? (val = 1) : (val = 0); /* read DQ status */
994: 89 b3 in r24, 0x19 ; 25
996: 96 2f mov r25, r22
998: 9a 95 dec r25
99a: f1 f7 brne .-4 ; 0x998 <TM_Read_temperature+0xb0>
u_char value = 0;
do
{
value >>= 1;
value |= (TM_Read_bit()) ? 0x80 : 0x00; /* read one bit */
99c: 81 fd sbrc r24, 1
99e: 02 c0 rjmp .+4 ; 0x9a4 <TM_Read_temperature+0xbc>
9a0: 80 e0 ldi r24, 0x00 ; 0
9a2: 01 c0 rjmp .+2 ; 0x9a6 <TM_Read_temperature+0xbe>
9a4: 80 e8 ldi r24, 0x80 ; 128
9a6: 26 95 lsr r18
9a8: 28 2b or r18, r24
} while (--cnt);
9aa: 31 50 subi r19, 0x01 ; 1
9ac: 41 f7 brne .-48 ; 0x97e <TM_Read_temperature+0x96>
while (--cnt);
#endif
TM_Write_byte(0xBE); /* read Scratch Pad */
for(cnt=0; cnt <= 8; cnt++) temp_buf[cnt] = TM_Read_byte();
9ae: d8 01 movw r26, r16
9b0: 2d 93 st X+, r18
9b2: 8d 01 movw r16, r26
9b4: a4 17 cp r26, r20
9b6: b5 07 cpc r27, r21
9b8: 01 f7 brne .-64 ; 0x97a <TM_Read_temperature+0x92>
TM_Exit_Critical(); /* reenable interrupts */
9ba: 0f 90 pop r0
9bc: 0f be out 0x3f, r0 ; 63
9be: 40 e0 ldi r20, 0x00 ; 0
/* check if read byte stream has correct CRC */
crc = 0;
for(cnt=0; cnt<sizeof(temp_buf); cnt++) crc = TM_Crc(crc, temp_buf[cnt]);
9c0: f7 01 movw r30, r14
9c2: 61 91 ld r22, Z+
9c4: 7f 01 movw r14, r30
9c6: 84 2f mov r24, r20
9c8: 0e 94 68 03 call 0x6d0 ; 0x6d0 <TM_Crc>
9cc: 48 2f mov r20, r24
9ce: e0 16 cp r14, r16
9d0: f1 06 cpc r15, r17
9d2: b1 f7 brne .-20 ; 0x9c0 <TM_Read_temperature+0xd8>
#if DS_DEBUG
hex_dump((char *)&temp_buf, sizeof(temp_buf));
#endif
temper = ((temp_buf[1] & 0x0F) << 8) | temp_buf[0];
9d4: 8a 81 ldd r24, Y+2 ; 0x02
9d6: 90 e0 ldi r25, 0x00 ; 0
9d8: 8f 70 andi r24, 0x0F ; 15
9da: 90 70 andi r25, 0x00 ; 0
9dc: 38 2f mov r19, r24
9de: 22 27 eor r18, r18
9e0: 89 81 ldd r24, Y+1 ; 0x01
9e2: 90 e0 ldi r25, 0x00 ; 0
9e4: 28 2b or r18, r24
9e6: 39 2b or r19, r25
if (crc)
9e8: 41 11 cpse r20, r1
{
temper |= 0x8000; /* return error (conversion can be pending) */
9ea: 30 68 ori r19, 0x80 ; 128
printf_P(PSTR("\n\rTM_read - err:%X(%X!=%X) "), temper, crc, crc_read);
#endif
}
return temper;
}
9ec: c9 01 movw r24, r18
9ee: 29 96 adiw r28, 0x09 ; 9
9f0: 0f b6 in r0, 0x3f ; 63
9f2: f8 94 cli
9f4: de bf out 0x3e, r29 ; 62
9f6: 0f be out 0x3f, r0 ; 63
9f8: cd bf out 0x3d, r28 ; 61
9fa: cf 91 pop r28
9fc: df 91 pop r29
9fe: 1f 91 pop r17
a00: 0f 91 pop r16
a02: ff 90 pop r15
a04: ef 90 pop r14
a06: 08 95 ret
00000a08 <TM_Delay>:
...
Delay1us(); /* 10us */
Delay1us(); /* 11us */
Delay1us(); /* 12us */
Delay1us(); /* 13us */
Delay1us(); /* 14us */
Delay1us(); /* 15us */
a24: 00 00 nop
}while (--cnt);
a26: 81 50 subi r24, 0x01 ; 1
a28: 79 f7 brne .-34 ; 0xa08 <TM_Delay>
COMPRESS_REENABLE;
}
a2a: 08 95 ret
00000a2c <TM_Search_rom>:
* This function scans all devices up to MAX_CHIP on 1-wire "network".
* It fills passed array with ROM patterns of found devices.
* This array is supposed to be used with TM_Read_temperature().
*/
u_char TM_Search_rom(u_char *ptr)
{
a2c: 0f 93 push r16
a2e: 1f 93 push r17
a30: cf 93 push r28
a32: df 93 push r29
a34: ec 01 movw r28, r24
u_char tm_cnt, /* number of found devices (thermometers) */
st;
u_char cnt = MAX_SEARCH;
memset(ptr, (u_char)0, 8 * MAX_CHIP);
a36: 88 e2 ldi r24, 0x28 ; 40
a38: fe 01 movw r30, r28
a3a: 11 92 st Z+, r1
a3c: 8a 95 dec r24
a3e: e9 f7 brne .-6 ; 0xa3a <TM_Search_rom+0xe>
tm_lst0 = 0;
a40: 10 92 aa 01 sts 0x01AA, r1
a44: 10 e0 ldi r17, 0x00 ; 0
a46: 04 e1 ldi r16, 0x14 ; 20
tm_cnt = 0;
do
{
st = TM_Search_next(ptr);
a48: ce 01 movw r24, r28
a4a: 0e 94 97 03 call 0x72e ; 0x72e <TM_Search_next>
#if DS_DEBUG
printf_P(PSTR("st:%u "), st);
#endif
if (st)
a4e: 88 23 and r24, r24
a50: 79 f0 breq .+30 ; 0xa70 <TM_Search_rom+0x44>
{
tm_cnt++;
a52: 1f 5f subi r17, 0xFF ; 255
if ((st == 1) && (tm_cnt < MAX_CHIP))
a54: 81 30 cpi r24, 0x01 ; 1
a56: 79 f4 brne .+30 ; 0xa76 <TM_Search_rom+0x4a>
a58: 15 30 cpi r17, 0x05 ; 5
a5a: 88 f4 brcc .+34 ; 0xa7e <TM_Search_rom+0x52>
{
memcpy(ptr + 8, ptr, 8);
a5c: de
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -