目次
前
次
電源位相制御
AC100Vの電源電圧を、位相制御すると
白熱電球の輝度調整やドリルモータの
回転数を可変できます。
(白熱電球は、現在、身の回りには
ありませんが)
電源電圧の波形でみると、位相を変化させて
負荷へと与える電力量を制御していることと
等価。
AC100Vの色をつけた領域の面積と出力の面積が
異なることがわかると思います。
面積の差が、負荷に与える電力量の差に相当。
位相制御を考えるときは、0Vを横切るときを
基準にします。次の回路で電圧が0Vを過ぎる
ときを検出します。
0Vを横切るときを、ゼロクロスポイントと
呼びます。ゼロクロスを、外部割込みとして
8048に与えれば、位相制御ができそう。
8048のピンアサインを確認しておきます。
外部割込みで使える端子には、INT、T0、T1が
ありますが、T1はエッジトリガーのカウントで
何かの動作をします。
INTを使い、変化に即応する仕様で考えます。
INTは、負論理なので、ゼロクロスポイントを
検出する回路は、次のように変更。
フォトカプラの出力を、エミッタ側から取り出します。
電圧が1.2Vを超えると、フォトカプラ内部のLEDが点灯
して、フォトトランジスタのコレクタからエミッタに
電流が流れて、抵抗に電圧を発生させます。
ゼロクロスポイントで、トリガーを発生させることが
できます。
INTの割込みはレベルトリガーなので、8048が反応できる
時間幅まで、ワンショット回路で引き延して対応。
割込みを受け付けたなら、指定時間だけ待って
ソリッドステートリレー(SSR)をオンオフさせます。
タイミングチャートでは、次のように指定します。
SSRは、以下を利用。
SSRは、制御ピンに'H'レベルを与えると
AC100Vを導通させてます。
トライアックを利用し、リレーの動作を半導体で
実現するデバイスがSSR。
リレーには寿命がありますが、SSRの方は適切な
使い方をすれば永久寿命になります。
位相制御のため、ポート2の4ビットをSSRの
制御ピンに接続して利用することにします。
ポート2の4ビット目に論理値を印加する
コードは、以下。
SND_H:
; set 2^4
mov r2,#10h
; get now state
in a,P2
; set bit
orl a,r2
; impress
outl P2,a
;
ret
SND_L:
; set 2^4
mov r2,#10h
; get now state
in a,P2
; clear bit
xrl a,r2
; impress
outl P2,a
;
ret
SSRに論理値'L'を、どれくらいの時間続けているのかを
指定するため、ポート1の8ビットを使って入力します。
8ビット値の入力は、以下。
GET_V:
; set pointer
mov r0,#INTV
; get value
mov a,@r0
mov r2,a
; load value
in a,P1
; copy
mov r3,a
; compare
anl a,r2
; judge
jz GET_V1
; store value
xch a,r3
mov @r0,a
GET_V1:
ret
既に格納している値と同じであれば、更新せずに維持。
どれ位遅延するかは、タイマーカウンタを利用。
タイマーカウンタに値を設定し、オーバーフロー
割込みで通知させます。
タイマーカウンタは、12.5kHz(周期80usec)の整数倍を設定可能。
タイマーカウンタをオーバーフローさせるために
2の補数を利用した値を設定します。
タイマーカウンタに値を設定するには、以下の
サブルーチンを利用。
SET_V:
; set pointer
mov r0,#INTV
; get value
mov a,@r0
; calculate
cpl a
inc a
; store
mov t,a
;
ret
ここまでで、必要なサブルーチンを定義できたので
動作シーケンスを考えていきます。
割込みが発生したときに、どのような操作をすれば
よいのかを確認しておきます。
外部割込み発生
このときのシーケンスは、以下。
- タイマー動作停止。
- SSRに対して、論理値'L'を出力。
- 遅延指定値を取得。
- 遅延指定値を設定。
- タイマー動作開始。
シーケンスをコードに置き換えます。
E_HND:
; stop timer
stop tcnt
; impress 'L' to SSR
call SND_L
; get interval value
call GET_V
; set interval value
call SET_V
; start timer
strt t
;
retr
タイマー割込み発生
このときのシーケンスは、以下。
- イベント通知フラグのクリア。
- SSRに対して、論理値'H'を出力。
このシーケンスは、メインルーチンで処理しますが
タイマー割込み時には、イベント通知フラグを設定
するコードを定義しておきます。
T_HND:
; set pointer
mov r1,#TFLAG
; set flag
mov a,#1
mov @r1,a
;
retr
初期化を含めて、全体をまとめると、以下。
;
; TEST program for 8048 ( PROASM-II )
; Copyright (C) 2018 Kensuke Ooyu
;
INCLUDE 8048.LIB
;*******************
; value and address
;*******************
DUMMY equ 128
INTV equ 18h
TFLAG equ 19h
;****************
; define symbols
;****************
ENTRY equ 0h
E_INT equ 3h
E_TIM equ 7h
;*******************
; interrupt vectors
;*******************
org ENTRY
jmp START
; external interrupt
org E_INT
jmp E_HND
; timer interrupt
org E_TIM
jmp T_HND
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
; initialize value
mov r0,#INTV
mov @r0,#DUMMY
; clear flag
mov r1,#TFLAG
mov @r1,#0
; enable external interrupt
en i
; enable timer interrupt
en tcnti
ret
SND_H:
; set 2^4
mov r2,#10h
; get now state
in a,P2
; set bit
orl a,r2
; impress
outl P2,a
;
ret
SND_L:
; set 2^4
mov r2,#10h
; get now state
in a,P2
; clear bit
xrl a,r2
; impress
outl P2,a
;
ret
GET_V:
; get value
mov a,@r0
mov r2,a
; load value
in a,P1
; copy
mov r3,a
; compare
anl a,r2
; judge
jz GET_V1
; store value
xch a,r3
mov @r0,a
GET_V1:
ret
SET_V:
; get value
mov a,@r0
; calculate
cpl a
inc a
; store
mov t,a
;
ret
E_HND:
; stop timer
stop tcnt
; impress 'L' to SSR
call SND_L
; get interval value
call GET_V
; set interval value
call SET_V
; start timer
strt t
;
retr
T_HND:
; set flag
mov @r1,#1
;
retr
;**************
; main routine
;**************
org 100h
START:
call INIT
MAIN:
; judge flag
mov a,#1
anl a,@r1
jz MAIN_END
; clear flag
mov @r1,#0
; impress 'H' to SSR
call SND_H
MAIN_END:
;
jmp MAIN
end
アセンブルリストは、以下。
0000 ;
0000 ; TEST program for 8048 ( PROASM-II )
0000 ; Copyright (C) 2018 Kensuke Ooyu
0000 ;
0000 INCLUDE 8048.LIB
0000 list
0000
0000 ;*******************
0000 ; value and address
0000 ;*******************
0080 DUMMY equ 128
0018 INTV equ 18h
0019 TFLAG equ 19h
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 043B + jmp E_HND
0005
0005 ; timer interrupt
0005 org E_TIM
0007 0444 + jmp T_HND
0009
0009 org 10h
0010 ;**************
0010 ; sub routines
0010 ;**************
0010 INIT:
0010 ; disable external interrupt
0010 15 + dis i
0011
0011 ; disable timer interrupt
0011 35 + dis tcnti
0012
0012 ; initialize I/O
0012 27 + clr a
0013 39 + outl p1,a
0014 3A + outl p2,a
0015
0015 ; initialize value
0015 B818 + mov r0,#INTV
0017 B080 + mov @r0,#DUMMY
0019
0019 ; clear flag
0019 B919 + mov r1,#TFLAG
001B B100 + mov @r1,#0
001D
001D ; enable external interrupt
001D 05 + en i
001E
001E ; enable timer interrupt
001E 25 + en tcnti
001F
001F 83 + ret
0020
0020 SND_H:
0020 ; set 2^4
0020 BA10 + mov r2,#10h
0022 ; get now state
0022 0A + in a,P2
0023 ; set bit
0023 4A + orl a,r2
0024 ; impress
0024 3A + outl P2,a
0025 ;
0025 83 + ret
0026
0026 SND_L:
0026 ; set 2^4
0026 BA10 + mov r2,#10h
0028 ; get now state
0028 0A + in a,P2
0029 ; clear bit
0029 DA + xrl a,r2
002A ; impress
002A 3A + outl P2,a
002B ;
002B 83 + ret
002C
002C GET_V:
002C ; get value
002C F0 + mov a,@r0
002D AA + mov r2,a
002E ; load value
002E 09 + in a,P1
002F ; copy
002F AB + mov r3,a
0030 ; compare
0030 5A + anl a,r2
0031 ; judge
0031 C635 + jz GET_V1
0033 ; store value
0033 2B + xch a,r3
0034 A0 + mov @r0,a
0035 GET_V1:
0035 83 + ret
0036
0036 SET_V:
0036 ; get value
0036 F0 + mov a,@r0
0037 ; calculate
0037 37 + cpl a
0038 17 + inc a
0039 ; store
0039 62 + mov t,a
003A ;
003A 83 + ret
003B
003B E_HND:
003B ; stop timer
003B 65 + stop tcnt
003C ; impress 'L' to SSR
003C 1426 + call SND_L
003E ; get interval value
003E 142C + call GET_V
0040 ; set interval value
0040 1436 + call SET_V
0042 ; start timer
0042 55 + strt t
0043 ;
0043 93 + retr
0044
0044 T_HND:
0044 ; set flag
0044 B101 + mov @r1,#1
0046 ;
0046 93 + retr
0047
0047 ;**************
0047 ; main routine
0047 ;**************
0047 org 100h
0100 START:
0100 1410 + call INIT
0102
0102 MAIN:
0102 ; judge flag
0102 2301 + mov a,#1
0104 51 + anl a,@r1
0105 C60B + jz MAIN_END
0107
0107 ; clear flag
0107 B100 + mov @r1,#0
0109
0109 ; impress 'H' to SSR
0109 1420 + call SND_H
010B
010B MAIN_END:
010B ;
010B 2402 + jmp MAIN
010D
010D end
HEXファイルは、次のようになります。
:020000002400DA
:02000300043BBC
:020007000444AF
:10001000153527393AB818B080B919B100052583CC
:10002000BA100A4A3A83BA100ADA3A83F0AA09AB3C
:100030005AC6352BA083F037176283651426142C1B
:0700400014365593B1019342
:0D0100001410230151C60BB100142024027D
:00000001FF
目次
前
次