目次
前
次
外部割込み処理
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)を利用の
分岐も考えられます。
目次
前
次