> A/D変換について、教えてください。
>
下記プログラムでH8-3664 ADC動作しています
試してください
割り込み通知をEventで行っていますが、FlagCheckに変更すれば
使えます
最初に ini_adc( )を読んでおいて、後はget_adc( )を繰り返し
呼ぶだけです
///// nkobayas@xxxxxxxxxx
---------------------------------------------------------------------------
;H8-3664: address 16bits
.heading "ADC: AD converter"
.print list
.include "hardware.d"
.include "task.d"
.import iset_flg,_wai_flg
.section P,code,align=2
;
; int getADC(void) get AN0
.export _get_adc
_get_adc:
bset #bADST,@ADCSR:8 ;start A/D conversion (auto cleared)
;wait for completion of A/D conversion
mov.w #TWF_ANDW+TWF_CLR,e1 ;(wfmode)
mov.w #EVNTADC,r1 ;(waiptn)
mov.w #SYSSIG,e0 ;(flgid)
xor.w r0,r0 ;(p_flgptn)
jsr @_wai_flg ;(UINT* p_flgptn, ID flgid, UINT waiptn, UINT wfmode)
mov.w @an0data,r0
;shift right 6bits to eliminate 0
shlr.w r0
shlr.w r0
shlr.w r0
shlr.w r0
shlr.w r0
shlr.w r0
rts
;--------------------------------------------------------------------------
; INT handler
;
.export adeINT
adeINT:
push.l er0
push.l er1
push.l er2
push.l er3
push.l er4
push.l er5
push.l er6
btst #bADF,@ADCSR:8 ;A/D end ?
beq intRtn ;spurious INT -->
bclr #bADF,@ADCSR:8 ;ACK INT
;only AN0 used (single mode)
mov.w @ADDRA,r0 ;get conversion (6 lowest bits:0)
mov.w r0,@an0data
;send signal for ADC completed
mov.w #SYSSIG,r4 ;sigID
mov.b #EVNTADC,r5l ;eventBitPattern
jsr @iset_flg ;(r4=sigID, r5l=bitEventInfo) simple subroutine
intRtn:
pop.l er6
pop.l er5
pop.l er4
pop.l er3
pop.l er2
pop.l er1
pop.l er0
rte
; ------------ initialization --------------------------------
.export _ini_adc
_ini_adc:
mov.b #b'01000000,r0l
; ||||||___CH2-0: (000=AN0)
; |||||_CKS: clock select (*0/1)=(134/70) states
; ||||_SCAN: (*0/1)=(single/scan)mode
; |||_ADST: A/D start (0/1)=(*/start conversion) auto clr
; ||_ADIE: A/D interrupt enable (0/*1)=(disable/enable)
; |_ADF: A/D end flag
mov.b r0l,@ADCSR:8
mov.b #b'00000000,r0l
; ||||||||_0: always zero
; ||______(reserved)
; |_TRGE: trigger enable (*0/1)=(disable/enable)
mov.b r0l,@ADCR:8
rts
.section B,data,align=2
an0data: .res.w 1
.end