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

📄 main.lss

📁 m16 的adc
💻 LSS
字号:

main.elf:     file format elf32-avr

Sections:
Idx Name          Size      VMA       LMA       File off  Algn
  0 .text         0000029c  00000000  00000000  00000094  2**0
                  CONTENTS, ALLOC, LOAD, READONLY, CODE
  1 .data         00000000  00800060  0000029c  00000330  2**0
                  CONTENTS, ALLOC, LOAD, DATA
  2 .bss          0000000b  00800060  00800060  00000330  2**0
                  ALLOC
  3 .noinit       00000000  0080006b  0080006b  00000330  2**0
                  CONTENTS
  4 .eeprom       00000000  00810000  00810000  00000330  2**0
                  CONTENTS
  5 .debug_aranges 00000014  00000000  00000000  00000330  2**0
                  CONTENTS, READONLY, DEBUGGING
  6 .debug_pubnames 0000009f  00000000  00000000  00000344  2**0
                  CONTENTS, READONLY, DEBUGGING
  7 .debug_info   0000020a  00000000  00000000  000003e3  2**0
                  CONTENTS, READONLY, DEBUGGING
  8 .debug_abbrev 000000f1  00000000  00000000  000005ed  2**0
                  CONTENTS, READONLY, DEBUGGING
  9 .debug_line   000001b8  00000000  00000000  000006de  2**0
                  CONTENTS, READONLY, DEBUGGING
 10 .debug_str    00000117  00000000  00000000  00000896  2**0
                  CONTENTS, READONLY, DEBUGGING
Disassembly of section .text:

00000000 <__vectors>:
   0:	0c 94 2a 00 	jmp	0x54
   4:	0c 94 45 00 	jmp	0x8a
   8:	0c 94 45 00 	jmp	0x8a
   c:	0c 94 45 00 	jmp	0x8a
  10:	0c 94 45 00 	jmp	0x8a
  14:	0c 94 45 00 	jmp	0x8a
  18:	0c 94 45 00 	jmp	0x8a
  1c:	0c 94 45 00 	jmp	0x8a
  20:	0c 94 45 00 	jmp	0x8a
  24:	0c 94 45 00 	jmp	0x8a
  28:	0c 94 45 00 	jmp	0x8a
  2c:	0c 94 45 00 	jmp	0x8a
  30:	0c 94 45 00 	jmp	0x8a
  34:	0c 94 45 00 	jmp	0x8a
  38:	0c 94 67 00 	jmp	0xce
  3c:	0c 94 45 00 	jmp	0x8a
  40:	0c 94 45 00 	jmp	0x8a
  44:	0c 94 45 00 	jmp	0x8a
  48:	0c 94 45 00 	jmp	0x8a
  4c:	0c 94 45 00 	jmp	0x8a
  50:	0c 94 45 00 	jmp	0x8a

00000054 <__ctors_end>:
  54:	11 24       	eor	r1, r1
  56:	1f be       	out	0x3f, r1	; 63
  58:	cf e5       	ldi	r28, 0x5F	; 95
  5a:	d4 e0       	ldi	r29, 0x04	; 4
  5c:	de bf       	out	0x3e, r29	; 62
  5e:	cd bf       	out	0x3d, r28	; 61

00000060 <__do_copy_data>:
  60:	10 e0       	ldi	r17, 0x00	; 0
  62:	a0 e6       	ldi	r26, 0x60	; 96
  64:	b0 e0       	ldi	r27, 0x00	; 0
  66:	ec e9       	ldi	r30, 0x9C	; 156
  68:	f2 e0       	ldi	r31, 0x02	; 2
  6a:	02 c0       	rjmp	.+4      	; 0x70

0000006c <.do_copy_data_loop>:
  6c:	05 90       	lpm	r0, Z+
  6e:	0d 92       	st	X+, r0

00000070 <.do_copy_data_start>:
  70:	a0 36       	cpi	r26, 0x60	; 96
  72:	b1 07       	cpc	r27, r17
  74:	d9 f7       	brne	.-10     	; 0x6c

00000076 <__do_clear_bss>:
  76:	10 e0       	ldi	r17, 0x00	; 0
  78:	a0 e6       	ldi	r26, 0x60	; 96
  7a:	b0 e0       	ldi	r27, 0x00	; 0
  7c:	01 c0       	rjmp	.+2      	; 0x80

0000007e <.do_clear_bss_loop>:
  7e:	1d 92       	st	X+, r1

00000080 <.do_clear_bss_start>:
  80:	ab 36       	cpi	r26, 0x6B	; 107
  82:	b1 07       	cpc	r27, r17
  84:	e1 f7       	brne	.-8      	; 0x7e
  86:	0c 94 7e 00 	jmp	0xfc

0000008a <__bad_interrupt>:
  8a:	0c 94 00 00 	jmp	0x0

0000008e <read_adc>:
//仿真时在watch窗口,监控这些全局变量。

unsigned int read_adc(unsigned char adc_input)//查询方式读取ADC单端通道
{
    ADMUX=(0xc0|adc_input);					//adc_input:单端通道 0x00~0x07,0x1E,0x1F
  8e:	80 6c       	ori	r24, 0xC0	; 192
  90:	87 b9       	out	0x07, r24	; 7
    //0xc0:选择内部2.56V参考电压
    ADCSRA|=(1<<ADSC);						//启动AD转换
  92:	36 9a       	sbi	0x06, 6	; 6
    loop_until_bit_is_set(ADCSRA,ADIF);		//方法1 等待AD转换结束
  94:	34 9b       	sbis	0x06, 4	; 6
  96:	fe cf       	rjmp	.-4      	; 0x94
//  while ((ADCSRA&(1<<ADIF))==0);			//写法2 这种写法优化不好
//  loop_until_bit_is_clear(ADCSRA,ADSC);	//方法2 检测ADSC=0也行
    ADCSRA|=(1<<ADIF);						//写1清除标志位
  98:	34 9a       	sbi	0x06, 4	; 6
    return ADC;							//ADC=ADCH:ADCL
  9a:	84 b1       	in	r24, 0x04	; 4
  9c:	95 b1       	in	r25, 0x05	; 5
  9e:	08 95       	ret

000000a0 <read_adc_diff>:
}

int read_adc_diff(unsigned char adc_input)//查询方式读取ADC差分通道
{
    unsigned int ADC_FIX;
    ADMUX=(0xc0|adc_input);				//adc_input:差分通道 0x08~0x1D
  a0:	80 6c       	ori	r24, 0xC0	; 192
  a2:	87 b9       	out	0x07, r24	; 7
		__ticks = 1;
	else if (__tmp > 65535)
		__ticks = 0;	/* i.e. 65536 */
	else
		__ticks = (uint16_t)__tmp;
  a4:	8a ef       	ldi	r24, 0xFA	; 250
  a6:	90 e0       	ldi	r25, 0x00	; 0
  a8:	01 97       	sbiw	r24, 0x01	; 1
  aa:	f1 f7       	brne	.-4      	; 0xa8
    _delay_ms(1);						//等待差分增益稳定>125uS
    ADCSRA|=(1<<ADSC);
  ac:	36 9a       	sbi	0x06, 6	; 6
    loop_until_bit_is_set(ADCSRA,ADIF);
  ae:	34 9b       	sbis	0x06, 4	; 6
  b0:	fe cf       	rjmp	.-4      	; 0xae
    ADCSRA|=(1<<ADIF);
  b2:	34 9a       	sbi	0x06, 4	; 6
    //当切换到差分增益通道,由于自动偏移抵消电路需要沉积时间,第一次转换结果准确率很低。用户最好舍弃第一次转换结果。
    ADCSRA|=(1<<ADSC);
  b4:	36 9a       	sbi	0x06, 6	; 6
    loop_until_bit_is_set(ADCSRA,ADIF);
  b6:	34 9b       	sbis	0x06, 4	; 6
  b8:	fe cf       	rjmp	.-4      	; 0xb6
    ADCSRA|=(1<<ADIF);
  ba:	34 9a       	sbi	0x06, 4	; 6
    ADC_FIX=ADC;
  bc:	84 b1       	in	r24, 0x04	; 4
  be:	95 b1       	in	r25, 0x05	; 5
    //输出结果用2的补码形式表示
    //可正可负 +/-9bit -512~+511
    //即M16差分通道的ADC+输入端的电压可以大于ADC-,也可以小于ADC-。
    //Tiny26就不行,ADC+输入端的电压必须大于或等于ADC-,为+10bit
    if (ADC_FIX>=0x0200)				//负数要变换,正数不用
  c0:	22 e0       	ldi	r18, 0x02	; 2
  c2:	80 30       	cpi	r24, 0x00	; 0
  c4:	92 07       	cpc	r25, r18
  c6:	08 f0       	brcs	.+2      	; 0xca
    {
        ADC_FIX|=0xFC00;				//变换成16位无符号整数
  c8:	9c 6f       	ori	r25, 0xFC	; 252
    }
    return (int)ADC_FIX;
}
  ca:	08 95       	ret
  cc:	08 95       	ret

000000ce <__vector_14>:
SIGNAL(SIG_ADC) //ADC中断服务程序
{
  ce:	1f 92       	push	r1
  d0:	0f 92       	push	r0
  d2:	0f b6       	in	r0, 0x3f	; 63
  d4:	0f 92       	push	r0
  d6:	11 24       	eor	r1, r1
  d8:	8f 93       	push	r24
  da:	9f 93       	push	r25
    //硬件自动清除ADIF标志位
    ADC_INT_SE=ADC;						//读取结果
  dc:	84 b1       	in	r24, 0x04	; 4
  de:	95 b1       	in	r25, 0x05	; 5
  e0:	90 93 62 00 	sts	0x0062, r25
  e4:	80 93 61 00 	sts	0x0061, r24
    ADC_OK=1;
  e8:	81 e0       	ldi	r24, 0x01	; 1
  ea:	80 93 60 00 	sts	0x0060, r24
  ee:	9f 91       	pop	r25
  f0:	8f 91       	pop	r24
  f2:	0f 90       	pop	r0
  f4:	0f be       	out	0x3f, r0	; 63
  f6:	0f 90       	pop	r0
  f8:	1f 90       	pop	r1
  fa:	18 95       	reti

000000fc <main>:
}


int main(void)
{
  fc:	cf e5       	ldi	r28, 0x5F	; 95
  fe:	d4 e0       	ldi	r29, 0x04	; 4
 100:	de bf       	out	0x3e, r29	; 62
 102:	cd bf       	out	0x3d, r28	; 61
    long temp32;
    ADC_SingleEnded =0;
 104:	10 92 64 00 	sts	0x0064, r1
 108:	10 92 63 00 	sts	0x0063, r1
    ADC_Diff=0;
 10c:	10 92 6a 00 	sts	0x006A, r1
 110:	10 92 69 00 	sts	0x0069, r1
    ADC_INT_SE=0; 
 114:	10 92 62 00 	sts	0x0062, r1
 118:	10 92 61 00 	sts	0x0061, r1

    //上电默认DDRx=0x00,PORTx=0x00 输入,无上拉电阻
    PORTB=0xFF;							//不用的管脚使能内部上拉电阻。
 11c:	8f ef       	ldi	r24, 0xFF	; 255
 11e:	88 bb       	out	0x18, r24	; 24
    PORTC=0xFF;
 120:	85 bb       	out	0x15, r24	; 21
    PORTD=0xFF;
 122:	82 bb       	out	0x12, r24	; 18
    PORTA=~((1<<in_Single)|(1<<in_Diff_P)|(1<<in_Diff_N)); //作ADC输入时,不可使能内部上拉电阻。
 124:	82 ef       	ldi	r24, 0xF2	; 242
 126:	8b bb       	out	0x1b, r24	; 27

    ADCSRA=(1<<ADEN)|0x06;				//使能ADC,时钟64分频 125KHz@8MHz system clock
 128:	86 e8       	ldi	r24, 0x86	; 134
 12a:	86 b9       	out	0x06, r24	; 6
    sei();								//使能全局中断
 12c:	78 94       	sei
    while (1)
    {
        //实测的Vref引脚电压 =2556mV
        ADC_SingleEnded=read_adc(AD_SE_ADC0);
 12e:	80 e0       	ldi	r24, 0x00	; 0
 130:	0e 94 47 00 	call	0x8e
 134:	90 93 64 00 	sts	0x0064, r25
 138:	80 93 63 00 	sts	0x0063, r24
        //查询方式读取ADC0
        temp32=(long)ADC_SingleEnded*Vref;
 13c:	aa 27       	eor	r26, r26
 13e:	bb 27       	eor	r27, r27
 140:	bc 01       	movw	r22, r24
 142:	cd 01       	movw	r24, r26
 144:	2c ef       	ldi	r18, 0xFC	; 252
 146:	39 e0       	ldi	r19, 0x09	; 9
 148:	40 e0       	ldi	r20, 0x00	; 0
 14a:	50 e0       	ldi	r21, 0x00	; 0
 14c:	0e 94 f2 00 	call	0x1e4
        LED_Volt=(unsigned int)(temp32/1024);
 150:	9b 01       	movw	r18, r22
 152:	ac 01       	movw	r20, r24
 154:	97 ff       	sbrs	r25, 7
 156:	04 c0       	rjmp	.+8      	; 0x160
 158:	21 50       	subi	r18, 0x01	; 1
 15a:	3c 4f       	sbci	r19, 0xFC	; 252
 15c:	4f 4f       	sbci	r20, 0xFF	; 255
 15e:	5f 4f       	sbci	r21, 0xFF	; 255
 160:	8a e0       	ldi	r24, 0x0A	; 10
 162:	55 95       	asr	r21
 164:	47 95       	ror	r20
 166:	37 95       	ror	r19
 168:	27 95       	ror	r18
 16a:	8a 95       	dec	r24
 16c:	d1 f7       	brne	.-12     	; 0x162
 16e:	30 93 68 00 	sts	0x0068, r19
 172:	20 93 67 00 	sts	0x0067, r18

        ADC_Diff =read_adc_diff(AD_Diff3_2_10x);
 176:	8d e0       	ldi	r24, 0x0D	; 13
 178:	0e 94 50 00 	call	0xa0
 17c:	90 93 6a 00 	sts	0x006A, r25
 180:	80 93 69 00 	sts	0x0069, r24
        ADC_Diff-=read_adc_diff(AD_Diff2_2_10x);//校准OFFSET
 184:	8c e0       	ldi	r24, 0x0C	; 12
 186:	0e 94 50 00 	call	0xa0
 18a:	20 91 69 00 	lds	r18, 0x0069
 18e:	30 91 6a 00 	lds	r19, 0x006A
 192:	28 1b       	sub	r18, r24
 194:	39 0b       	sbc	r19, r25
 196:	30 93 6a 00 	sts	0x006A, r19
 19a:	20 93 69 00 	sts	0x0069, r18
        temp32=(long)ADC_Diff*Vref;
 19e:	c9 01       	movw	r24, r18
 1a0:	aa 27       	eor	r26, r26
 1a2:	97 fd       	sbrc	r25, 7
 1a4:	a0 95       	com	r26
 1a6:	ba 2f       	mov	r27, r26
 1a8:	bc 01       	movw	r22, r24
 1aa:	cd 01       	movw	r24, r26
 1ac:	2c ef       	ldi	r18, 0xFC	; 252
 1ae:	39 e0       	ldi	r19, 0x09	; 9
 1b0:	40 e0       	ldi	r20, 0x00	; 0
 1b2:	50 e0       	ldi	r21, 0x00	; 0
 1b4:	0e 94 f2 00 	call	0x1e4
        LED_Curr=(unsigned int)(temp32/(512*10)); //[单位为100uA]
 1b8:	20 e0       	ldi	r18, 0x00	; 0
 1ba:	34 e1       	ldi	r19, 0x14	; 20
 1bc:	40 e0       	ldi	r20, 0x00	; 0
 1be:	50 e0       	ldi	r21, 0x00	; 0
 1c0:	0e 94 11 01 	call	0x222
 1c4:	30 93 66 00 	sts	0x0066, r19
 1c8:	20 93 65 00 	sts	0x0065, r18
        //查询方式读取ADC3+,ADC2- 10倍放大 max +/-255.6mV
        //10欧姆 1mA=10mV max +/-25.56mA
        //分辨率约0.5mV=50uA,显示取整为100uA单位

        ADCSRA|=(1<<ADIE);				//使能ADC中断
 1cc:	33 9a       	sbi	0x06, 3	; 6
        ADMUX=0xC0|AD_SE_ADC0;			//单端输入ADC0
 1ce:	80 ec       	ldi	r24, 0xC0	; 192
 1d0:	87 b9       	out	0x07, r24	; 7
        ADC_OK=0;						//软件标志清零
 1d2:	10 92 60 00 	sts	0x0060, r1
        ADCSRA|=(1<<ADSC);				//启动AD转换
 1d6:	36 9a       	sbi	0x06, 6	; 6
        while(ADC_OK==0);				//等待ADC完成,实际程序中可以运行其它任务
 1d8:	80 91 60 00 	lds	r24, 0x0060
 1dc:	88 23       	and	r24, r24
 1de:	e1 f3       	breq	.-8      	; 0x1d8
        ADCSRA&=~(1<<ADIE); 			//禁止ADC中断
 1e0:	33 98       	cbi	0x06, 3	; 6
 1e2:	a5 cf       	rjmp	.-182    	; 0x12e

000001e4 <__mulsi3>:
 1e4:	62 9f       	mul	r22, r18
 1e6:	d0 01       	movw	r26, r0
 1e8:	73 9f       	mul	r23, r19
 1ea:	f0 01       	movw	r30, r0
 1ec:	82 9f       	mul	r24, r18
 1ee:	e0 0d       	add	r30, r0
 1f0:	f1 1d       	adc	r31, r1
 1f2:	64 9f       	mul	r22, r20
 1f4:	e0 0d       	add	r30, r0
 1f6:	f1 1d       	adc	r31, r1
 1f8:	92 9f       	mul	r25, r18
 1fa:	f0 0d       	add	r31, r0
 1fc:	83 9f       	mul	r24, r19
 1fe:	f0 0d       	add	r31, r0
 200:	74 9f       	mul	r23, r20
 202:	f0 0d       	add	r31, r0
 204:	65 9f       	mul	r22, r21
 206:	f0 0d       	add	r31, r0
 208:	99 27       	eor	r25, r25
 20a:	72 9f       	mul	r23, r18
 20c:	b0 0d       	add	r27, r0
 20e:	e1 1d       	adc	r30, r1
 210:	f9 1f       	adc	r31, r25
 212:	63 9f       	mul	r22, r19
 214:	b0 0d       	add	r27, r0
 216:	e1 1d       	adc	r30, r1
 218:	f9 1f       	adc	r31, r25
 21a:	bd 01       	movw	r22, r26
 21c:	cf 01       	movw	r24, r30
 21e:	11 24       	eor	r1, r1
 220:	08 95       	ret

00000222 <__divmodsi4>:
 222:	97 fb       	bst	r25, 7
 224:	09 2e       	mov	r0, r25
 226:	05 26       	eor	r0, r21
 228:	0e d0       	rcall	.+28     	; 0x246
 22a:	57 fd       	sbrc	r21, 7
 22c:	04 d0       	rcall	.+8      	; 0x236
 22e:	14 d0       	rcall	.+40     	; 0x258
 230:	0a d0       	rcall	.+20     	; 0x246
 232:	00 1c       	adc	r0, r0
 234:	38 f4       	brcc	.+14     	; 0x244

00000236 <__divmodsi4_neg2>:
 236:	50 95       	com	r21
 238:	40 95       	com	r20
 23a:	30 95       	com	r19
 23c:	21 95       	neg	r18
 23e:	3f 4f       	sbci	r19, 0xFF	; 255
 240:	4f 4f       	sbci	r20, 0xFF	; 255
 242:	5f 4f       	sbci	r21, 0xFF	; 255

00000244 <__divmodsi4_exit>:
 244:	08 95       	ret

00000246 <__divmodsi4_neg1>:
 246:	f6 f7       	brtc	.-4      	; 0x244
 248:	90 95       	com	r25
 24a:	80 95       	com	r24
 24c:	70 95       	com	r23
 24e:	61 95       	neg	r22
 250:	7f 4f       	sbci	r23, 0xFF	; 255
 252:	8f 4f       	sbci	r24, 0xFF	; 255
 254:	9f 4f       	sbci	r25, 0xFF	; 255
 256:	08 95       	ret

00000258 <__udivmodsi4>:
 258:	a1 e2       	ldi	r26, 0x21	; 33
 25a:	1a 2e       	mov	r1, r26
 25c:	aa 1b       	sub	r26, r26
 25e:	bb 1b       	sub	r27, r27
 260:	fd 01       	movw	r30, r26
 262:	0d c0       	rjmp	.+26     	; 0x27e

00000264 <__udivmodsi4_loop>:
 264:	aa 1f       	adc	r26, r26
 266:	bb 1f       	adc	r27, r27
 268:	ee 1f       	adc	r30, r30
 26a:	ff 1f       	adc	r31, r31
 26c:	a2 17       	cp	r26, r18
 26e:	b3 07       	cpc	r27, r19
 270:	e4 07       	cpc	r30, r20
 272:	f5 07       	cpc	r31, r21
 274:	20 f0       	brcs	.+8      	; 0x27e
 276:	a2 1b       	sub	r26, r18
 278:	b3 0b       	sbc	r27, r19
 27a:	e4 0b       	sbc	r30, r20
 27c:	f5 0b       	sbc	r31, r21

0000027e <__udivmodsi4_ep>:
 27e:	66 1f       	adc	r22, r22
 280:	77 1f       	adc	r23, r23
 282:	88 1f       	adc	r24, r24
 284:	99 1f       	adc	r25, r25
 286:	1a 94       	dec	r1
 288:	69 f7       	brne	.-38     	; 0x264
 28a:	60 95       	com	r22
 28c:	70 95       	com	r23
 28e:	80 95       	com	r24
 290:	90 95       	com	r25
 292:	9b 01       	movw	r18, r22
 294:	ac 01       	movw	r20, r24
 296:	bd 01       	movw	r22, r26
 298:	cf 01       	movw	r24, r30
 29a:	08 95       	ret

⌨️ 快捷键说明

复制代码 Ctrl + C
搜索代码 Ctrl + F
全屏模式 F11
切换主题 Ctrl + Shift + D
显示快捷键 ?
增大字号 Ctrl + =
减小字号 Ctrl + -