📄 adc.lis
字号:
.module adc.c
.area text(rom, con, rel)
0000 .dbfile C:\mega8\DAC\adc.c
0000 .dbfunc e delay_us _delay_us fV
0000 ; time -> R16,R17
.even
0000 _delay_us::
0000 .dbline -1
0000 .dbline 15
0000 ; /******************************************/
0000 ; /* 广州天河双龙电子公司 */
0000 ; /* http://www.sl.com.cn */
0000 ; /* ADC驱动程序 */
0000 ; /* 作者:ntzwq@wx88.net */
0000 ; /* 2002年5月11日 */
0000 ; /* 目标MCU:MEGA8 晶振:外部(EXT) 8MHZ */
0000 ; /******************************************/
0000 ; #include<iom8v.h>
0000 ; unsigned int adc_rel;//AD转换结果
0000 ; unsigned char adc_mux;//AD通道
0000 ; extern unsigned int adc_old;
0000 ; /* 微秒级延时程序 */
0000 ; void delay_us(int time)
0000 ; {
0000 L2:
0000 .dbline 17
0000 ; do
0000 ; {
0000 .dbline 18
0000 ; time--;
0000 0150 subi R16,1
0002 1040 sbci R17,0
0004 .dbline 19
0004 ; }
0004 L3:
0004 .dbline 20
0004 ; while (time>1);
0004 81E0 ldi R24,1
0006 90E0 ldi R25,0
0008 8017 cp R24,R16
000A 9107 cpc R25,R17
000C CCF3 brlt L2
000E .dbline -2
000E .dbline 21
000E ; }
000E L1:
000E .dbline 0 ; func end
000E 0895 ret
0010 .dbsym r time 16 I
0010 .dbend
0010 .dbfunc e delay_ms _delay_ms fV
0010 ; time -> R20,R21
.even
0010 _delay_ms::
0010 00D0 rcall push_gset1
0012 A801 movw R20,R16
0014 .dbline -1
0014 .dbline 24
0014 ; /* 毫秒级延时程序 */
0014 ; void delay_ms(unsigned int time)
0014 ; {
0014 05C0 rjmp L7
0016 L6:
0016 .dbline 26
0016 .dbline 27
0016 08EE ldi R16,1000
0018 13E0 ldi R17,3
001A F2DF rcall _delay_us
001C .dbline 28
001C 4150 subi R20,1
001E 5040 sbci R21,0
0020 .dbline 29
0020 L7:
0020 .dbline 25
0020 ; while(time!=0)
0020 4030 cpi R20,0
0022 4507 cpc R20,R21
0024 C1F7 brne L6
0026 X0:
0026 .dbline -2
0026 .dbline 30
0026 ; {
0026 ; delay_us(1000);
0026 ; time--;
0026 ; }
0026 ; }
0026 L5:
0026 00D0 rcall pop_gset1
0028 .dbline 0 ; func end
0028 0895 ret
002A .dbsym r time 20 i
002A .dbend
002A .dbfunc e adc_init _adc_init fV
.even
002A _adc_init::
002A .dbline -1
002A .dbline 33
002A ; //ADC初始化
002A ; void adc_init(void)
002A ; {
002A .dbline 34
002A ; DDRC=0x00;
002A 2224 clr R2
002C 24BA out 0x14,R2
002E .dbline 35
002E ; PORTC=0x00;
002E 25BA out 0x15,R2
0030 .dbline 36
0030 ; ADCSRA = 0x00;
0030 26B8 out 0x6,R2
0032 .dbline 37
0032 ; ADMUX =(1<<REFS0)|(adc_mux&0x0f);//选择内部AVCC为基准
0032 80910200 lds R24,_adc_mux
0036 8F70 andi R24,15
0038 8064 ori R24,64
003A 87B9 out 0x7,R24
003C .dbline 38
003C ; ACSR =(1<<ACD);//关闭模拟比较器
003C 80E8 ldi R24,128
003E 88B9 out 0x8,R24
0040 .dbline 39
0040 ; ADCSRA=(1<<ADEN)|(1<<ADSC)|(1<<ADIE)|(1<<ADPS2)|(1<<ADPS1) ;//64分频
0040 8EEC ldi R24,206
0042 86B9 out 0x6,R24
0044 .dbline -2
0044 .dbline 40
0044 ; }
0044 L9:
0044 .dbline 0 ; func end
0044 0895 ret
0046 .dbend
.area vector(rom, abs)
.org 28
001C 23C0 rjmp _adc_isr
.area text(rom, con, rel)
0046 .dbfile C:\mega8\DAC\adc.c
.area bss(ram, con, rel)
0000 .dbfile C:\mega8\DAC\adc.c
0000 L11:
0000 .blkb 2
.area text(rom, con, rel)
0046 .dbfile C:\mega8\DAC\adc.c
0046 .dbfunc e adc_isr _adc_isr fV
0046 .dbsym s i L11 i
.even
0046 _adc_isr::
0046 2A92 st -y,R2
0048 3A92 st -y,R3
004A 0A93 st -y,R16
004C 1A93 st -y,R17
004E 2A93 st -y,R18
0050 3A93 st -y,R19
0052 8A93 st -y,R24
0054 9A93 st -y,R25
0056 EA93 st -y,R30
0058 2FB6 in R2,0x3f
005A 2A92 st -y,R2
005C .dbline -1
005C .dbline 44
005C ; //ADC完成中断
005C ; #pragma interrupt_handler adc_isr:iv_ADC
005C ; void adc_isr(void)
005C ; {
005C .dbline 46
005C ; static unsigned i;
005C ; adc_rel+=ADC&0x3ff;
005C 84B1 in R24,0x4
005E 95B1 in R25,0x5
0060 9370 andi R25,3
0062 20900300 lds R2,_adc_rel
0066 30900400 lds R3,_adc_rel+1
006A 280E add R2,R24
006C 391E adc R3,R25
006E 30920400 sts _adc_rel+1,R3
0072 20920300 sts _adc_rel,R2
0076 .dbline 47
0076 ; ADMUX=(1<<REFS0)|(adc_mux&0x0f);//选择内部AVCC为基准
0076 80910200 lds R24,_adc_mux
007A 8F70 andi R24,15
007C 8064 ori R24,64
007E 87B9 out 0x7,R24
0080 .dbline 48
0080 ; ADCSRA|=(1<<ADSC);//启动AD转换
0080 369A sbi 0x6,6
0082 .dbline 49
0082 ; if (i<63)
0082 80910000 lds R24,L11
0086 90910100 lds R25,L11+1
008A 8F33 cpi R24,63
008C E0E0 ldi R30,0
008E 9E07 cpc R25,R30
0090 30F4 brsh L12
0092 .dbline 50
0092 ; i++;
0092 0196 adiw R24,1
0094 90930100 sts L11+1,R25
0098 80930000 sts L11,R24
009C 15C0 rjmp L13
009E L12:
009E .dbline 52
009E .dbline 53
009E 26E0 ldi R18,6
00A0 30E0 ldi R19,0
00A2 00910300 lds R16,_adc_rel
00A6 10910400 lds R17,_adc_rel+1
00AA 00D0 rcall lsr16
00AC 10930100 sts _adc_old+1,R17
00B0 00930000 sts _adc_old,R16
00B4 .dbline 54
00B4 2224 clr R2
00B6 3324 clr R3
00B8 30920100 sts L11+1,R3
00BC 20920000 sts L11,R2
00C0 .dbline 55
00C0 30920400 sts _adc_rel+1,R3
00C4 20920300 sts _adc_rel,R2
00C8 .dbline 56
00C8 L13:
00C8 .dbline -2
00C8 .dbline 57
00C8 ; else
00C8 ; {
00C8 ; adc_old=adc_rel/64;//64点平均滤波
00C8 ; i=0;
00C8 ; adc_rel=0;
00C8 ; }
00C8 ; }
00C8 L10:
00C8 2990 ld R2,y+
00CA 2FBE out 0x3f,R2
00CC E991 ld R30,y+
00CE 9991 ld R25,y+
00D0 8991 ld R24,y+
00D2 3991 ld R19,y+
00D4 2991 ld R18,y+
00D6 1991 ld R17,y+
00D8 0991 ld R16,y+
00DA 3990 ld R3,y+
00DC 2990 ld R2,y+
00DE .dbline 0 ; func end
00DE 1895 reti
00E0 .dbend
.area bss(ram, con, rel)
0002 .dbfile C:\mega8\DAC\adc.c
0002 _adc_mux::
0002 .blkb 1
0003 .dbsym e adc_mux _adc_mux c
0003 _adc_rel::
0003 .blkb 2
0005 .dbsym e adc_rel _adc_rel i
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -