我的可用的汇编子程序,参考一下吧.
.equ mr =$01 ;模式寄存器
.equ adccr =$02 ;AD转换控制寄存器
.equ fr =$03 ;滤波寄存器
.equ iocon =$07 ;IO控制寄存器
ad7708_init:
ldi r16, adccr ;控制寄存器
;bit7 CH3
;bit6 CH2
;bit5 CH1
;bit4 CH0
;bit3 U/B=1为单极性,U/B=0为双极性
;bit2-0 RN2-0 ADC输入范围(VREF = 2.5 V)
;0 0 0 ±20 mV
;0 0 1 ±40 mV
;0 1 0 ±80 mV
;0 1 1 ±160 mV
;1 0 0 ±320 mV
;1 0 1 ±640 mV
;1 1 0 ±1.28 V
;1 1 1 ±2.56 V
call wri_ad7708
ldi r16, $0f ;
call wri_ad7708
ldi r16, MR ;模式寄存器
call wri_ad7708 ;bit7 chop=0工作在斩波方式
;bit6 negbuf=1AINCOM缓冲输入,此位只在单端方式有意义
;bit5 refsel=0,VREF=REFIN1(+)-REFIN1(-);bit5 =1,VREF=REFIN2(+)-REFIN2(-)
;bit4 chcon=0,配置成8通道(8 个单端或4 对差分),此时可以选择两种参考电压之一
; chcon=1,配置成10 通道,此时参考电压只能选择REFIN1(+)-REFIN1(-)
;bit3 oscpd=1,若ADC 进入备用模式时将使振荡器停振,这样可以减少功耗
;bit2-0 MD2-MD0模式选择位,8 种工作模式:掉电,空闲,单次转换,连续转换,零点校正,满幅校正
ldi r16, $13 ;
call wri_ad7708
ret
wri_ad7708: ;
ldi r17, 7
cbi ad_port, ad_clk
wri_ad7708a:
lsl r16
brcc wri_ad7708b
sbi ad_port, ad_di
jmp wri_ad7708c
wri_ad7708b:
cbi ad_port, ad_di
wri_ad7708c:
sbi ad_port, ad_clk
cbi ad_port, ad_clk
dec r17
brne wri_ad7708a
lsl r16
brcc wri_ad7708d
sbi ad_port, ad_di
jmp wri_ad7708e
wri_ad7708d:
cbi ad_port, ad_di
wri_ad7708e:
sbi ad_port, ad_clk
sbi ad_port, ad_di
ret
rd_ad7708:
ldi r16, $44 ;读数据寄存器
call wri_ad7708
ldi r17, 8
rd_ad7708a:
cbi ad_port, ad_clk
sbi ad_port, ad_clk
sbic ad_pin, ad_do
jmp rd_ad7708b
clc
jmp rd_ad7708c
rd_ad7708b:
sec
rd_ad7708c:
rol r16
dec r17
brne rd_ad7708a
sts ads_hi, r16
ldi r17, 8
rd_ad7708d:
cbi ad_port, ad_clk
sbi ad_port, ad_clk
sbic ad_pin, ad_do
jmp rd_ad7708e
clc
jmp rd_ad7708f
rd_ad7708e:
sec
rd_ad7708f:
rol r16
dec r17
brne rd_ad7708d
sts ads_lo, r16
ret |