📄 adc.lis
字号:
.module ADC.c
.area text(rom, con, rel)
0000 .dbfile E:\PMax\单片机源代码\函数库\ADC\ADC.c
0000 .dbfunc e adc_init _adc_init fV
.even
0000 _adc_init::
0000 .dbline -1
0000 .dbline 30
0000 ; /*****************************************************************
0000 ; * 文件名: ADC.c
0000 ; * 版本号:
0000 ; * 创作日期: 2005.7.7
0000 ; * 作者: fengzm
0000 ; * 功能说明: 可采集7个AD通道的值,使用了RC滤波;
0000 ; * 其它说明: 使用AVR单片机Atmaga48, 晶振:8Mhz
0000 ; 调用ADC文件的时候只需要输入通道号即可,如ADC(7);
0000 ; *****************************************************************/
0000 ;
0000 ;
0000 ; /*****************************************************************
0000 ;
0000 ; * 修改日期: 2005.7.8
0000 ; * 修改人: wangzq
0000 ; * 修改原因: 优化代码
0000 ; 定时器0溢出触发A/D转换
0000 ; 修改g_AdcNum改变通道号,默认值0;
0000 ; g_ValueAdc返回A/D转换后的滤波值;
0000 ; g_AdcEnd 0xff表示当前返回值有效;
0000 ; *******************************************************************/
0000 ;
0000 ;
0000 ; //包含文件
0000 ; #include "ADC.h"
0000 ;
0000 ; // ADC initialize
0000 ; // Conversion time: 13uS,CLOCK/8;
0000 ; void adc_init(void)
0000 ; {
0000 .dbline 31
0000 ; ADCSRA = 0x00; //disable adc
0000 2224 clr R2
0002 20927A00 sts 122,R2
0006 .dbline 32
0006 ; ADMUX = 0x00; //select adc input 0
0006 20927C00 sts 124,R2
000A .dbline 33
000A ; ACSR = 0x80; //not need the compare function
000A 80E8 ldi R24,128
000C 80BF out 0x30,R24
000E .dbline 34
000E ; ADCSRB = 0x04; //定时器0溢出触发转换
000E 84E0 ldi R24,4
0010 80937B00 sts 123,R24
0014 .dbline -2
0014 L1:
0014 .dbline 0 ; func end
0014 0895 ret
0016 .dbend
.area vector(rom, abs)
.org 42
002A 0BC0 rjmp _adc_isr
.area text(rom, con, rel)
0016 .dbfile E:\PMax\单片机源代码\函数库\ADC\ADC.c
0016 .dbfunc e adc_isr _adc_isr fV
0016 ; j -> y+0
.even
0016 _adc_isr::
0016 0A92 st -y,R0
0018 1A92 st -y,R1
001A 2A92 st -y,R2
001C 3A92 st -y,R3
001E 4A92 st -y,R4
0020 5A92 st -y,R5
0022 6A92 st -y,R6
0024 7A92 st -y,R7
0026 8A92 st -y,R8
0028 9A92 st -y,R9
002A 0A93 st -y,R16
002C 1A93 st -y,R17
002E 2A93 st -y,R18
0030 3A93 st -y,R19
0032 8A93 st -y,R24
0034 EA93 st -y,R30
0036 FA93 st -y,R31
0038 0FB6 in R0,0x3f
003A 0A92 st -y,R0
003C 00D0 rcall push_gset2
003E 2497 sbiw R28,4
0040 .dbline -1
0040 .dbline 39
0040 ; }
0040 ;
0040 ; #pragma interrupt_handler adc_isr:22
0040 ; void adc_isr(void)
0040 ; {
0040 .dbline 42
0040 ; dword j;
0040 ;
0040 ; j =ADCL; //Read 8 low bits first (impo
0040 20907800 lds R2,120
0044 3324 clr R3
0046 4424 clr R4
0048 5524 clr R5
004A FE01 movw R30,R28
004C 2082 std z+0,R2
004E 3182 std z+1,R3
0050 4282 std z+2,R4
0052 5382 std z+3,R5
0054 .dbline 43
0054 ; j |=(int)ADCH << 8; //read 2 high bits and shift into topbyte
0054 20907900 lds R2,121
0058 3324 clr R3
005A 322C mov R3,R2
005C 2224 clr R2
005E 4424 clr R4
0060 37FC sbrc R3,7
0062 4094 com R4
0064 5524 clr R5
0066 47FC sbrc R4,7
0068 5094 com R5
006A FE01 movw R30,R28
006C 6080 ldd R6,z+0
006E 7180 ldd R7,z+1
0070 8280 ldd R8,z+2
0072 9380 ldd R9,z+3
0074 6228 or R6,R2
0076 7328 or R7,R3
0078 8428 or R8,R4
007A 9528 or R9,R5
007C FE01 movw R30,R28
007E 6082 std z+0,R6
0080 7182 std z+1,R7
0082 8282 std z+2,R8
0084 9382 std z+3,R9
0086 .dbline 45
0086 ;
0086 ; j *= ADCK; //RC filtering
0086 FE01 movw R30,R28
0088 2080 ldd R2,z+0
008A 3180 ldd R3,z+1
008C 4280 ldd R4,z+2
008E 5380 ldd R5,z+3
0090 44E0 ldi R20,4
0092 50E0 ldi R21,0
0094 60E0 ldi R22,0
0096 70E0 ldi R23,0
0098 5A92 st -y,R5
009A 4A92 st -y,R4
009C 3A92 st -y,R3
009E 2A92 st -y,R2
00A0 8A01 movw R16,R20
00A2 9B01 movw R18,R22
00A4 00D0 rcall empy32u
00A6 FE01 movw R30,R28
00A8 0083 std z+0,R16
00AA 1183 std z+1,R17
00AC 2283 std z+2,R18
00AE 3383 std z+3,R19
00B0 .dbline 46
00B0 ; j += (10-ADCK) * g_ValueAdc;
00B0 20910000 lds R18,_g_ValueAdc
00B4 30910100 lds R19,_g_ValueAdc+1
00B8 06E0 ldi R16,6
00BA 10E0 ldi R17,0
00BC 00D0 rcall empy16s
00BE 1801 movw R2,R16
00C0 4424 clr R4
00C2 5524 clr R5
00C4 FE01 movw R30,R28
00C6 6080 ldd R6,z+0
00C8 7180 ldd R7,z+1
00CA 8280 ldd R8,z+2
00CC 9380 ldd R9,z+3
00CE 620C add R6,R2
00D0 731C adc R7,R3
00D2 841C adc R8,R4
00D4 951C adc R9,R5
00D6 FE01 movw R30,R28
00D8 6082 std z+0,R6
00DA 7182 std z+1,R7
00DC 8282 std z+2,R8
00DE 9382 std z+3,R9
00E0 .dbline 47
00E0 ; j /=10;
00E0 4AE0 ldi R20,10
00E2 50E0 ldi R21,0
00E4 60E0 ldi R22,0
00E6 70E0 ldi R23,0
00E8 FE01 movw R30,R28
00EA 2080 ldd R2,z+0
00EC 3180 ldd R3,z+1
00EE 4280 ldd R4,z+2
00F0 5380 ldd R5,z+3
00F2 7A93 st -y,R23
00F4 6A93 st -y,R22
00F6 5A93 st -y,R21
00F8 4A93 st -y,R20
00FA 8101 movw R16,R2
00FC 9201 movw R18,R4
00FE 00D0 rcall div32u
0100 FE01 movw R30,R28
0102 0083 std z+0,R16
0104 1183 std z+1,R17
0106 2283 std z+2,R18
0108 3383 std z+3,R19
010A .dbline 48
010A ; g_ValueAdc = j;
010A FE01 movw R30,R28
010C 2080 ldd R2,z+0
010E 3180 ldd R3,z+1
0110 30920100 sts _g_ValueAdc+1,R3
0114 20920000 sts _g_ValueAdc,R2
0118 .dbline 50
0118 ;
0118 ; g_AdcEnd = 0xff; //set the flag of end
0118 8FEF ldi R24,255
011A 80930000 sts _g_AdcEnd,R24
011E .dbline 51
011E ; ADMUX = g_AdcNum; //通道选择
011E 20900000 lds R2,_g_AdcNum
0122 20927C00 sts 124,R2
0126 .dbline -2
0126 L2:
0126 2496 adiw R28,4
0128 00D0 rcall pop_gset2
012A 0990 ld R0,y+
012C 0FBE out 0x3f,R0
012E F991 ld R31,y+
0130 E991 ld R30,y+
0132 8991 ld R24,y+
0134 3991 ld R19,y+
0136 2991 ld R18,y+
0138 1991 ld R17,y+
013A 0991 ld R16,y+
013C 9990 ld R9,y+
013E 8990 ld R8,y+
0140 7990 ld R7,y+
0142 6990 ld R6,y+
0144 5990 ld R5,y+
0146 4990 ld R4,y+
0148 3990 ld R3,y+
014A 2990 ld R2,y+
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -