📄 adc.lis
字号:
.module adc.c
.area text(rom, con, rel)
0000 .dbfile F:\芯生光盘资料\范例代码\ADC\adc\adc.c
0000 .dbfunc e adc_init _adc_init fV
.even
0000 _adc_init::
0000 .dbline -1
0000 .dbline 19
0000 ;
0000 ; #include <iom128v.h>
0000 ; #include <macros.h>
0000 ; #include "stdtypes.h"
0000 ; #include "adc.h"
0000 ;
0000 ;
0000 ; #define ADC_END ADCSRA&0x10
0000 ;
0000 ; int adc0_value;
0000 ; int adc1_value;
0000 ; UNS8 channel;
0000 ; UNS8 adc_couter;
0000 ; UNS8 adc_flag;
0000 ;
0000 ; //ADC initialize
0000 ; // Conversion time: 416uS
0000 ; void adc_init(void)
0000 ; {
0000 .dbline 21
0000 ;
0000 ; ADCSRA = 0x00; //disable adc
0000 2224 clr R2
0002 26B8 out 0x6,R2
0004 .dbline 22
0004 ; ADMUX = 0x40; //select adc input 0
0004 80E4 ldi R24,64
0006 87B9 out 0x7,R24
0008 .dbline 23
0008 ; ACSR = 0x80;
0008 80E8 ldi R24,128
000A 88B9 out 0x8,R24
000C .dbline 24
000C ; ADCSRA = 0x07;//00101111 分频128 不是连续转换 中断使能
000C 87E0 ldi R24,7
000E 86B9 out 0x6,R24
0010 .dbline 25
0010 ; adc0_value=0;
0010 3324 clr R3
0012 30920600 sts _adc0_value+1,R3
0016 20920500 sts _adc0_value,R2
001A .dbline 26
001A ; adc1_value=0;
001A 30920400 sts _adc1_value+1,R3
001E 20920300 sts _adc1_value,R2
0022 .dbline 27
0022 ; channel=0;
0022 20920200 sts _channel,R2
0026 .dbline 28
0026 ; adc_couter=0;
0026 20920100 sts _adc_couter,R2
002A .dbline 29
002A ; adc_flag=0;
002A 20920000 sts _adc_flag,R2
002E .dbline -2
002E L1:
002E .dbline 0 ; func end
002E 0895 ret
0030 .dbend
0030 .dbfunc e read_adc_value _read_adc_value fI
0030 ; value -> R16,R17
.even
0030 _read_adc_value::
0030 .dbline -1
0030 .dbline 34
0030 ; }
0030 ;
0030 ;
0030 ; int read_adc_value(void)
0030 ; {
0030 .dbline 37
0030 ; int value;
0030 ; //CLI();
0030 ; if(ADC_END)
0030 349B sbis 0x6,4
0032 0BC0 rjmp L3
0034 .dbline 38
0034 ; {
0034 .dbline 40
0034 ;
0034 ; ADCSRA=ADCSRA&(1<<ADIF);
0034 86B1 in R24,0x6
0036 8071 andi R24,16
0038 86B9 out 0x6,R24
003A .dbline 41
003A ; value=ADCL; //Read 8 low bits first (important)
003A 04B1 in R16,0x4
003C 1127 clr R17
003E .dbline 42
003E ; value|=(int)ADCH << 8; //read 2 high bits and shift into top byte
003E 25B0 in R2,0x5
0040 3324 clr R3
0042 322C mov R3,R2
0044 2224 clr R2
0046 0229 or R16,R2
0048 1329 or R17,R3
004A .dbline 45
004A ;
004A ; //SEI(); //re-enable interrupts
004A ; }
004A L3:
004A .dbline 46
004A ; return value;
004A .dbline -2
004A L2:
004A .dbline 0 ; func end
004A 0895 ret
004C .dbsym r value 16 I
004C .dbend
004C .dbfunc e system_protect _system_protect fV
.even
004C _system_protect::
004C .dbline -1
004C .dbline 50
004C ; }
004C ;
004C ; void system_protect(void)
004C ; {
004C .dbline 52
004C ; /*改变采集通道*/
004C ; if(adc_couter==1)
004C 80910100 lds R24,_adc_couter
0050 8130 cpi R24,1
0052 D1F4 brne L6
0054 .dbline 53
0054 ; {
0054 .dbline 54
0054 ; if(ADC0==channel)
0054 20900200 lds R2,_channel
0058 2220 tst R2
005A 31F4 brne L8
005C .dbline 55
005C ; {
005C .dbline 56
005C ; ADMUX=0x41;//select adc input 1
005C 81E4 ldi R24,65
005E 87B9 out 0x7,R24
0060 .dbline 57
0060 ; channel=1;
0060 81E0 ldi R24,1
0062 80930200 sts _channel,R24
0066 .dbline 58
0066 ; }
0066 09C0 xjmp L9
0068 L8:
0068 .dbline 59
0068 ; else if (ADC1==channel)
0068 80910200 lds R24,_channel
006C 8130 cpi R24,1
006E 29F4 brne L10
0070 .dbline 60
0070 ; {
0070 .dbline 61
0070 ; ADMUX = 0x40; //select adc input 0
0070 80E4 ldi R24,64
0072 87B9 out 0x7,R24
0074 .dbline 62
0074 ; channel=0;
0074 2224 clr R2
0076 20920200 sts _channel,R2
007A .dbline 63
007A ; }
007A L10:
007A L9:
007A .dbline 64
007A ; adc_couter=0;
007A 2224 clr R2
007C 20920100 sts _adc_couter,R2
0080 .dbline 65
0080 ; ADCSRA|=(1<<ADEN)|(1<<ADSC);//开始转换
0080 86B1 in R24,0x6
0082 806C ori R24,192
0084 86B9 out 0x6,R24
0086 .dbline 66
0086 ; }
0086 18C0 xjmp L7
0088 L6:
0088 .dbline 68
0088 ; else
0088 ; {
0088 .dbline 69
0088 ; adc_couter++;
0088 80910100 lds R24,_adc_couter
008C 8F5F subi R24,255 ; addi 1
008E 80930100 sts _adc_couter,R24
0092 .dbline 71
0092 ;
0092 ; if(ADC0==channel)
0092 20900200 lds R2,_channel
0096 2220 tst R2
0098 31F4 brne L12
009A .dbline 72
009A ; {
009A .dbline 73
009A ; adc0_value=read_adc_value();
009A CADF xcall _read_adc_value
009C 10930600 sts _adc0_value+1,R17
00A0 00930500 sts _adc0_value,R16
00A4 .dbline 74
00A4 ; }
00A4 09C0 xjmp L13
00A6 L12:
00A6 .dbline 75
00A6 ; else if (ADC1==channel)
00A6 80910200 lds R24,_channel
00AA 8130 cpi R24,1
00AC 29F4 brne L14
00AE .dbline 76
00AE ; {
00AE .dbline 77
00AE ; adc1_value=read_adc_value();
00AE C0DF xcall _read_adc_value
00B0 10930400 sts _adc1_value+1,R17
00B4 00930300 sts _adc1_value,R16
00B8 .dbline 78
00B8 ; }
00B8 L14:
00B8 L13:
00B8 .dbline 79
00B8 L7:
00B8 .dbline -2
00B8 L5:
00B8 .dbline 0 ; func end
00B8 0895 ret
00BA .dbend
.area bss(ram, con, rel)
0000 .dbfile F:\芯生光盘资料\范例代码\ADC\adc\adc.c
0000 _adc_flag::
0000 .blkb 1
0001 .dbsym e adc_flag _adc_flag c
0001 _adc_couter::
0001 .blkb 1
0002 .dbsym e adc_couter _adc_couter c
0002 _channel::
0002 .blkb 1
0003 .dbsym e channel _channel c
0003 _adc1_value::
0003 .blkb 2
0005 .dbsym e adc1_value _adc1_value I
0005 _adc0_value::
0005 .blkb 2
0007 .dbsym e adc0_value _adc0_value I
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -