後藤さん、こんにちは。廣田@本庄です。 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 ******************************************************************************/