後藤さん、こんにちは。廣田@本庄です。
Kohya Gotoh wrote:
>
> もしくは、下のCPU割り込みを消しとけば良かったんですね
> "138 BSET #DTIE,@DTCR0A"
消すと、DMA終了後の割り込みが発生しなくなりますから、1回目の
DMA終了後の割り込み時のDMAC初期設定が出来なくなり、動きが
変わってきてしまいます。
> もともとのプログラム、
> アプリケーションノート 内蔵I/O編 163ページには
> "128 BTST #DTME,@DTCR0B"
> と記述されてます。NIM割込みを使うって事ですよね。
違います。NIM(NMIの間違い?)なんて使っていません。マニュアルの
DMACの起動要因のところを見てください。NMIは起動要因になっていま
せん。
マニュアルでDMAとNMIとの関係に触れているのは
「ブロックDMA途中でNMIが発生するとDMAの途中でDTME=0となり、
DMAが動作途中で止まってしまうから処理に注意してね。」と
あるのです。
ここで、DTMEビットをチェックしているのは、単にDTMEビットが
LOWになるのを待っているだけです。
なぜ、ここに待ちループがあるのかは解りません。どちらにしても
数行前でDTMEビットを0に設定していますから0のはずでこのループ
はループしないでしょう。
> だけど、アプリケーションノート 内蔵I/O編 157ページには、
> 外部信号としてDREQを使うようになってます。
>
> ★それで、DREQ0を使うように修正したんです。
> "128' BTST #DREQ0,@PBDR"
DREQ0pinはDMACが監視しているpinですからCPUのプログラムで
監視する必要はありません。
DMA=CPUが知らないところで起動し、実行し、終了し、終わった事を
CPUに知らせるのです。
> その時
> "138 BSET #DTIE,@DTCR0A"
> は必要なくなったんですよね。
DMAC動作が終了したことを知らせる手段は終了割り込みしかありま
せん。DTIE=1としなければ割り込みが発生しなくなりますから
CPUはDMACの動作を常時監視しなければならないためDMACの存在意味が
無くなります。
LEDがつかない原因は今までのお話から推測出来ます。
だめもとですが、
BLKMN: .EQU $
MOV.L #H'FFFEFE,SP ;スタックポインタを設定する
MOV.B #H'FF,R0L
MOV.B R0L,@P5DDR ;ポートを出力に設定
MOV.B R0L,@P9DDR
MOV.B R0L,@PADDR
MOV.B #H'00,R0L
MOV.B R0L,@PBDDR ;ポートを入力に設定
MOV.B R0L,@P5DR ;出力ポートを"L"に設定
MOV.B R0L,@P9DR
MOV.B R0L,@PADR
なっているところを
BLKMN: .EQU $
MOV.L #H'FFFEFE,SP ;スタックポインタを設定する
MOV.B #H'FF,R0L
MOV.B R0L,@P5DDR ;ポートを出力に設定
MOV.B R0L,@P9DDR
MOV.B R0L,@PADDR
MOV.B #H'00,R0L
MOV.B R0L,@PBDDR ;ポートを入力に設定
MOV.B R0L,@P5DR ;出力ポートを"L"に設定
MOV.B R0L,@P9DR
MOV.B R0L,@PADR
BLKMN2: <-ここにラベルを追加。
とし、
DMAC終了割り込みベクタをBLKMN2としてみて下さい。
原因はBLKMN2:ラベルの上の3行にあるはずです。
--
/******************************************************************************
Name: 廣田 正孝 "Masataka Hirota"
E-mail address: mhirota@xxxxxxxxxxxxx
GCD03040@xxxxxxxxxxx
******************************************************************************/