目次
前
次
点滅器
物体が指定エリアを横断するような、鉄道の踏み切りでは
進入禁止のための警告にランプを点滅することがあります。
この点滅器を8048を利用して作成しました。
点滅動作を指定する信号は、論理値で与えられるとして
点滅指定の入力とLEDの点滅および消灯を8048が担当する
仕様を採用。
ブロック図で示すと以下。
仕様を満足するために、シーケンスを考えます。
- 状態値入力
- 状態値が'1'ならば5に遷移
- LED消灯
- 6に遷移
- LED点滅
- 1に戻る
シーケンスをコードにすると、以下でしょうか。
MAIN:
; get state
call GET_EVT
; judge
mov a,r7
jb0 MAIN1
; turn off LED
call LED_OFF
; exit
jmp MAINL
; flashing
MAIN1:
call FLASH
MAINL:
;
jmp MAIN
シーケンスを実現するのに、必要となるソフトウエア
の部品をリスト。
これら3つの部品をサブルーチンで用意します。
論理値入力
8048には、入力専用ピンとして、T1があるので
このT1を使うことにします。
T1ピンの入力で論理値を判定し、それをレジスタの
中に入れておけばよいので、サブルーチンは、以下
としておきます。
GET_EVT:
; clear
mov r7,#0
; judge
JNT1 GET_EVTX
; set
mov r7,#1
GET_EVTX:
ret
動作シーケンスでは、このサブルーチンを呼び出して
次の動作の判定をしていきます。
LED消灯
LEDランプを点滅か消灯させるので、どこにLEDを
接続するのかを決めます。
点灯には論理値の'1'を、消灯には論理値の'0'を出力
すればよいので、論理値を出力するサブルーチンを
作っておき、ラッパーサブルーチンを被せることに。
PUT_LED:
; get value from register
mov a,r6
; impress
outl P1,a
;
ret
LED_ON:
; set value
mov r6,#1
; impress
call PUT_LED
;
ret
LED_OFF:
; clear
mov r6,#0
; impress
call PUT_LED
;
ret
ラッパーサブルーチンのうち、LED_OFFを
使うと消灯が実現できます。
LED点滅
点滅は、LEDの点灯と消灯を交互に呼び出せば実現
できます。
1秒の無駄時間生成があると仮定してみれば
点滅サブルーチンは、以下となります。
FLASH:
; turn on
call LED_ON
; wait
call DELAY
; turn off
call LED_OFF
; wait
call DELAY
;
ret
1秒の無駄時間生成には、タイマー割込みを使います。
無駄時間生成
内蔵のタイマーカウンタの値を利用すればよいでしょう。
6MHzでシステムクロックを利用しているときは
T0に与えられるクロックは、12.5kHzになります。
カウンタで250分周としておけば、タイマーカウンタで
生成する周波数は50Hz。
タイマー割込みが50Hzで発生するたびに、別途用意した
カウンタで50カウントし、50になったなら終了すれば
1秒生成ができます。
50をカウントするレジスタをr5としておき、タイマー割込みで
インクリメントして対応。
DELAY:
; set value
mov r5,#0
; loop
DELAYL:
mov a,#50
xrl a,r5
jz DELAYX
jmp DELAYL
;
DELAYX:
ret
タイマーの初期化は、以下。
TZERO equ 6
INIT_TIM:
; stop counter
stop tcnt
; initialize
mov a,#TZERO
mov t,a
; start timer
strt t
;
ret
タイマー割込みが発生したときは、内蔵カウンタの
初期化と、レジスタr5のインクリメントで対応。
E_TIMX:
; push
mov r2,a
; stop counter
stop tcnt
; initialize
mov a,#TZERO
mov t,a
; increment
inc r5
; pop
mov a,r2
;
retr
まとめます。
; FLASHIG
;
INCLUDE 8048.LIB
;*******************
; value and address
;*******************
TZERO equ 6
TFLAG 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
jmp E_TIMX
org 10h
;**************
; sub routines
;**************
E_TIMX:
; push
mov r2,a
; stop counter
stop tcnt
; initialize
mov a,#TZERO
mov t,a
; increment
inc r5
; pop
mov a,r2
;
retr
INIT:
; disable external interrupt
dis i
; disable timer interrupt
dis tcnti
; initialize I/O
clr a
outl p1,a
outl p2,a
; enable timer
start t
; clear
clr a
; copy
mov r0,a
mov r1,a
mov r2,a
mov r3,a
mov r4,a
mov r5,a
mov r6,a
mov r7,a
;
ret
INIT_TIM:
; stop counter
stop tcnt
; initialize
mov a,#TZERO
mov t,a
; start timer
strt t
;
ret
GET_EVT:
; clear
mov r7,#0
; judge
JNT1 GET_EVTX
; set
mov r7,#1
GET_EVTX:
ret
PUT_LED:
; get value from register
mov a,r6
; impress
outl P1,a
;
ret
LED_ON:
; set value
mov r6,#1
; impress
call PUT_LED
;
ret
LED_OFF:
; clear
mov r6,#0
; impress
call PUT_LED
;
ret
FLASH:
; turn on
call LED_ON
; wait
call DELAY
; turn off
call LED_OFF
; wait
call DELAY
;
ret
DELAY:
; set value
mov r5,#0
; loop
DELAYL:
mov a,#50
xrl a,r5
jz DELAYX
jmp DELAYL
;
DELAYX:
ret
;**************
; main routine
;**************
org 100h
START:
call INIT
call INIT_TIM
; enable
en TCNTI
MAIN:
; get state
call GET_EVT
; judge
mov a,r7
jb0 MAIN1
; turn off LED
call LED_OFF
; exit
jmp MAINL
; flashing
MAIN1:
call FLASH
MAINL:
;
jmp MAIN
end
リストにすると、次のようになります。
0000 ; FLASHIG
0000 ;
0000 INCLUDE 8048.LIB
0000 list
0000
0000 ;*******************
0000 ; value and address
0000 ;*******************
0006 TZERO equ 6
0018 TFLAG 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 0410 + jmp E_TIMX
0009
0009 org 10h
0010 ;**************
0010 ; sub routines
0010 ;**************
0010 E_TIMX:
0010 ; push
0010 AA + mov r2,a
0011 ; stop counter
0011 65 + stop tcnt
0012 ; initialize
0012 2306 + mov a,#TZERO
0014 62 + mov t,a
0015 ; increment
0015 1D + inc r5
0016 ; pop
0016 FA + mov a,r2
0017 ;
0017 93 + retr
0018
0018 INIT:
0018 ; disable external interrupt
0018 15 + dis i
0019 ; disable timer interrupt
0019 35 + dis tcnti
001A ; initialize I/O
001A 27 + clr a
001B 39 + outl p1,a
001C 3A + outl p2,a
001D ; enable timer
001D 55 + start t
001E ; clear
001E 27 + clr a
001F ; copy
001F A8 + mov r0,a
0020 A9 + mov r1,a
0021 AA + mov r2,a
0022 AB + mov r3,a
0023 AC + mov r4,a
0024 AD + mov r5,a
0025 AE + mov r6,a
0026 AF + mov r7,a
0027 ;
0027 83 + ret
0028
0028 INIT_TIM:
0028 ; stop counter
0028 65 + stop tcnt
0029 ; initialize
0029 2306 + mov a,#TZERO
002B 62 + mov t,a
002C ; start timer
002C 55 + strt t
002D ;
002D 83 + ret
002E
002E GET_EVT:
002E ; clear
002E BF00 + mov r7,#0
0030 ; judge
0030 4634 + JNT1 GET_EVTX
0032 ; set
0032 BF01 + mov r7,#1
0034
0034 GET_EVTX:
0034
0034 83 + ret
0035
0035 PUT_LED:
0035 ; get value from register
0035 FE + mov a,r6
0036 ; impress
0036 39 + outl P1,a
0037 ;
0037 83 + ret
0038
0038 LED_ON:
0038 ; set value
0038 BE01 + mov r6,#1
003A ; impress
003A 1435 + call PUT_LED
003C ;
003C 83 + ret
003D
003D LED_OFF:
003D ; clear
003D BE00 + mov r6,#0
003F ; impress
003F 1435 + call PUT_LED
0041 ;
0041 83 + ret
0042
0042 FLASH:
0042 ; turn on
0042 1438 + call LED_ON
0044 ; wait
0044 144B + call DELAY
0046 ; turn off
0046 143D + call LED_OFF
0048 ; wait
0048 144B + call DELAY
004A ;
004A 83 + ret
004B
004B DELAY:
004B ; set value
004B BD00 + mov r5,#0
004D ; loop
004D DELAYL:
004D 2332 + mov a,#50
004F DD + xrl a,r5
0050 C654 + jz DELAYX
0052 044D + jmp DELAYL
0054 ;
0054 DELAYX:
0054 83 + ret
0055
0055 ;**************
0055 ; main routine
0055 ;**************
0055 org 100h
0100 START:
0100 1418 + call INIT
0102 1428 + call INIT_TIM
0104 ; enable
0104 25 + en TCNTI
0105 MAIN:
0105 ; get state
0105 142E + call GET_EVT
0107
0107 ; judge
0107 FF + mov a,r7
0108 120E + jb0 MAIN1
010A
010A ; turn off LED
010A 143D + call LED_OFF
010C ; exit
010C 2410 + jmp MAINL
010E
010E ; flashing
010E MAIN1:
010E 1442 + call FLASH
0110
0110 MAINL:
0110 ;
0110 2405 + jmp MAIN
0112
0112 end
LEDを2個利用すると、鉄道の踏み切り警報機を実現
できます。ただし、LEDの点灯回路は、工夫が必要。
目次
前
次