📄 adc.s
字号:
.module adc.c
.area text(rom, con, rel)
.dbfile F:\芯生光盘资料\范例代码\ADC\adc\adc.c
.dbfunc e adc_init _adc_init fV
.even
_adc_init::
.dbline -1
.dbline 19
;
; #include <iom128v.h>
; #include <macros.h>
; #include "stdtypes.h"
; #include "adc.h"
;
;
; #define ADC_END ADCSRA&0x10
;
; int adc0_value;
; int adc1_value;
; UNS8 channel;
; UNS8 adc_couter;
; UNS8 adc_flag;
;
; //ADC initialize
; // Conversion time: 416uS
; void adc_init(void)
; {
.dbline 21
;
; ADCSRA = 0x00; //disable adc
clr R2
out 0x6,R2
.dbline 22
; ADMUX = 0x40; //select adc input 0
ldi R24,64
out 0x7,R24
.dbline 23
; ACSR = 0x80;
ldi R24,128
out 0x8,R24
.dbline 24
; ADCSRA = 0x07;//00101111 分频128 不是连续转换 中断使能
ldi R24,7
out 0x6,R24
.dbline 25
; adc0_value=0;
clr R3
sts _adc0_value+1,R3
sts _adc0_value,R2
.dbline 26
; adc1_value=0;
sts _adc1_value+1,R3
sts _adc1_value,R2
.dbline 27
; channel=0;
sts _channel,R2
.dbline 28
; adc_couter=0;
sts _adc_couter,R2
.dbline 29
; adc_flag=0;
sts _adc_flag,R2
.dbline -2
L1:
.dbline 0 ; func end
ret
.dbend
.dbfunc e read_adc_value _read_adc_value fI
; value -> R16,R17
.even
_read_adc_value::
.dbline -1
.dbline 34
; }
;
;
; int read_adc_value(void)
; {
.dbline 37
; int value;
; //CLI();
; if(ADC_END)
sbis 0x6,4
rjmp L3
.dbline 38
; {
.dbline 40
;
; ADCSRA=ADCSRA&(1<<ADIF);
in R24,0x6
andi R24,16
out 0x6,R24
.dbline 41
; value=ADCL; //Read 8 low bits first (important)
in R16,0x4
clr R17
.dbline 42
; value|=(int)ADCH << 8; //read 2 high bits and shift into top byte
in R2,0x5
clr R3
mov R3,R2
clr R2
or R16,R2
or R17,R3
.dbline 45
;
; //SEI(); //re-enable interrupts
; }
L3:
.dbline 46
; return value;
.dbline -2
L2:
.dbline 0 ; func end
ret
.dbsym r value 16 I
.dbend
.dbfunc e system_protect _system_protect fV
.even
_system_protect::
.dbline -1
.dbline 50
; }
;
; void system_protect(void)
; {
.dbline 52
; /*改变采集通道*/
; if(adc_couter==1)
lds R24,_adc_couter
cpi R24,1
brne L6
.dbline 53
; {
.dbline 54
; if(ADC0==channel)
lds R2,_channel
tst R2
brne L8
.dbline 55
; {
.dbline 56
; ADMUX=0x41;//select adc input 1
ldi R24,65
out 0x7,R24
.dbline 57
; channel=1;
ldi R24,1
sts _channel,R24
.dbline 58
; }
xjmp L9
L8:
.dbline 59
; else if (ADC1==channel)
lds R24,_channel
cpi R24,1
brne L10
.dbline 60
; {
.dbline 61
; ADMUX = 0x40; //select adc input 0
ldi R24,64
out 0x7,R24
.dbline 62
; channel=0;
clr R2
sts _channel,R2
.dbline 63
; }
L10:
L9:
.dbline 64
; adc_couter=0;
clr R2
sts _adc_couter,R2
.dbline 65
; ADCSRA|=(1<<ADEN)|(1<<ADSC);//开始转换
in R24,0x6
ori R24,192
out 0x6,R24
.dbline 66
; }
xjmp L7
L6:
.dbline 68
; else
; {
.dbline 69
; adc_couter++;
lds R24,_adc_couter
subi R24,255 ; addi 1
sts _adc_couter,R24
.dbline 71
;
; if(ADC0==channel)
lds R2,_channel
tst R2
brne L12
.dbline 72
; {
.dbline 73
; adc0_value=read_adc_value();
xcall _read_adc_value
sts _adc0_value+1,R17
sts _adc0_value,R16
.dbline 74
; }
xjmp L13
L12:
.dbline 75
; else if (ADC1==channel)
lds R24,_channel
cpi R24,1
brne L14
.dbline 76
; {
.dbline 77
; adc1_value=read_adc_value();
xcall _read_adc_value
sts _adc1_value+1,R17
sts _adc1_value,R16
.dbline 78
; }
L14:
L13:
.dbline 79
L7:
.dbline -2
L5:
.dbline 0 ; func end
ret
.dbend
.area bss(ram, con, rel)
.dbfile F:\芯生光盘资料\范例代码\ADC\adc\adc.c
_adc_flag::
.blkb 1
.dbsym e adc_flag _adc_flag c
_adc_couter::
.blkb 1
.dbsym e adc_couter _adc_couter c
_channel::
.blkb 1
.dbsym e channel _channel c
_adc1_value::
.blkb 2
.dbsym e adc1_value _adc1_value I
_adc0_value::
.blkb 2
.dbsym e adc0_value _adc0_value I
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -