📄 main.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 + -