目次

外部割込み処理

 8048には、外部割込みが1ピン、入力専用が2ピンあります。

 ピンアサインで見ると、以下。




 INTでは、レベルトリガーで外部回路の要求を認識。

 T1では、エッジトリガーで内部カウンタを+1していき
 カウンタのオーバーフローで割込み発生を認識します。

 内部での動作は、次の図で理解できるでしょう。



 タイマーカウンタのエッジトリガーを、システムクロックを
 分周したクロックにするのか、T1からの入力にするのかは
 アセンブリ言語の命令で指定できるようになっています。

   strt T  システムクロックの分周クロック利用

   strt CNT T1のエッジトリガー利用

 エッジトリガーを外して、カウントしないようにするには
 次の命令を利用。

   stop TCNT エッジトリガーを外す


 外部イベントを数えて、指定カウントになった
 ときに何かをする場合、オーバーフローの検知を
 しないとならず、カウンタに初期値を与えるのが
 定石。

 100回の外部イベントを数えて、通知して貰うには2の補数を活用。

SET_CNT:
	stop TCNT
	mov a,#100
	cpl a
	inc a
	mov T,a
	strt CNT
	;
	ret

 外部イベントには、分周器がないので1000回というような
 回数を扱いたいときには、100回の外部イベントが10回発生
 したと考えて対応。

 外部割込みは、タイマー割込みとシフトレジスタを
 組み合わせても実現可能。

 外部割込みを利用するときに、シフトレジスタを使うと
 エッジ処理がでます。

 信号が、L→Hになったときと、H→Lの変化で処理を
 異なるようにしたいような場合に便利です。

 エッジでの変化は、以下のように処理します。

GET_EDGE:
	; get previous value
	mov	a,@r1
	; shift
	rl	a
	; mask
	anl	a,#3
	; store
	mov	@r1,a

	; get now state
	in	a,P2
	; judge
	jb7	GET_EDGE1
	jmp	GET_EDGEX

	; add 1 to LSB
GET_EDGE1
	inc	@r1
	; transfer
	mov	a,@r1
	; mask
	anl	a,#3
	; judge
	jb0	GET_EDGE2
	; clear
	mov	@r0,#0
	; exit
	jmp	GET_EDGEX

	; set flag
GET_EDGE2:
	mov	@r0,#1

GET_EDGEX
	;
	ret

 T0、T1は入力専用なので、'0'と'1'であることを
 判断する命令(JT0、JT1、JNT0、JNT1)を利用の
 分岐も考えられます。


目次

inserted by FC2 system