> 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