📄 adc.s
字号:
.module adc.c
.area text(rom, con, rel)
.dbfile C:\调试程序\mega48\DAC\adc.c
.dbfunc e delay_us _delay_us fV
; time -> R16,R17
.even
_delay_us::
.dbline -1
.dbline 7
; #include<iom48v.h>
; unsigned int adc_rel;//AD转换结果
; unsigned char adc_mux;//AD通道
; extern unsigned int adc_old;
; /* 微秒级延时程序 */
; void delay_us(int time)
; {
L2:
.dbline 9
; do
; {
.dbline 10
; time--;
subi R16,1
sbci R17,0
.dbline 11
; }
L3:
.dbline 12
; while (time>1);
ldi R24,1
ldi R25,0
cp R24,R16
cpc R25,R17
brlt L2
.dbline -2
L1:
.dbline 0 ; func end
ret
.dbsym r time 16 I
.dbend
.dbfunc e delay_ms _delay_ms fV
; time -> R20,R21
.even
_delay_ms::
rcall push_gset1
movw R20,R16
.dbline -1
.dbline 16
; }
; /* 毫秒级延时程序 */
; void delay_ms(unsigned int time)
; {
rjmp L7
L6:
.dbline 18
.dbline 19
ldi R16,1000
ldi R17,3
rcall _delay_us
.dbline 20
subi R20,1
sbci R21,0
.dbline 21
L7:
.dbline 17
; while(time!=0)
cpi R20,0
cpc R20,R21
brne L6
X0:
.dbline -2
L5:
rcall pop_gset1
.dbline 0 ; func end
ret
.dbsym r time 20 i
.dbend
.dbfunc e adc_init _adc_init fV
.even
_adc_init::
.dbline -1
.dbline 25
; {
; delay_us(1000);
; time--;
; }
; }
; //ADC初始化
; void adc_init(void)
; {
.dbline 26
; DDRC=0x00;
clr R2
out 0x7,R2
.dbline 27
; PORTC=0x00;
out 0x8,R2
.dbline 28
; ADCSRA = 0x00;
sts 122,R2
.dbline 29
; ADMUX =(1<<REFS0)|(adc_mux&0x0f);//选择内部AVCC为基准
lds R24,_adc_mux
andi R24,15
ori R24,64
sts 124,R24
.dbline 30
; ACSR =(1<<ACD);//关闭模拟比较器
ldi R24,128
out 0x30,R24
.dbline 31
; ADCSRB=0;
sts 123,R2
.dbline 32
; ADCSRA=(1<<ADEN)|(1<<ADSC)|(1<<ADIE)|(1<<ADPS2)|(1<<ADPS1) ;//64分频
ldi R24,206
sts 122,R24
.dbline -2
L9:
.dbline 0 ; func end
ret
.dbend
.area vector(rom, abs)
.org 42
rjmp _adc_isr
.area text(rom, con, rel)
.dbfile C:\调试程序\mega48\DAC\adc.c
.area bss(ram, con, rel)
.dbfile C:\调试程序\mega48\DAC\adc.c
L11:
.blkb 2
.area text(rom, con, rel)
.dbfile C:\调试程序\mega48\DAC\adc.c
.dbfunc e adc_isr _adc_isr fV
.dbsym s i L11 i
.even
_adc_isr::
st -y,R2
st -y,R3
st -y,R16
st -y,R17
st -y,R18
st -y,R19
st -y,R24
st -y,R25
st -y,R30
in R2,0x3f
st -y,R2
.dbline -1
.dbline 37
; }
; //ADC完成中断
; #pragma interrupt_handler adc_isr:22
; void adc_isr(void)
; {
.dbline 39
; static unsigned i;
; adc_rel+=ADC&0x3ff;
lds R24,120
lds R25,120+1
andi R25,3
lds R2,_adc_rel
lds R3,_adc_rel+1
add R2,R24
adc R3,R25
sts _adc_rel+1,R3
sts _adc_rel,R2
.dbline 40
; ADMUX=(1<<REFS0)|(adc_mux&0x0f);//选择内部AVCC为基准
lds R24,_adc_mux
andi R24,15
ori R24,64
sts 124,R24
.dbline 41
; ADCSRA|=(1<<ADSC);//启动AD转换
lds R24,122
ori R24,64
sts 122,R24
.dbline 42
; if (i<63)
lds R24,L11
lds R25,L11+1
cpi R24,63
ldi R30,0
cpc R25,R30
brsh L12
.dbline 43
; i++;
adiw R24,1
sts L11+1,R25
sts L11,R24
rjmp L13
L12:
.dbline 45
.dbline 46
ldi R18,6
ldi R19,0
lds R16,_adc_rel
lds R17,_adc_rel+1
rcall lsr16
sts _adc_old+1,R17
sts _adc_old,R16
.dbline 47
clr R2
clr R3
sts L11+1,R3
sts L11,R2
.dbline 48
sts _adc_rel+1,R3
sts _adc_rel,R2
.dbline 49
L13:
.dbline -2
L10:
ld R2,y+
out 0x3f,R2
ld R30,y+
ld R25,y+
ld R24,y+
ld R19,y+
ld R18,y+
ld R17,y+
ld R16,y+
ld R3,y+
ld R2,y+
.dbline 0 ; func end
reti
.dbend
.area bss(ram, con, rel)
.dbfile C:\调试程序\mega48\DAC\adc.c
_adc_mux::
.blkb 1
.dbsym e adc_mux _adc_mux c
_adc_rel::
.blkb 2
.dbsym e adc_rel _adc_rel i
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -