目次

点滅器(その2)

 点滅器は、すでに扱っていますが、次の
 タイミングチャートを生成して、ポート
 に接続した8個のLEDを順次点灯させて
 みます。



 回路図は以下。



 8ステップで特定ビットを1にするので
 ビットセットのサブルーチンがあるとし
 次のようにメインコードを組み上げ。

MAIN:
	mov	r7,#8
	mov	r6,#7
MAINL:
	mov	a,r6
	mov	r2,a
	call	SET_BIT
	mov	a,r2
	outl	P1,a
	dec	r6
	djnz	r7,MAINL
	;
	jmp	MAIN

 サブルーチンのコーリングシーケンスは
 次のように指定。

 レジスタr2に、論理値の1をセットする
 ビット位置を格納。サブルーチンコール
 すると、レジスタr2に結果が格納されて
 くる。

 サブルーチン名をSET_BITとすると
 次のように定義できます。

SET_BIT:
	; store
	mov	a,r2
	mov	@r0,a
	; 0 bit
	jnz	SET_BIT1
	mov	r0,#01h
	jmp	SET_BITX
	; 1 bit
SET_BIT1:
	mov	a,@r0
	xrl	a,#1
	jnz	SET_BIT2
	mov	r0,#02h
	jmp	SET_BITX
	; 2 bit
SET_BIT2:
	mov	a,@r0
	xrl	a,#2
	jnz	SET_BIT3
	mov	r0,#04h
	jmp	SET_BITX
	; 3 bit
SET_BIT3:
	mov	a,@r0
	xrl	a,#3
	jnz	SET_BIT4
	mov	r0,#08h
	jmp	SET_BITX
	; 4 bit
SET_BIT4:
	mov	a,@r0
	xrl	a,#4
	jnz	SET_BIT5
	mov	r0,#10h
	jmp	SET_BITX
	; 5 bit
SET_BIT5:
	mov	a,@r0
	xrl	a,#5
	jnz	SET_BIT6
	mov	r0,#20h
	jmp	SET_BITX
	; 6 bit
SET_BIT6:
	mov	a,@r0
	xrl	a,#6
	jnz	SET_BIT7
	mov	r0,#40h
	jmp	SET_BITX
	; 7 bit
SET_BIT7:
	mov	a,@r0
	xrl	a,#7
	jnz	SET_BITX
	mov	r0,#80h
	;
SET_BITX:
	;
	ret

 考え方は、単純です。
 レジスタr2の値を0から7のいずれかに
 なっているかを判断して、レジスタr2に
 指定値を格納するだけ。

 排他的論理和を使い、指定値になっていると
 アキュムレータが0になることを利用。

 ポートの初期化や一時変数で使うエリアを
 考えて、まとめると以下。

;   BIT test
;
	INCLUDE 8048.LIB

;*******************
; value and address 
;*******************
TMP	equ	18h

;****************
; define symbols
;****************
ENTRY	equ	0h
E_INT	equ	3h
E_TIM	equ	7h

;*******************
; interrupt vectors
;*******************
	org	ENTRY
	jmp	START

	; external interrupt
	org	E_INT
	retr

	; timer interrupt
	org	E_TIM
	retr

	org	10h
;**************
; sub routines
;**************
INIT:
	; disable external interrupt
	dis	i
	; disable timer interrupt
	dis	tcnti
	; initialize I/O
	clr	a
	outl	P1,a
	outl	P2,a
	; set pointer
	mov	r0,#TMP
	;
	ret

SET_BIT:
	; store
	mov	a,r2
	mov	@r0,a
	; 0 bit
	jnz	SET_BIT1
	mov	r0,#01h
	jmp	SET_BITX
	; 1 bit
SET_BIT1:
	mov	a,@r0
	xrl	a,#1
	jnz	SET_BIT2
	mov	r0,#02h
	jmp	SET_BITX
	; 2 bit
SET_BIT2:
	mov	a,@r0
	xrl	a,#2
	jnz	SET_BIT3
	mov	r0,#04h
	jmp	SET_BITX
	; 3 bit
SET_BIT3:
	mov	a,@r0
	xrl	a,#3
	jnz	SET_BIT4
	mov	r0,#08h
	jmp	SET_BITX
	; 4 bit
SET_BIT4:
	mov	a,@r0
	xrl	a,#4
	jnz	SET_BIT5
	mov	r0,#10h
	jmp	SET_BITX
	; 5 bit
SET_BIT5:
	mov	a,@r0
	xrl	a,#5
	jnz	SET_BIT6
	mov	r0,#20h
	jmp	SET_BITX
	; 6 bit
SET_BIT6:
	mov	a,@r0
	xrl	a,#6
	jnz	SET_BIT7
	mov	r0,#40h
	jmp	SET_BITX
	; 7 bit
SET_BIT7:
	mov	a,@r0
	xrl	a,#7
	jnz	SET_BITX
	mov	r0,#80h
	;
SET_BITX:
	;
	ret

;**************
; main routine
;**************
	org	100h
START:
	call	INIT
MAIN:
	mov	r7,#8
	mov	r6,#7
MAINL:
	mov	a,r6
	mov	r2,a
	call	SET_BIT
	mov	a,r2
	outl	P1,a
	dec	r6
	djnz	r7,MAINL
	;
	jmp	MAIN

	end

 リスティングファイルは次のようになります。

0000          	;   BIT test
0000          	;
0000          		INCLUDE 8048.LIB
0000          		list
0000          	
0000          	;*******************
0000          	; value and address 
0000          	;*******************
0018          	TMP	equ	18h
0000          	
0000          	;****************
0000          	; define symbols
0000          	;****************
0000          	ENTRY	equ	0h
0003          	E_INT	equ	3h
0007          	E_TIM	equ	7h
0000          	
0000          	;*******************
0000          	; interrupt vectors
0000          	;*******************
0000          		org	ENTRY
0000 2400    +		jmp	START
0002          	
0002          		; external interrupt
0002          		org	E_INT
0003 93      +		retr
0004          	
0004          		; timer interrupt
0004          		org	E_TIM
0007 93      +		retr
0008          	
0008          		org	10h
0010          	;**************
0010          	; sub routines
0010          	;**************
0010          	INIT:
0010          		; disable external interrupt
0010 15      +		dis	i
0011          		; disable timer interrupt
0011 35      +		dis	tcnti
0012          		; initialize I/O
0012 27      +		clr	a
0013 39      +		outl	P1,a
0014 3A      +		outl	P2,a
0015          		; set pointer
0015 B818    +		mov	r0,#TMP
0017          		;
0017 83      +		ret
0018          	
0018          	SET_BIT:
0018          		; store
0018 FA      +		mov	a,r2
0019 A0      +		mov	@r0,a
001A          		; 0 bit
001A 9620    +		jnz	SET_BIT1
001C B801    +		mov	r0,#01h
001E 045D    +		jmp	SET_BITX
0020          		; 1 bit
0020          	SET_BIT1:
0020 F0      +		mov	a,@r0
0021 D301    +		xrl	a,#1
0023 9629    +		jnz	SET_BIT2
0025 B802    +		mov	r0,#02h
0027 045D    +		jmp	SET_BITX
0029          		; 2 bit
0029          	SET_BIT2:
0029 F0      +		mov	a,@r0
002A D302    +		xrl	a,#2
002C 9632    +		jnz	SET_BIT3
002E B804    +		mov	r0,#04h
0030 045D    +		jmp	SET_BITX
0032          		; 3 bit
0032          	SET_BIT3:
0032 F0      +		mov	a,@r0
0033 D303    +		xrl	a,#3
0035 963B    +		jnz	SET_BIT4
0037 B808    +		mov	r0,#08h
0039 045D    +		jmp	SET_BITX
003B          		; 4 bit
003B          	SET_BIT4:
003B F0      +		mov	a,@r0
003C D304    +		xrl	a,#4
003E 9644    +		jnz	SET_BIT5
0040 B810    +		mov	r0,#10h
0042 045D    +		jmp	SET_BITX
0044          		; 5 bit
0044          	SET_BIT5:
0044 F0      +		mov	a,@r0
0045 D305    +		xrl	a,#5
0047 964D    +		jnz	SET_BIT6
0049 B820    +		mov	r0,#20h
004B 045D    +		jmp	SET_BITX
004D          		; 6 bit
004D          	SET_BIT6:
004D F0      +		mov	a,@r0
004E D306    +		xrl	a,#6
0050 9656    +		jnz	SET_BIT7
0052 B840    +		mov	r0,#40h
0054 045D    +		jmp	SET_BITX
0056          		; 7 bit
0056          	SET_BIT7:
0056 F0      +		mov	a,@r0
0057 D307    +		xrl	a,#7
0059 965D    +		jnz	SET_BITX
005B B880    +		mov	r0,#80h
005D          		;
005D          	SET_BITX:
005D          		;
005D 83      +		ret
005E          	
005E          	;**************
005E          	; main routine
005E          	;**************
005E          		org	100h
0100          	START:
0100 1410    +		call	INIT
0102          	MAIN:
0102 BF08    +		mov	r7,#8
0104 BE07    +		mov	r6,#7
0106          	MAINL:
0106 FE      +		mov	a,r6
0107 AA      +		mov	r2,a
0108 1418    +		call	SET_BIT
010A FA      +		mov	a,r2
010B 39      +		outl	P1,a
010C CE      +		dec	r6
010D EF06    +		djnz	r7,MAINL
010F          		;
010F 2402    +		jmp	MAIN
0111          	
0111          		end

 次のようなタイミングチャートで、ビットの変化を
 する場合には、メイン処理に工夫をして対応します。



 レジスタr7の変化からレジスタr6の変化にします。

MAIN:
	mov	r7,#8
	mov	r6,#0
MAINL:
	mov	a,r6
	mov	a,r2
	call	SET_BIT
	mov	a,r2
	outl	P1,a
	inc	r6
	djnz	r7,MAINL
	;
	jmp	MAIN

 論理値の1が順次シフトして様子は、オシロスコープで
 観測しておけばよいのですが、目視可能にするためには
 無駄時間が必要。次のようにソフトウエアでのループを
 回せばよいでしょう。

WAIT:
	; set counter
	mov	R5,#0
WAITL:
	nop
	djnz	R5,WAITL
	;
	ret

 全体では、次のようにまとめられます。

;   BIT test
;
	INCLUDE 8048.LIB

;*******************
; value and address 
;*******************
TMP	equ	20h

;****************
; define symbols
;****************
ENTRY	equ	0h
E_INT	equ	3h
E_TIM	equ	7h

;*******************
; interrupt vectors
;*******************
	org	ENTRY
	jmp	START

	; external interrupt
	org	E_INT
	retr

	; timer interrupt
	org	E_TIM
	retr

	org	10h
;**************
; sub routines
;**************
INIT:
	; disable external interrupt
	dis	i
	; disable timer interrupt
	dis	tcnti
	; initialize I/O
	clr	a
	outl	P1,a
	outl	P2,a
	; set pointer
	mov	r0,#TMP
	;
	ret

SET_BIT:
	; store
	mov	a,r2
	mov	@r0,a
	; 0 bit
	jnz	SET_BIT1
	mov	r0,#01h
	jmp	SET_BITX
	; 1 bit
SET_BIT1:
	mov	a,@r0
	xrl	a,#1
	jnz	SET_BIT2
	mov	r0,#02h
	jmp	SET_BITX
	; 2 bit
SET_BIT2:
	mov	a,@r0
	xrl	a,#2
	jnz	SET_BIT3
	mov	r0,#04h
	jmp	SET_BITX
	; 3 bit
SET_BIT3:
	mov	a,@r0
	xrl	a,#3
	jnz	SET_BIT4
	mov	r0,#08h
	jmp	SET_BITX
	; 4 bit
SET_BIT4:
	mov	a,@r0
	xrl	a,#4
	jnz	SET_BIT5
	mov	r0,#10h
	jmp	SET_BITX
	; 5 bit
SET_BIT5:
	mov	a,@r0
	xrl	a,#5
	jnz	SET_BIT6
	mov	r0,#20h
	jmp	SET_BITX
	; 6 bit
SET_BIT6:
	mov	a,@r0
	xrl	a,#6
	jnz	SET_BIT7
	mov	r0,#40h
	jmp	SET_BITX
	; 7 bit
SET_BIT7:
	mov	a,@r0
	xrl	a,#7
	jnz	SET_BITX
	mov	r0,#80h
	;
SET_BITX:
	;
	ret

WAIT:
	; set counter
	mov	R5,#0
WAITL:
	nop
	djnz	R5,WAITL
	;
	ret

;**************
; main routine
;**************
	org	100h
START:
	call	INIT
MAIN:
	mov	r7,#8
	mov	r6,#0
MAINL:
	mov	a,r6
	mov	a,r2
	call	SET_BIT
	mov	a,r2
	outl	P1,a
	; update
	inc	r6
	; delay
	call	WAIT
	call	WAIT
	call	WAIT
	call	WAIT
	call	WAIT
	;
	djnz	r7,MAINL
	;
	jmp	MAIN

	end


目次

inserted by FC2 system