📄 ad.s
字号:
.module ad.c
.area text(rom, con, rel)
.dbfile E:\公司用\atmega8l\final\nrf905_send1\ad.c
.dbfunc e AdcConvertStd _AdcConvertStd fi
; min_value -> R14
; max_value -> R20
; min_id -> R12
; max_id -> R10
; ret -> y+0
; i -> R22
.even
_AdcConvertStd::
rcall push_gset5
sbiw R28,2
.dbline -1
.dbline 19
;
; /********************************
; ATMega8 查询方式 A/D转换测试程序
; 文件名:main.c
; 编译:WinAVR-20070122
;
; 外部4MHz晶振
; *******************************/
;
; #include "confg.h"
;
; #define _BV(n) (1<<n)
;
; static unsigned int g_aAdValue[8]; //A/D转换缓冲区
;
;
; //AD转换8次去掉最高和最低后取平均值返回
; unsigned int AdcConvertStd(void)
; {
.dbline 24
; char i;
; unsigned int ret;
; char max_id,min_id,max_value,min_value;
;
; ADMUX=0X45;//参考电压VCC
ldi R24,69
out 0x7,R24
.dbline 25
; ADCSRA=_BV(ADEN);//使能ADC,单次转换模式
ldi R24,128
out 0x6,R24
.dbline 27
; //连续转换8次
; for(i=0;i<8;i++)
clr R22
rjmp L5
L2:
.dbline 28
; {
.dbline 29
; ADCSRA|=_BV(ADSC);
sbi 0x6,6
.dbline 30
; delay_us(30);
ldi R16,30
ldi R17,0
rcall _delay_us
rjmp L7
L6:
.dbline 32
ldi R16,30
ldi R17,0
rcall _delay_us
L7:
.dbline 31
sbic 0x6,6
rjmp L6
.dbline 33
in R2,0x4
clr R3
std y+1,R3
std y+0,R2
.dbline 34
in R2,0x5
clr R3
mov R3,R2
clr R2
ldd R0,y+0
ldd R1,y+1
or R0,R2
or R1,R3
std y+1,R1
std y+0,R0
.dbline 35
ldi R24,2
mul R24,R22
movw R30,R0
ldi R24,<_g_aAdValue
ldi R25,>_g_aAdValue
add R30,R24
adc R31,R25
ldd R0,y+0
ldd R1,y+1
std z+1,R1
std z+0,R0
.dbline 36
L3:
.dbline 27
inc R22
L5:
.dbline 27
cpi R22,8
brlo L2
.dbline 37
; while(ADCSRA&_BV(ADSC))
; delay_us(30);
; ret=ADCL;
; ret|=(unsigned int)(ADCH<<8);
; g_aAdValue[i]=ret;
; }
; ret=0;
clr R0
clr R1
std y+1,R1
std y+0,R0
.dbline 38
; for(i=1;i<8;i++)
ldi R22,1
rjmp L12
L9:
.dbline 39
ldi R24,2
mul R24,R22
movw R30,R0
ldi R24,<_g_aAdValue
ldi R25,>_g_aAdValue
add R30,R24
adc R31,R25
ldd R2,z+0
ldd R3,z+1
ldd R0,y+0
ldd R1,y+1
add R0,R2
adc R1,R3
std y+1,R1
std y+0,R0
L10:
.dbline 38
inc R22
L12:
.dbline 38
cpi R22,8
brlo L9
.dbline 42
; ret+=g_aAdValue[i];
;
; //找到最大和最小值索引
; ret/=7;
ldi R18,7
ldi R19,0
ldd R16,y+0
ldd R17,y+1
rcall div16u
std y+1,R17
std y+0,R16
.dbline 43
; max_id=min_id=1;
clr R12
inc R12
clr R10
inc R10
.dbline 44
; max_value=min_value=0;
clr R14
clr R20
.dbline 45
; for(i=1;i<8;i++)
ldi R22,1
rjmp L16
L13:
.dbline 46
; {
.dbline 47
; if(g_aAdValue[i]>ret)
ldi R24,2
mul R24,R22
movw R30,R0
ldi R24,<_g_aAdValue
ldi R25,>_g_aAdValue
add R30,R24
adc R31,R25
ldd R2,z+0
ldd R3,z+1
ldd R0,y+0
ldd R1,y+1
cp R0,R2
cpc R1,R3
brsh L17
.dbline 48
; {
.dbline 49
; if(g_aAdValue[i]-ret>max_value)
ldi R24,2
mul R24,R22
movw R30,R0
ldi R24,<_g_aAdValue
ldi R25,>_g_aAdValue
add R30,R24
adc R31,R25
ldd R2,z+0
ldd R3,z+1
ldd R0,y+0
ldd R1,y+1
sub R2,R0
sbc R3,R1
mov R4,R20
clr R5
cp R4,R2
cpc R5,R3
brsh L18
.dbline 50
; {
.dbline 51
; max_value=g_aAdValue[i]-ret;
ldi R24,2
mul R24,R22
movw R30,R0
ldi R24,<_g_aAdValue
ldi R25,>_g_aAdValue
add R30,R24
adc R31,R25
ldd R20,z+0
ldd R0,y+0
ldd R1,y+1
sub R20,R0
sbc R21,R1
.dbline 52
; max_id=i;
mov R10,R22
.dbline 53
; }
.dbline 54
; }
rjmp L18
L17:
.dbline 56
; else
; {
.dbline 57
; if(ret-g_aAdValue[i]>min_value)
ldi R24,2
mul R24,R22
movw R30,R0
ldi R24,<_g_aAdValue
ldi R25,>_g_aAdValue
add R30,R24
adc R31,R25
ldd R2,z+0
ldd R3,z+1
ldd R4,y+0
ldd R5,y+1
sub R4,R2
sbc R5,R3
mov R2,R14
clr R3
cp R2,R4
cpc R3,R5
brsh L21
.dbline 58
; {
.dbline 59
; min_value=ret-g_aAdValue[i];
ldi R24,2
mul R24,R22
movw R30,R0
ldi R24,<_g_aAdValue
ldi R25,>_g_aAdValue
add R30,R24
adc R31,R25
ldd R2,z+0
ldd R3,z+1
ldd R14,y+0
ldd R15,y+1
sub R14,R2
sbc R15,R3
.dbline 60
; min_id=i;
mov R12,R22
.dbline 61
; }
L21:
.dbline 62
; }
L18:
.dbline 63
L14:
.dbline 45
inc R22
L16:
.dbline 45
cpi R22,8
brsh X0
rjmp L13
X0:
.dbline 66
; }
;
; //去掉第一个和最大最小值后的平均值
; ret=0;
clr R0
clr R1
std y+1,R1
std y+0,R0
.dbline 67
; for(i=1;i<8;i++)
ldi R22,1
rjmp L26
L23:
.dbline 68
; {
.dbline 69
; if((i!=min_id)&&(i!=max_id))
cp R22,R12
breq L27
cp R22,R10
breq L27
.dbline 70
; ret+=g_aAdValue[i];
ldi R24,2
mul R24,R22
movw R30,R0
ldi R24,<_g_aAdValue
ldi R25,>_g_aAdValue
add R30,R24
adc R31,R25
ldd R2,z+0
ldd R3,z+1
ldd R0,y+0
ldd R1,y+1
add R0,R2
adc R1,R3
std y+1,R1
std y+0,R0
L27:
.dbline 71
L24:
.dbline 67
inc R22
L26:
.dbline 67
cpi R22,8
brlo L23
.dbline 72
; }
; if(min_id!=max_id)
cp R12,R10
breq L29
.dbline 73
; ret/=5;
ldi R18,5
ldi R19,0
ldd R16,y+0
ldd R17,y+1
rcall div16u
std y+1,R17
std y+0,R16
rjmp L30
L29:
.dbline 75
; else
; ret/=6;
ldi R18,6
ldi R19,0
ldd R16,y+0
ldd R17,y+1
rcall div16u
std y+1,R17
std y+0,R16
L30:
.dbline 77
;
; ADCSRA=0;//关闭ADC
clr R2
out 0x6,R2
.dbline 79
;
; return ret;
ldd R16,y+0
ldd R17,y+1
.dbline -2
L1:
adiw R28,2
rcall pop_gset5
.dbline 0 ; func end
ret
.dbsym r min_value 14 c
.dbsym r max_value 20 c
.dbsym r min_id 12 c
.dbsym r max_id 10 c
.dbsym l ret 0 i
.dbsym r i 22 c
.dbend
.dbfunc e adinit _adinit fV
.even
_adinit::
.dbline -1
.dbline 82
; }
; void adinit()
; {
.dbline 87
; //ad转换相关的寄存器的初始化
; //ACSR=0x80; //别忘了关掉模拟比较器的电源哦
; // SFIOR=0x00;
; //IO初始化
; DDRB|=_BV(DDB0);
sbi 0x17,0
.dbline 88
; PORTB|=~_BV(PB0);
in R24,0x18
ori R24,254
out 0x18,R24
.dbline -2
.dbline 93
; //ad转换相关的寄存器的初始化
; // ACSR=0x80; //别忘了关掉模拟比较器的电源哦
; // SFIOR=0x00;
;
; }
L31:
.dbline 0 ; func end
ret
.dbend
.dbfunc e AdcConvertDin _AdcConvertDin fi
; min_value -> R14
; max_value -> R20
; min_id -> R12
; max_id -> R10
; ret -> y+0
; i -> R22
.even
_AdcConvertDin::
rcall push_gset5
sbiw R28,2
.dbline -1
.dbline 98
;
;
; //AD转换8次去掉最高和最低后取平均值返回
; unsigned int AdcConvertDin(void)
; {
.dbline 103
; char i;
; unsigned int ret;
; char max_id,min_id,max_value,min_value;
;
; ADMUX=0X44;//参考电压VCC
ldi R24,68
out 0x7,R24
.dbline 104
; ADCSRA=_BV(ADEN);//使能ADC,单次转换模式
ldi R24,128
out 0x6,R24
.dbline 107
;
; //连续转换8次
; for(i=0;i<8;i++)
clr R22
rjmp L36
L33:
.dbline 108
; {
.dbline 109
; ADCSRA|=_BV(ADSC);
sbi 0x6,6
.dbline 110
; delay_us(30);
ldi R16,30
ldi R17,0
rcall _delay_us
rjmp L38
L37:
.dbline 112
ldi R16,30
ldi R17,0
rcall _delay_us
L38:
.dbline 111
sbic 0x6,6
rjmp L37
.dbline 113
in R2,0x4
clr R3
std y+1,R3
std y+0,R2
.dbline 114
in R2,0x5
clr R3
mov R3,R2
clr R2
ldd R0,y+0
ldd R1,y+1
or R0,R2
or R1,R3
std y+1,R1
std y+0,R0
.dbline 115
ldi R24,2
mul R24,R22
movw R30,R0
ldi R24,<_g_aAdValue
ldi R25,>_g_aAdValue
add R30,R24
adc R31,R25
ldd R0,y+0
ldd R1,y+1
std z+1,R1
std z+0,R0
.dbline 116
L34:
.dbline 107
inc R22
L36:
.dbline 107
cpi R22,8
brlo L33
.dbline 117
; while(ADCSRA&_BV(ADSC))
; delay_us(30);
; ret=ADCL;
; ret|=(unsigned int)(ADCH<<8);
; g_aAdValue[i]=ret;
; }
; ret=0;
clr R0
clr R1
std y+1,R1
std y+0,R0
.dbline 118
; for(i=1;i<8;i++)
ldi R22,1
rjmp L43
L40:
.dbline 119
ldi R24,2
mul R24,R22
movw R30,R0
ldi R24,<_g_aAdValue
ldi R25,>_g_aAdValue
add R30,R24
adc R31,R25
ldd R2,z+0
ldd R3,z+1
ldd R0,y+0
ldd R1,y+1
add R0,R2
adc R1,R3
std y+1,R1
std y+0,R0
L41:
.dbline 118
inc R22
L43:
.dbline 118
cpi R22,8
brlo L40
.dbline 122
; ret+=g_aAdValue[i];
;
; //找到最大和最小值索引
; ret/=7;
ldi R18,7
ldi R19,0
ldd R16,y+0
ldd R17,y+1
rcall div16u
std y+1,R17
std y+0,R16
.dbline 123
; max_id=min_id=1;
clr R12
inc R12
clr R10
inc R10
.dbline 124
; max_value=min_value=0;
clr R14
clr R20
.dbline 125
; for(i=1;i<8;i++)
ldi R22,1
rjmp L47
L44:
.dbline 126
; {
.dbline 127
; if(g_aAdValue[i]>ret)
ldi R24,2
mul R24,R22
movw R30,R0
ldi R24,<_g_aAdValue
ldi R25,>_g_aAdValue
add R30,R24
adc R31,R25
ldd R2,z+0
ldd R3,z+1
ldd R0,y+0
ldd R1,y+1
cp R0,R2
cpc R1,R3
brsh L48
.dbline 128
; {
.dbline 129
; if(g_aAdValue[i]-ret>max_value)
ldi R24,2
mul R24,R22
movw R30,R0
ldi R24,<_g_aAdValue
ldi R25,>_g_aAdValue
add R30,R24
adc R31,R25
ldd R2,z+0
ldd R3,z+1
ldd R0,y+0
ldd R1,y+1
sub R2,R0
sbc R3,R1
mov R4,R20
clr R5
cp R4,R2
cpc R5,R3
brsh L49
.dbline 130
; {
.dbline 131
; max_value=g_aAdValue[i]-ret;
ldi R24,2
mul R24,R22
movw R30,R0
ldi R24,<_g_aAdValue
ldi R25,>_g_aAdValue
add R30,R24
adc R31,R25
ldd R20,z+0
ldd R0,y+0
ldd R1,y+1
sub R20,R0
sbc R21,R1
.dbline 132
; max_id=i;
mov R10,R22
.dbline 133
; }
.dbline 134
; }
rjmp L49
L48:
.dbline 136
; else
; {
.dbline 137
; if(ret-g_aAdValue[i]>min_value)
ldi R24,2
mul R24,R22
movw R30,R0
ldi R24,<_g_aAdValue
ldi R25,>_g_aAdValue
add R30,R24
adc R31,R25
ldd R2,z+0
ldd R3,z+1
ldd R4,y+0
ldd R5,y+1
sub R4,R2
sbc R5,R3
mov R2,R14
clr R3
cp R2,R4
cpc R3,R5
brsh L52
.dbline 138
; {
.dbline 139
; min_value=ret-g_aAdValue[i];
ldi R24,2
mul R24,R22
movw R30,R0
ldi R24,<_g_aAdValue
ldi R25,>_g_aAdValue
add R30,R24
adc R31,R25
ldd R2,z+0
ldd R3,z+1
ldd R14,y+0
ldd R15,y+1
sub R14,R2
sbc R15,R3
.dbline 140
; min_id=i;
mov R12,R22
.dbline 141
; }
L52:
.dbline 142
; }
L49:
.dbline 143
L45:
.dbline 125
inc R22
L47:
.dbline 125
cpi R22,8
brsh X1
rjmp L44
X1:
.dbline 146
; }
;
; //去掉第一个和最大最小值后的平均值
; ret=0;
clr R0
clr R1
std y+1,R1
std y+0,R0
.dbline 147
; for(i=1;i<8;i++)
ldi R22,1
rjmp L57
L54:
.dbline 148
; {
.dbline 149
; if((i!=min_id)&&(i!=max_id))
cp R22,R12
breq L58
cp R22,R10
breq L58
.dbline 150
; ret+=g_aAdValue[i];
ldi R24,2
mul R24,R22
movw R30,R0
ldi R24,<_g_aAdValue
ldi R25,>_g_aAdValue
add R30,R24
adc R31,R25
ldd R2,z+0
ldd R3,z+1
ldd R0,y+0
ldd R1,y+1
add R0,R2
adc R1,R3
std y+1,R1
std y+0,R0
L58:
.dbline 151
L55:
.dbline 147
inc R22
L57:
.dbline 147
cpi R22,8
brlo L54
.dbline 152
; }
; if(min_id!=max_id)
cp R12,R10
breq L60
.dbline 153
; ret/=5;
ldi R18,5
ldi R19,0
ldd R16,y+0
ldd R17,y+1
rcall div16u
std y+1,R17
std y+0,R16
rjmp L61
L60:
.dbline 155
; else
; ret/=6;
ldi R18,6
ldi R19,0
ldd R16,y+0
ldd R17,y+1
rcall div16u
std y+1,R17
std y+0,R16
L61:
.dbline 157
;
; ADCSRA=0;//关闭ADC
clr R2
out 0x6,R2
.dbline 159
;
; return ret;
ldd R16,y+0
ldd R17,y+1
.dbline -2
L32:
adiw R28,2
rcall pop_gset5
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -