例題3.1 SWITCHによるLED点灯/消灯プログラム


スイッチ 1が押されるとLEDが点灯し,スイッチ2が押されるとLEDが消灯するプログラムを作成します.
;       SWITCH.SRC    

;**************************************************
;*      SWITCHによるLED点灯/消灯プログラム  *
;**************************************************
;
;------CPUの指定-------
        .CPU    300HA
;

;----シンボルの定義------
P4DR    .EQU    H'FFFFC7       ;ポート4データレジスタ
P5DR    .EQU    H'FFFFCA       ;ポート5データレジスタ
LED1    .BEQU   0,P5DR         ;ポート5のbit0をLED1で表す
        .SECTION       ROM,CODE,LOCATE=H'000100       ;セクションの宣言

;-----I/Oの初期設定----
INIT:   MOV.L   #H'FFFF10,ER7  ;スタックポインタの設定
        MOV.B   #H'00,R0L      ;ポート4を入力に設定するため
        MOV.B   R0L,@H'FFFFC5  ;コントロールレジスタにH'00を書き込む
        MOV.B   #H'FF,R0L      ;ポート4をプルアップに設定するため
        MOV.B   R0L,@H'FFFFDA  ;入力プルアップMOSコントロールレジスタにH'FFを書き込む
        MOV.B   #H'FF,R0L      ;ポート5を出力に設定するため
        MOV.B   R0L,@H'FFFFC8  ;ポート5DDRにH'FFを書き込む

;----MAINルーチン-----
START:  MOV.B   @P4DR,R0L      ;現在のSW-1,2の状態をR0Lに読み込む
SW1:    BTST    #4,(___)       ;SW-1の状態(bit4)をチェック
        BNE     SW2            ;押されていなければSW2にジャンプ
        BSET    LED1           ;LED1を点灯する
SW2:    BTST    #5,R0L         ;SW-2の状態(bit5)をチェック
        (___)   START          ;押されていなければSTARTにジャンプ
        BSET    LED1           ;LED1を消灯する
        JMP     @START         ;STARTにジャンプ

        .END
                          

課題 3.1の説明

  • 7行目 CPUの指定をしています.
  • 10〜12行目 シンボルの定義をしています.ポート4データレジスタをP4DR,ポート5データレジスタをP5DR,P5DRのbit0をLED1と表しました.
  • 14行目 セクションの宣言をしています.
  • 17〜23行目 初期設定,スタックポインタにH'FFFF10を書き込んでいます.ポート4,5をそれぞれ入力,出力に設定しています.P4DDR,P5DDRに制御コードを書き込みます.付録からP4DDR,P5DDRの番地はそれぞれH'FFFFC5,H'FFFFC8であることが分かりますから,その番地に,入力ビットに設定するなら0を,出力ビットに設定したいなら1を書き込みます.ここではポート4を入力にポート5を出力に設定しています.また同時に,ポート4の入力ピンを内蔵のMOS-FETでプルアップ(プルアップ抵抗と同じ働き)するため,P4PCR(入力プルアップMOSコントロール)にはH'FF(全ビットプルアップ)を書き込みます.
  • 26〜33行目 ポートの設定はできました.次に,ポート4のbit4,bit5に接続しているSW-1,2の状態をR0Lに読み込みます.そして,SW-1の状態(bit4)をチェックしています.押されていれば,LED1に1をビットクリアしLED1を点灯します,押されていなければSW2にジャンプします.次に,SW-2の状態(bit5)をチェックしています.押されていれば,LED1に0をセットしLED1を消灯します.そして,ラベルSTARTにジャンプします.

今回新たに使ったニモニック

BTST

デスディネーションオペランドの指定された 1bitの状態を調べます

Ex) BTST #4,R0L ;R0レジスタ下位8bitのうちbit4の状態をチェックします

START: MOV.B @P4DR,R0L ;現在のSW-1,2の状態をR0Lに読み込む
SW1: BTST #4,R0L ;SW-1の状態(bit4)をチェック
    BNE SW2 ;押されていなければSW2にジャンプ
    BSET LED1 ;LED1を点灯する

課題 3.1の上記の部分はif文とよく似ています.if文とは「もし〜ならば,〜する」でした.
このプログラムでは,BTSTでP4DR(ポート4データレジスタ)のbit4を調べ,その値が0ならばZフラグ=1とし,1ならばZフラグ=0とします.そして,BNEではZフラグ=0のときは指定されたところ(この場合"SW2")にジャンプをします.そうでなければ,次の命令(この場合"BSET LED1")を実行します.つまり,「もし,P4DRのbit4が0ならば,指定したところにジャンプし,そうでなければ次の命令に進む」と言い換えることができます.
  このようにすることで,アセンブリ言語を使ってif文と同じ内容の条件分岐が行えます.

ポート 4のbit4にはスイッチSW1(マザーボード上のスイッチ)が付いています.このスイッチは押されるとポート4のbit4をグランドにつなげるように付いています.
プルアップ;入力端子または出力端子を,その論理レベルを確実に「1」または「0」に保持するために抵抗やFETを介して電源+側(プルアップ)またはアース電位(プルダウン)に接続することです.通常は1〜5KΩ程度の抵抗で電源電圧とプルアップしたい端子をつなぐことで行います.しかし,H8/3048などのマイコンではソフト的にプルアップさせることができるようになっています.このプログラムでは,SW1が付いているポート4のbit4を確認してポートがつながっている端子の電位が高いうちはSTART→SW1→SW2→STARTとループして,電位が低くなるとLED1をビットクリアします.同様にポート4の5番目をSW2と名付けて,電位が低くなるとLED1をビットセットします.

BTST #4,R0L
この命令でCPUはP4DRのbit4の状態を確認し,その値をZフラグに反映します.
BNE SW2
これが分岐命令です.分岐命令はコンディションコードレジスタ(CCR)の特定のフラグの値を読み,分岐するような状態になっていれば分岐し,そうでなければ,次の命令を実行します.
BNEという分岐命令は,コンディションコードレジスタのZフラグの値が0である場合に分岐する命令です.

・ 分岐命令

JMP

指定されたアドレスへ無条件に分岐します.

Ex) JMP @PWM  ;PWMにジャンプします.

BSR

指定されたアドレスへサブルーチン分岐します.

Ex) BNE TIME01  ;サブルーチンTIME01へジャンプします.

JSR

指定されたアドレスへサブルーチン分岐します.

Ex) JSR @SW1ON  ;サブルーチンTIME01へジャンプします.

RTS

サブルーチンから復帰します.

Ex) JSR    ;サブルーチンから元の場所に復帰します.

・ 条件分岐( Bcc)

BRA

無条件に指定したところにジャンプします.

Ex) BRA PWM ;PWMにジャンプします

BNE

Zフラグ=0なら指定されたところにジャンプ,そうでなければ次の命令に進みます.

Ex) BNE TIME01   ; Zフラグ=0ならTIME01へ,そうでなければ次の命令に進む

BEQ

Zフラグ=1なら指定されたところにジャンプ.そうでなければ次の命令に進みます.

Ex) BEQ SW1ON    ; Zフラグ=1ならSW1ONへ,そうでなければ次の命令に進む

BPL

Nフラグ=0なら指定されたところにジャンプ,そうでなければ次の命令に進みます.

Ex) BPL BINH ;Nフラグ=0ならBINHへ,そうでなければ次の命令に進む

BMI

Nフラグ=1なら指定されたところにジャンプ,そうでなければ次の命令に進みます.

Ex) BPL BINH ;Nフラグ=1ならBINHへ,そうでなければ次の命令に進む

・ プログラムを書き込む流れのおさらい

プログラムを書き込むごとに以下の工程をすべて行います.

1.プログラム作成(***.mar形式のファイル作成)

2.コマンドプロンプトの立ち上げ

3.アセンブル(***.obj,***.lis形式のファイル生成)

4.リンク(***.abs形式のファイル生成)

5.コンバージョン(***.mot形式のファイル生成)

6.ROMライタでH8に書き込み

マザーボードのスイッチの機能をまとめると次のようになります.

 

電源用スイッチ  SW6

ROM書き込み用スイッチ SW7

OFF

OFF

ON/OFF

プログラム実行状態

ON

OFF

書き込み状態

ON

ON

 


[山口研究室] <back | index | next >