お世話になっております。後藤です。 日立マイクロコンピュータ H8/300Hシリーズ 内蔵I/O編 第2版 2.基礎編 2.14 ブロック転送についての質問です。 ■ポートAの0(AKI-H8 MBでは、CN1の8PIN)の出力だけ 反転してしまいます。なぜでしょうか? アプリケーションノートに記載されているコードをそのまま 打ち込んだだけでは動作しませんでした。 そこで自分なりに解釈し、AKI-H8マザーボード用に修正しました。 しかしどうにも期待通りの動作をしてくれません。 ポートAをポート5のLEDでモニターするようにしています。 が、LED1が点灯しない事から 内部では正常で 外部出力のみ反転している気がします。 なんか、いやな予感がするのですが、皆さんの環境では どうでしょうか? 長くなりますが下にコードをのせておきます。 よろしくご教授お願い致します。 (見にくいですがTAB=12で設定したままコピーしています。) ----------以下コード---------- ;出典: 日立マイクロコンピュータ ; H8/300Hシリーズ 内蔵I/O編 ; 第2版 2.基礎編 2.14 ブロック転送 ;変更: 2001.04.20 by Gotoh ; AKI-H8 MB用 ;仕様: 外部信号の立下りエッジ検出ごとに ; 3ワードデータを2回 I/Oポートに転送し、 ; 16ビットのデータ出力を行う。 ;************************************************ ;* * ;* VECTOR ADDRESS * ;* * ;************************************************ .CPU 300HA .SECTION VECT,CODE,LOCATE=H'000000 ; RES .DATA.L BLKMN ;リセット ;************************************************ ;* * ;* SYMBOLDEFINITIONS * ;* * ;************************************************ ;**************** DMAC 0A *********************** MAR0AR: .EQU H'FFFF20 ;Memory address register ETCR0AH: .EQU H'FFFF24 ;Transmit cunt register'H' ETCR0AL: .EQU H'FFFF25 ;Transmit cunt register'L' DTCR0A: .EQU H'FFFF27 ;Data transfer control register DTE: .EQU 7 ;転送を許可/禁止するビット DTSZ: .EQU 6 ;転送されるデータサイズを選択する SAID: .EQU 5 ;MARBをインクリメントするかディクリメントするか SAIDE: .EQU 4 ; または固定とするかを選択する DTIE: .EQU 3 ;転送終了時、CPUに割込みを許可/禁止する DTS2A: .EQU 2 ;いずれも1にセットする DTS1A: .EQU 1 ;〃 DTS0A: .EQU 0 ;ブロック転送モードを選択する ;**************** DMAC 0B *********************** MAR0BR: .EQU H'FFFF28 ;Memory address register ETCR0BH: .EQU H'FFFF2C ;Transmit cunt register'H' DTCR0B: .EQU H'FFFF2F ;Data transfer control register DTME: .EQU 7 ;DTEビットとともに転送の許可/禁止を制御する ; 割込みが発生すると0にクリアされる RESERVE: .EQU 6 ;リザーブ DAID: .EQU 5 ;データ転送時MARBをインクリメントするかディクリメントするか DAIDE: .EQU 4 ; または固定とするかを選択する TMS: .EQU 3 ;ブロック転送モード時、ソース側とディスティネーション側の ; どちらをブロックエリアとするかを選択する DTS2B: .EQU 2 ;データ転送の起動要因を設定する DTS1B: .EQU 1 ;〃 DTS0B: .EQU 0 ;〃 ;**************** PORT 5 ************************ P5DDR: .EQU H'FFFFC8 P5DR: .EQU H'FFFFCA ;**************** PORT 9 ************************ P9DDR: .EQU H'FFFFD0 P9DR: .EQU H'FFFFD2 ;**************** PORT A ************************ PADDR: .EQU H'FFFFD1 PADR: .EQU H'FFFFD3 ;**************** PORT B ************************ PBDDR: .EQU H'FFFFD4 PBDR: .EQU H'FFFFD6 DREQ0: .EQU 6 ;************************************************ ;* * ;* MAIN PROGRAM : BLKMN * ;* * ;************************************************ .SECTION PROG,CODE,LOCATE=H'010000 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 MOV.L #SRCADD,ER0 ;転送元先頭アドレスの設定 MOV.L ER0,@MAR0AR MOV.L #P9DR,ER0 ;転送先先頭アドレスの設定 MOV.L ER0,@MAR0BR MOV.W #H'0002,R0 ;ブロック転送回数の設定 MOV.W R0,@ETCR0BH MOV.B #H'03,R0L ;ブロックサイズの設定 MOV.B R0L,@ETCR0AH MOV.B R0L,@ETCR0AL BCLR #DTME,@DTCR0B ;転送禁止 BCLR #RESERVE,@DTCR0B ;リザーブ BCLR #DAID,@DTCR0B ;MARB固定 BCLR #DAIDE,@DTCR0B ;〃 BSET #TMS,@DTCR0B ;ソース側 BSET #DTS2B,@DTCR0B ;立下りエッジ BSET #DTS1B,@DTCR0B ;〃 BCLR #DTS0B,@DTCR0B ;〃 BCLR #DTE,@DTCR0A ;転送禁止 BSET #DTSZ,@DTCR0A ;ワード BCLR #SAID,@DTCR0A ;転送終了後MARAをインクリメント BSET #SAIDE,@DTCR0A ;〃 BCLR #DTIE,@DTCR0A ;割込み禁止 BSET #DTS2A,@DTCR0A ;フルアドレス BSET #DTS1A,@DTCR0A ;〃 BSET #DTS0A,@DTCR0A ;ブロック BLKMN01: BTST #DREQ0,@PBDR ;■DREQ0が発生したか? BNE BLKMN01 ;No BSET #DTME,@DTCR0B ;データ転送許可 BLKMN02: BTST #DTE,@DTCR0A ;■指定回数転送されたか? BNE BLKMN02 ;No BSET #DTE,@DTCR0A ;データ転送許可 BSET #DTIE,@DTCR0A ;転送終了割り込み(DEND)要求を許可 BLKMN99: MOV.B @PADR,R0L ;PA0の状態をLED1に出力 MOV.B R0L,@P5DR ;PA1の状態をLED2に出力 BRA BLKMN99 ;************************************************ ;* * ;* DATATABLE(OUTPUTPATTERN) * ;* * ;************************************************ SRCADD: .EQU $ ; FEDCBA98 76543210 .DATA.W H'1111 ;B'00010001 00010001 ->0 +->0 .DATA.W H'2222 ;B'00100010 00100010 ->1 / 1 .DATA.W H'0000 ;B'00000000 00000000 ->2-+ 2-> .END ; |||||||| |||||||| ; VVVVVVVV VVVVVVVV ; 76543210 76543210 ; P9 PA