[H8-ML(1098)] 内蔵I/O編 2.14 ブロック転送について
From: "Kohya Gotoh" <hoshikage@xxxxxxxxx>
Date: 2001年04月19日(木)21時36分09秒
お世話になっております。後藤です。
日立マイクロコンピュータ 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

スレッド概略
[表示中](起点)
 └[1099(1)]


投稿順に移動
[←前の記事へ(P)]
[→次の記事へ(N)]


リスト表示へ
[このスレッド(T)]
[本記事の前後(L)]