目次
前
次
パルスモータ制御
パルスモータ制御ICを、8048に接続します。
ICのブロック図は、以下。
動作は、次の真理値表で理解できます。
モータを回転させるには、次のシーケンスを利用。
- VS2BのAに'1'をセット、VS2BのBに'0'をセット
- (INB,INA)=(0,1)を印加
- (INB,INA)=(0,0)を印加
- VS2BのBに'1'をセット、VS2BのAに'0'をセット
- (INB,INA)=(1,0)を印加
- (INB,INA)=(0,0)を印加
ポート1の4ビットにINA、INBV、VS2Bを接続して
論理値を出力すれば、パルスモータを回転させる
ことができます。
ポート1のピンアサインは以下。
- PORT1.7
- PORT1.6
- PORT1.5
- PORT1.4
- PORT1.3 VS2B(B)
- PORT1.2 VS2B(A)
- PORT1.1 INB
- PORT1.0 INA
必要なサブルーチンを定義します。
VS2B処理
ポート1の2ビット目を、セットするか
クリアするためのサブルーチンを別々に
作成。
EN_VA:
; get now state
in a,P1
; set target bit
orl a,#4
; impress
outl P1,a
;
ret
DIS_VA:
; get now state
in a,P1
; clr target bit
xrl a,#0fbh
; impress
outl P1,a
;
ret
EN_VB:
; get now state
in a,P1
; set target bit
orl a,#8
; impress
outl P1,a
;
ret
DIS_VB:
; get now state
in a,P1
; clr target bit
xrl a,#0f7h
; impress
outl P1,a
;
ret
INAとINBの処理
ポート1の0、1ビット目を、セットするか
クリアするためのサブルーチンを別々に作成。
SET_A:
; get now state
in a,P1
; set target bit
orl a,#1
; impress
outl P1,a
;
ret
SET_B:
; get now state
in a,P1
; set target bit
orl a,#2
; impress
outl P1,a
;
ret
CLR_AB:
; get now state
in a,P1
; set target bit
xrl a,#0fch
; impress
outl P1,a
;
ret
正転処理
利用できるサブルーチンができているので
正転させるためのシーケンスを考えます。
- VS2BのAに'1'をセット、VS2BのBに'0'をセット
- (INB,INA)=(0,1)を印加
- (INB,INA)=(0,0)を印加
- VS2BのBに'1'をセット、VS2BのAに'0'をセット
- (INB,INA)=(1,0)を印加
- (INB,INA)=(0,0)を印加
シーケンスができれば、アセンブリ言語コードに
落としこみ。
FWD_ROT:
; VS2B
call EN_VA
call DIS_VB
; set A
call SET_A
; clear A
call CLR_AB
; VS2B
call DIS_VA
call EN_VB
; set B
call SET_B
; clear A
call CLR_AB
;
ret
逆転処理
逆転は、INBからの電圧印加でシーケンスを
開始します。
REV_ROT:
; VS2B
call DIS_VA
call EN_VB
; set B
call SET_B
; clear A
call CLR_AB
; VS2B
call EN_VA
call DIS_VB
; set A
call SET_A
; clear A
call CLR_AB
;
ret
サブルーチンを用意したので、ハードウエアを半田付け。
大阪のデジットで1個¥100で入手できるパルス
モータにドライバとなるICを接続。
8048は、ドライバICに制御パルスを出力します。
まとめると、以下。
;
; TEST program for 8048 ( PROASM-II )
; Copyright (C) 2018 Kensuke Ooyu
;
INCLUDE 8048.LIB
;*******************
; value and address
;*******************
MODE equ 18h
ADR equ 19h
DIGITA equ 1Ah
DIGITB equ 1Bh
;****************
; 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
retr
org 10h
;**************
; sub routines
;**************
INIT:
; disable external interrupt
dis i
; disable timer interrupt
dis tcnti
; initialize I/O
mov a,#0
outl p1,a
outl p2,a
ret
EN_VA:
; get now state
in a,P1
; set target bit
orl a,#4
; impress
outl P1,a
;
ret
DIS_VA:
; get now state
in a,P1
; clr target bit
xrl a,#0fbh
; impress
outl P1,a
;
ret
EN_VB:
; get now state
in a,P1
; set target bit
orl a,#8
; impress
outl P1,a
;
ret
DIS_VB:
; get now state
in a,P1
; clr target bit
xrl a,#0f7h
; impress
outl P1,a
;
ret
SET_A:
; get now state
in a,P1
; set target bit
orl a,#1
; impress
outl P1,a
;
ret
SET_B:
; get now state
in a,P1
; set target bit
orl a,#2
; impress
outl P1,a
;
ret
CLR_AB:
; get now state
in a,P1
; set target bit
xrl a,#0fch
; impress
outl P1,a
;
ret
FWD_ROT:
; VS2B
call EN_VA
call DIS_VB
; set A
call SET_A
; clear A
call CLR_AB
; VS2B
call DIS_VA
call EN_VB
; set B
call SET_B
; clear A
call CLR_AB
;
ret
REV_ROT:
; VS2B
call DIS_VA
call EN_VB
; set B
call SET_B
; clear A
call CLR_AB
; VS2B
call EN_VA
call DIS_VB
; set A
call SET_A
; clear A
call CLR_AB
;
ret
;**************
; main routine
;**************
org 100h
START:
call INIT
MAIN:
;
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 ;*******************
0018 MODE equ 18h
0019 ADR equ 19h
001A DIGITA equ 1Ah
001B DIGITB equ 1Bh
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 93 + retr
0008
0008 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 2300 + mov a,#0
0014 39 + outl p1,a
0015 3A + outl p2,a
0016
0016 83 + ret
0017
0017 EN_VA:
0017 ; get now state
0017 09 + in a,P1
0018 ; set target bit
0018 4304 + orl a,#4
001A ; impress
001A 39 + outl P1,a
001B ;
001B 83 + ret
001C
001C DIS_VA:
001C ; get now state
001C 09 + in a,P1
001D ; clr target bit
001D D3FB + xrl a,#0fbh
001F ; impress
001F 39 + outl P1,a
0020 ;
0020 83 + ret
0021
0021 EN_VB:
0021 ; get now state
0021 09 + in a,P1
0022 ; set target bit
0022 4308 + orl a,#8
0024 ; impress
0024 39 + outl P1,a
0025 ;
0025 83 + ret
0026
0026 DIS_VB:
0026 ; get now state
0026 09 + in a,P1
0027 ; clr target bit
0027 D3F7 + xrl a,#0f7h
0029 ; impress
0029 39 + outl P1,a
002A ;
002A 83 + ret
002B
002B SET_A:
002B ; get now state
002B 09 + in a,P1
002C ; set target bit
002C 4301 + orl a,#1
002E ; impress
002E 39 + outl P1,a
002F ;
002F 83 + ret
0030
0030 SET_B:
0030 ; get now state
0030 09 + in a,P1
0031 ; set target bit
0031 4302 + orl a,#2
0033 ; impress
0033 39 + outl P1,a
0034 ;
0034 83 + ret
0035
0035 CLR_AB:
0035 ; get now state
0035 09 + in a,P1
0036 ; set target bit
0036 D3FC + xrl a,#0fch
0038 ; impress
0038 39 + outl P1,a
0039 ;
0039 83 + ret
003A
003A FWD_ROT:
003A ; VS2B
003A 1417 + call EN_VA
003C 1426 + call DIS_VB
003E ; set A
003E 142B + call SET_A
0040 ; clear A
0040 1435 + call CLR_AB
0042 ; VS2B
0042 141C + call DIS_VA
0044 1421 + call EN_VB
0046 ; set B
0046 1430 + call SET_B
0048 ; clear A
0048 1435 + call CLR_AB
004A ;
004A 83 + ret
004B
004B REV_ROT:
004B ; VS2B
004B 141C + call DIS_VA
004D 1421 + call EN_VB
004F ; set B
004F 1430 + call SET_B
0051 ; clear A
0051 1435 + call CLR_AB
0053 ; VS2B
0053 1417 + call EN_VA
0055 1426 + call DIS_VB
0057 ; set A
0057 142B + call SET_A
0059 ; clear A
0059 1435 + call CLR_AB
005B ;
005B 83 + ret
005C
005C ;**************
005C ; main routine
005C ;**************
005C org 100h
0100 START:
0100 1410 + call INIT
0102
0102 MAIN:
0102 ;
0102 2402 + jmp MAIN
0104
0104 end
HEXファイルは、次のようになります。
:020000002400DA
:010003009369
:010007009365
:1000100015352300393A83094304398309D3FB3961
:1000200083094308398309D3F739830943013983A5
:10003000094302398309D3FC398314171426142B7E
:100040001435141C14211430143583141C14211479
:0C00500030143514171426142B143583BB
:0401000014102402B1
:00000001FF
目次
前
次