やっぱり最初はLEDでの点灯、点滅をやってみたいと思います。

TMPZ84C015は、内部に8bitのパラレルポートを2ポート内蔵しています。今回はその内1ポートにLEDを接続して、点灯、点滅を確認します。

ハード面
使用するポートは、CN1に接続されているPA0~PA7までのportAの中で、PA0にLEDを接続します。
接続方法は、”1”の時に点灯するように、PA0(CN1:26pin)に1KΩを接続し、LEDアノード(+)側を接続。LEDカソード(-)側はGNDに接続しました。

ソフト面
最初にPIOの初期化を行います。使用するポートはPIOAで、コントールレジスタ(PIOAC:1D)とデータレジスタ(PIOAD:1C)があります。
PIOAの初期化は、まず、モードの設定は、ここではbitモードのMODE3に設定します。続いて、PIOAポートの入出力設定(入力:1、出力:0)を行います。ここではbit0のみ出力で、他のbit7~1は入力に設定しています。次に割り込み設定を行いますが、ここでは割り込みは使用しないに設定しています。

pioainit:
	ld	b,3
	ld	hl,PIO_init_data
pioainit01:
	ld	a,(HL)
	out	(PIOAC),a
	inc	hl
	djnz	pioainit01
	ret
 
PIO_init_data:
	.db	0b11001111		;PIOAC:set 0xcf: Mode3 (bit mode)
	.db	0b11111110		;PIOAC:set 0xfe: D7-D1=input D0=output
	.db	0b00000000		;PIOAC:set 0x00: interrupt disables

初期化に続いて、PIOAの0bitに”1”を出力して、LEDを点灯しています。

下記のプログラムをアセンブルして、モニタlコマンドでHexファイルを読み込み、モニタcコマンド(コール)で”a000”から実行すると、LEDが点灯した後、モニタに戻ってきます。
この後、モニタのiコマンド(i/o操作)で”1c”のレジスタを指定して、”00”で消灯、”01”で点灯をモニタ上で確認できます。

全体のプログラムは下記のようになります。

	;;   TMPZ84C015  Parallel port test (port A)
	;;        
	;;			  	
        ;;  i/o address
        ;;      PIOAD   i/o  0x1C(r/w)
        ;;      PIOAC   i/o  0x1D(w)
        ;;      PIOBD   i/o  0x1E(r/w)
        ;;      PIOBC   i/o  0x1F(w)
        ;;      
        ;;
        ;; assembler
        ;;  program a000H
        ;;  data    a000H
        ;; assemblers  ASxxxx and ASlink V5.10
        ;; tmpz84c015_pio_test01.asm
        ;; $ asz80 -l -s -o tmpz84c015_pio_test01.asm
        ;; $ aslink -i tmpz84c015_pio_test01
        ;; $ monitor L command loedding ihx files at c(call) command a000

        .Z80

        .area TEST(ABS)

PIOAD	.equ	0x1c		;PIO-A CH DATA REG
PIOAC	.equ	0x1d		;PIO-A CH CONTL	REG

        .org    0xa000
start:
	call	pioainit

main:
      	ld 	a,0x01		;D0="H"
	out	(PIOAD),a	;PIOAD output
	ret
 
pioainit:
	ld	b,3
	ld	hl,PIO_init_data
pioainit01:
	ld	a,(HL)
	out	(PIOAC),a
	inc	hl
	djnz	pioainit01
	ret
 
PIO_init_data:
	.db	0b11001111		;PIOAC:set 0xcf: Mode3 (bit mode)
	.db	0b11111110		;PIOAC:set 0xfe: D7-D1=input D0=output
	.db	0b00000000		;PIOAC:set 0x00: interrupt disables

以前Z8S180で作成したディレープログラムを流用して、ディレータイミングをメインクロック20MHzに調整して、0.2Sごとに点滅するプログラムを作成しました。
モニタjコマンドで"a000”から実行します。LEDの点滅は無限ルーチンになっているので、終了は、リセットボタンを押して強制的にモニタに戻ります。

	;;   TMPZ84C015  Parallel port test (port A)
	;;        
	;;			  	
        ;;  i/o address
        ;;      PIOAD   i/o  0x1C(r/w)
        ;;      PIOAC   i/o  0x1D(w)
        ;;      PIOBD   i/o  0x1E(r/w)
        ;;      PIOBC   i/o  0x1F(w)
        ;;      
        ;;
        ;; assembler
        ;;  program a000H
        ;;  data    a000H
        ;; assemblers  ASxxxx and ASlink V5.10
        ;; tmpz84c015_pio_test01.asm
        ;; $ asz80 -l -s -o tmpz84c015_pio_test01.asm
        ;; $ aslink -i tmpz84c015_pio_test01
        ;; $ monitor L command loedding ihx files at j(jamp) command a000

        .Z80

        ;; dely timing set in 100uS
D100U   .equ    70      	;;clock in 20MHz set

PIOAD	.equ	0x1c		;PIO-A CH DATA REG
PIOAC	.equ	0x1d		;PIO-A CH CONTL	REG

        .area TEST(ABS)

        .org    0xa000
start:
	call	pioainit

main:
      	ld 	a,0x01		;D0="H"
	out	(PIOAD),a	;PIOAD output
	ld	b,200				;200ms dely
	call	delym
      	ld 	a,0x00		;D0="L"
	out	(PIOAD),a	;PIOAD output
	ld	b,200				;200ms dely
	call	delym
	jr 	main		;loop
 
pioainit:
	ld	b,3
	ld	hl,PIO_init_data
pioainit01:
	ld	a,(HL)
	out	(PIOAC),a
	inc	hl
	djnz	pioainit01
	ret

delym:                                  ;; B reg set *1mS dely
        push    bc
delyml: call    dely1m
        djnz    delyml
        pop     bc
        ret
 
dely1m:                                 ;; 1mS dely
        push    bc
        call    dely500u
        call    dely500u
        pop     bc
        ret
 
dely500u:                               ;; 500uS dely
        push    bc
        ld      b,5
dd5:    call dely100u
        djnz    dd5
        pop     bc
        ret
 
dely100u:                               ;; 100uS dely
        push    bc
        ld      b,D100U
l100u:  djnz    l100u
        pop     bc
        ret
 
PIO_init_data:
	.db	0b11001111		;PIOAC:set 0xcf: Mode3 (bit mode)
	.db	0b11111110		;PIOAC:set 0xfe: D7-D1=input D0=output
	.db	0b00000000		;PIOAC:set 0x00: interrupt disables
おすすめの記事