⭐ 欢迎来到虫虫下载站! | 📦 资源下载 📁 资源专辑 ℹ️ 关于我们
⭐ 虫虫下载站

📄 thermometer.lss

📁 ds18b20 thermometer with lcd, ds18b20 thermometer with lcd, ds18b20 thermometer with lcd
💻 LSS
📖 第 1 页 / 共 5 页
字号:

    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 + -