So-net無料ブログ作成
検索選択

AD 変換に挑戦 [AVR]

AD 変換に挑戦してみました。

PC0 に入力された電圧を計測して PB の LED に表示します。
基準電圧はAVccです。
精度は8bit で計測完了割り込みで計測しています。

ADCの設定もタイマーのときと同じく(データシートや解説書などにある)表を見て、
ADCSRAとADMUXというレジスタにビットを立ててセットすることで設定を有効にします。

割り込みの中でもう一回計測要求して、次の割り込みを発生させることで
連続して値を読みます。

.include "m168def.inc"	;

;=============================================================
; Constants
;=============================================================
.equ ADCSRAVAL	= (1<<ADEN)|(1<<ADSC)|(1<<ADIF)|(1<<ADIE)|(1<<ADPS2)|(1<<ADPS1)|(1<<ADPS0)
.equ ADMUXVAL	= (1<<REFS0)|(1<<ADLAR)

;=============================================================
; variables
;=============================================================
.def acc		= r16	; accumulator


;=============================================================
; program
;=============================================================
.cseg					   ; Code segment

;=============================================================
; vectors
;=============================================================
.org 	0x0000		jmp	main	 		; reset handler
.org	0x002A		jmp adc_complete	; adc complete

;=============================================================
; main
;=============================================================
main:
	cli

	; initialize port
	ldi		acc, 0xff
	out		ddrb, acc
	out		portb, acc

	; initialize stack pointer
	ldi		acc, low(ramend)	; get lower byte of end of ram address
	out		spl, acc			; init stack lower pointer
	ldi		acc, high(ramend)	; get higher byte of end of ram address

	; initialize adc
	ldi		acc, ADMUXVAL
	sts		admux, acc
	ldi		acc, ADCSRAVAL
	sts		adcsra, acc
	ldi		acc, 0x00
	sts		adcsrb, acc

	sei						; allow all interruption

main_loop:
	rjmp	main_loop		; loop

;=============================================================
; adc_complete
;=============================================================
adc_complete:
	rcall s_vchk
	reti

;=============================================================
; s_vchk
;=============================================================
s_vchk:
	; output value to portb
	lds		acc, adch
	out		portb, acc

	; setadc interruption again	
	ldi		acc, ADCSRAVAL
	sts		adcsra, acc

	ret



nice!(0)  コメント(0)  トラックバック(0) 

nice! 0

コメント 0

コメントを書く

お名前:
URL:
コメント:
画像認証:
下の画像に表示されている文字を入力してください。

トラックバック 0

この広告は前回の更新から一定期間経過したブログに表示されています。更新すると自動で解除されます。