📄 ad.lis
字号:
.module ad.c
.area text(rom, con, rel)
0000 .dbfile E:\公司用\atmega8l\final\nrf905_send1\ad.c
0000 .dbfunc e AdcConvertStd _AdcConvertStd fi
0000 ; min_value -> R14
0000 ; max_value -> R20
0000 ; min_id -> R12
0000 ; max_id -> R10
0000 ; ret -> y+0
0000 ; i -> R22
.even
0000 _AdcConvertStd::
0000 00D0 rcall push_gset5
0002 2297 sbiw R28,2
0004 .dbline -1
0004 .dbline 19
0004 ;
0004 ; /********************************
0004 ; ATMega8 查询方式 A/D转换测试程序
0004 ; 文件名:main.c
0004 ; 编译:WinAVR-20070122
0004 ;
0004 ; 外部4MHz晶振
0004 ; *******************************/
0004 ;
0004 ; #include "confg.h"
0004 ;
0004 ; #define _BV(n) (1<<n)
0004 ;
0004 ; static unsigned int g_aAdValue[8]; //A/D转换缓冲区
0004 ;
0004 ;
0004 ; //AD转换8次去掉最高和最低后取平均值返回
0004 ; unsigned int AdcConvertStd(void)
0004 ; {
0004 .dbline 24
0004 ; char i;
0004 ; unsigned int ret;
0004 ; char max_id,min_id,max_value,min_value;
0004 ;
0004 ; ADMUX=0X45;//参考电压VCC
0004 85E4 ldi R24,69
0006 87B9 out 0x7,R24
0008 .dbline 25
0008 ; ADCSRA=_BV(ADEN);//使能ADC,单次转换模式
0008 80E8 ldi R24,128
000A 86B9 out 0x6,R24
000C .dbline 27
000C ; //连续转换8次
000C ; for(i=0;i<8;i++)
000C 6627 clr R22
000E 24C0 rjmp L5
0010 L2:
0010 .dbline 28
0010 ; {
0010 .dbline 29
0010 ; ADCSRA|=_BV(ADSC);
0010 369A sbi 0x6,6
0012 .dbline 30
0012 ; delay_us(30);
0012 0EE1 ldi R16,30
0014 10E0 ldi R17,0
0016 00D0 rcall _delay_us
0018 03C0 rjmp L7
001A L6:
001A .dbline 32
001A 0EE1 ldi R16,30
001C 10E0 ldi R17,0
001E 00D0 rcall _delay_us
0020 L7:
0020 .dbline 31
0020 3699 sbic 0x6,6
0022 FBCF rjmp L6
0024 .dbline 33
0024 24B0 in R2,0x4
0026 3324 clr R3
0028 3982 std y+1,R3
002A 2882 std y+0,R2
002C .dbline 34
002C 25B0 in R2,0x5
002E 3324 clr R3
0030 322C mov R3,R2
0032 2224 clr R2
0034 0880 ldd R0,y+0
0036 1980 ldd R1,y+1
0038 0228 or R0,R2
003A 1328 or R1,R3
003C 1982 std y+1,R1
003E 0882 std y+0,R0
0040 .dbline 35
0040 82E0 ldi R24,2
0042 869F mul R24,R22
0044 F001 movw R30,R0
0046 80E0 ldi R24,<_g_aAdValue
0048 90E0 ldi R25,>_g_aAdValue
004A E80F add R30,R24
004C F91F adc R31,R25
004E 0880 ldd R0,y+0
0050 1980 ldd R1,y+1
0052 1182 std z+1,R1
0054 0082 std z+0,R0
0056 .dbline 36
0056 L3:
0056 .dbline 27
0056 6395 inc R22
0058 L5:
0058 .dbline 27
0058 6830 cpi R22,8
005A D0F2 brlo L2
005C .dbline 37
005C ; while(ADCSRA&_BV(ADSC))
005C ; delay_us(30);
005C ; ret=ADCL;
005C ; ret|=(unsigned int)(ADCH<<8);
005C ; g_aAdValue[i]=ret;
005C ; }
005C ; ret=0;
005C 0024 clr R0
005E 1124 clr R1
0060 1982 std y+1,R1
0062 0882 std y+0,R0
0064 .dbline 38
0064 ; for(i=1;i<8;i++)
0064 61E0 ldi R22,1
0066 10C0 rjmp L12
0068 L9:
0068 .dbline 39
0068 82E0 ldi R24,2
006A 869F mul R24,R22
006C F001 movw R30,R0
006E 80E0 ldi R24,<_g_aAdValue
0070 90E0 ldi R25,>_g_aAdValue
0072 E80F add R30,R24
0074 F91F adc R31,R25
0076 2080 ldd R2,z+0
0078 3180 ldd R3,z+1
007A 0880 ldd R0,y+0
007C 1980 ldd R1,y+1
007E 020C add R0,R2
0080 131C adc R1,R3
0082 1982 std y+1,R1
0084 0882 std y+0,R0
0086 L10:
0086 .dbline 38
0086 6395 inc R22
0088 L12:
0088 .dbline 38
0088 6830 cpi R22,8
008A 70F3 brlo L9
008C .dbline 42
008C ; ret+=g_aAdValue[i];
008C ;
008C ; //找到最大和最小值索引
008C ; ret/=7;
008C 27E0 ldi R18,7
008E 30E0 ldi R19,0
0090 0881 ldd R16,y+0
0092 1981 ldd R17,y+1
0094 00D0 rcall div16u
0096 1983 std y+1,R17
0098 0883 std y+0,R16
009A .dbline 43
009A ; max_id=min_id=1;
009A CC24 clr R12
009C C394 inc R12
009E AA24 clr R10
00A0 A394 inc R10
00A2 .dbline 44
00A2 ; max_value=min_value=0;
00A2 EE24 clr R14
00A4 4427 clr R20
00A6 .dbline 45
00A6 ; for(i=1;i<8;i++)
00A6 61E0 ldi R22,1
00A8 4FC0 rjmp L16
00AA L13:
00AA .dbline 46
00AA ; {
00AA .dbline 47
00AA ; if(g_aAdValue[i]>ret)
00AA 82E0 ldi R24,2
00AC 869F mul R24,R22
00AE F001 movw R30,R0
00B0 80E0 ldi R24,<_g_aAdValue
00B2 90E0 ldi R25,>_g_aAdValue
00B4 E80F add R30,R24
00B6 F91F adc R31,R25
00B8 2080 ldd R2,z+0
00BA 3180 ldd R3,z+1
00BC 0880 ldd R0,y+0
00BE 1980 ldd R1,y+1
00C0 0214 cp R0,R2
00C2 1304 cpc R1,R3
00C4 00F5 brsh L17
00C6 .dbline 48
00C6 ; {
00C6 .dbline 49
00C6 ; if(g_aAdValue[i]-ret>max_value)
00C6 82E0 ldi R24,2
00C8 869F mul R24,R22
00CA F001 movw R30,R0
00CC 80E0 ldi R24,<_g_aAdValue
00CE 90E0 ldi R25,>_g_aAdValue
00D0 E80F add R30,R24
00D2 F91F adc R31,R25
00D4 2080 ldd R2,z+0
00D6 3180 ldd R3,z+1
00D8 0880 ldd R0,y+0
00DA 1980 ldd R1,y+1
00DC 2018 sub R2,R0
00DE 3108 sbc R3,R1
00E0 442E mov R4,R20
00E2 5524 clr R5
00E4 4214 cp R4,R2
00E6 5304 cpc R5,R3
00E8 70F5 brsh L18
00EA .dbline 50
00EA ; {
00EA .dbline 51
00EA ; max_value=g_aAdValue[i]-ret;
00EA 82E0 ldi R24,2
00EC 869F mul R24,R22
00EE F001 movw R30,R0
00F0 80E0 ldi R24,<_g_aAdValue
00F2 90E0 ldi R25,>_g_aAdValue
00F4 E80F add R30,R24
00F6 F91F adc R31,R25
00F8 4081 ldd R20,z+0
00FA 0880 ldd R0,y+0
00FC 1980 ldd R1,y+1
00FE 4019 sub R20,R0
0100 5109 sbc R21,R1
0102 .dbline 52
0102 ; max_id=i;
0102 A62E mov R10,R22
0104 .dbline 53
0104 ; }
0104 .dbline 54
0104 ; }
0104 20C0 rjmp L18
0106 L17:
0106 .dbline 56
0106 ; else
0106 ; {
0106 .dbline 57
0106 ; if(ret-g_aAdValue[i]>min_value)
0106 82E0 ldi R24,2
0108 869F mul R24,R22
010A F001 movw R30,R0
010C 80E0 ldi R24,<_g_aAdValue
010E 90E0 ldi R25,>_g_aAdValue
0110 E80F add R30,R24
0112 F91F adc R31,R25
0114 2080 ldd R2,z+0
0116 3180 ldd R3,z+1
0118 4880 ldd R4,y+0
011A 5980 ldd R5,y+1
011C 4218 sub R4,R2
011E 5308 sbc R5,R3
0120 2E2C mov R2,R14
0122 3324 clr R3
0124 2414 cp R2,R4
0126 3504 cpc R3,R5
0128 70F4 brsh L21
012A .dbline 58
012A ; {
012A .dbline 59
012A ; min_value=ret-g_aAdValue[i];
012A 82E0 ldi R24,2
012C 869F mul R24,R22
012E F001 movw R30,R0
0130 80E0 ldi R24,<_g_aAdValue
0132 90E0 ldi R25,>_g_aAdValue
0134 E80F add R30,R24
0136 F91F adc R31,R25
0138 2080 ldd R2,z+0
013A 3180 ldd R3,z+1
013C E880 ldd R14,y+0
013E F980 ldd R15,y+1
0140 E218 sub R14,R2
0142 F308 sbc R15,R3
0144 .dbline 60
0144 ; min_id=i;
0144 C62E mov R12,R22
0146 .dbline 61
0146 ; }
0146 L21:
0146 .dbline 62
0146 ; }
0146 L18:
0146 .dbline 63
0146 L14:
0146 .dbline 45
0146 6395 inc R22
0148 L16:
0148 .dbline 45
0148 6830 cpi R22,8
014A 08F4 brsh X0
014C AECF rjmp L13
014E X0:
014E .dbline 66
014E ; }
014E ;
014E ; //去掉第一个和最大最小值后的平均值
014E ; ret=0;
014E 0024 clr R0
0150 1124 clr R1
0152 1982 std y+1,R1
0154 0882 std y+0,R0
0156 .dbline 67
0156 ; for(i=1;i<8;i++)
0156 61E0 ldi R22,1
0158 14C0 rjmp L26
015A L23:
015A .dbline 68
015A ; {
015A .dbline 69
015A ; if((i!=min_id)&&(i!=max_id))
015A 6C15 cp R22,R12
015C 89F0 breq L27
015E 6A15 cp R22,R10
0160 79F0 breq L27
0162 .dbline 70
0162 ; ret+=g_aAdValue[i];
0162 82E0 ldi R24,2
0164 869F mul R24,R22
0166 F001 movw R30,R0
0168 80E0 ldi R24,<_g_aAdValue
016A 90E0 ldi R25,>_g_aAdValue
016C E80F add R30,R24
016E F91F adc R31,R25
0170 2080 ldd R2,z+0
0172 3180 ldd R3,z+1
0174 0880 ldd R0,y+0
0176 1980 ldd R1,y+1
0178 020C add R0,R2
017A 131C adc R1,R3
017C 1982 std y+1,R1
017E 0882 std y+0,R0
0180 L27:
0180 .dbline 71
0180 L24:
0180 .dbline 67
0180 6395 inc R22
0182 L26:
0182 .dbline 67
0182 6830 cpi R22,8
0184 50F3 brlo L23
0186 .dbline 72
0186 ; }
0186 ; if(min_id!=max_id)
0186 CA14 cp R12,R10
0188 41F0 breq L29
018A .dbline 73
018A ; ret/=5;
018A 25E0 ldi R18,5
018C 30E0 ldi R19,0
018E 0881 ldd R16,y+0
0190 1981 ldd R17,y+1
0192 00D0 rcall div16u
0194 1983 std y+1,R17
0196 0883 std y+0,R16
0198 07C0 rjmp L30
019A L29:
019A .dbline 75
019A ; else
019A ; ret/=6;
019A 26E0 ldi R18,6
019C 30E0 ldi R19,0
019E 0881 ldd R16,y+0
01A0 1981 ldd R17,y+1
01A2 00D0 rcall div16u
01A4 1983 std y+1,R17
01A6 0883 std y+0,R16
01A8 L30:
01A8 .dbline 77
01A8 ;
01A8 ; ADCSRA=0;//关闭ADC
01A8 2224 clr R2
01AA 26B8 out 0x6,R2
01AC .dbline 79
01AC ;
01AC ; return ret;
01AC 0881 ldd R16,y+0
01AE 1981 ldd R17,y+1
01B0 .dbline -2
01B0 L1:
01B0 2296 adiw R28,2
01B2 00D0 rcall pop_gset5
01B4 .dbline 0 ; func end
01B4 0895 ret
01B6 .dbsym r min_value 14 c
01B6 .dbsym r max_value 20 c
01B6 .dbsym r min_id 12 c
01B6 .dbsym r max_id 10 c
01B6 .dbsym l ret 0 i
01B6 .dbsym r i 22 c
01B6 .dbend
01B6 .dbfunc e adinit _adinit fV
.even
01B6 _adinit::
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -