目次

点滅器

 物体が指定エリアを横断するような、鉄道の踏み切りでは
 進入禁止のための警告にランプを点滅することがあります。

 この点滅器を8048を利用して作成しました。

 点滅動作を指定する信号は、論理値で与えられるとして
 点滅指定の入力とLEDの点滅および消灯を8048が担当する
 仕様を採用。

 ブロック図で示すと以下。



 仕様を満足するために、シーケンスを考えます。
  1. 状態値入力
  2. 状態値が'1'ならば5に遷移
  3. LED消灯
  4. 6に遷移
  5. LED点滅
  6. 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の点灯回路は、工夫が必要。

目次

inserted by FC2 system