例題5.1 ADLED


課題 5.1ではアナログ入力AN0に電圧をかけ,入力される電圧をA/D変換します.
A/D変換された値の上位8bitをポートBデータレジスタ(H'FFFFD6)に書き込み,マザーボード上のLEDに出力します.
;ADLED.SRC      (c)yas@E-SYS Lab.
;************************************************
;*      AD変換値をLEDに表示するプログラム       *
;************************************************

;------CPUの指定---------
        .CPU        300HA       ;CPUの指定

;---------シンボルの定義----------
;A/D変換値を行います.
;H8ではA/D変換値は10bitで出てきますが,
;今回はその上位8bitをLEDに表示します.
;表示用にはプログラミング1回目に使った8連LEDを使用します.
;それに伴ってポートBを使用します.
;また,A/D変換値を一時的に記憶しておくRAM領域を設けて名前をつけています.
;下の方の4行はA/D変換に必要な部分です.

PBDR    .EQU    H'FFFFD6        ;ポートBデータレジスタ

AD_BIN  .EQU    H'FFEF10        ;A/D変換した2進数値結果を格納するRAM領域

ADCSR   .EQU    H'FFFFE8        ;A/Dコントロール/ステータスレジスタの番地
ADST    .BEQU   5,ADCSR         ;ADCSRのbit5,変換開始/停止を選択
ADF     .BEQU   7,ADCSR         ;ADCSRのbit7,変換終了を示すフラグ
ADDRAH  .EQU    H'FFFFE0        ;A/D変換結果を入れる上位8bitレジスタの番地
ADDRAL  .EQU    H'FFFFE1        ;A/D変換結果を入れる下位8bitレジスタの番地

        .SECTION    ROM,CODE,LOCATE=H'000100    ;コードセクション宣言

;---------初期設定------------
;ポートBを出力に設定しています.
;A/D変換については今回はここでは特に設定していません.

INIT:   MOV.L   #H'FFF10,ER7    ;スタックポインタの設定
        MOV.B   #H'FF,R0L       ;ポートBを出力に設定するため
        MOV.B   R0L,@H'FFFFD4   ;ポートBデータディレクションレジスタにH'FFを書き込む

;-----MAINルーチン--------
;メイン部分の流れを説明します.
; 1:A/D変換を行う.
; 2:AD_BINに格納されたA/D変換値上位8bitをLEDに出力する.
; 3:1へ飛ぶ.(繰り返す)
;

START:  JSR     @AD             ;AD(サブルーチン)にジャンプします
        MOV.W   @AD_BIN,R0      ;R0にAD_BINをいれます
        MOV.B   R0H,@PBDR       ;PBDRにR0Hをいれます
        BRA     START           ;STARTにジャンプします

;------サブルーチン------------
;A/D変換を行い結果をAD_BINへと入れるサブルーチンです.
;分解能は10bitですが,結果は16bit左詰めで出てくるので注意が必要です.
;通常は6bit分右にずらして右詰めにします.
;今回は値の大きい側8bitを使用するのでこのまま進めます.
;
;では,具体的な説明.
;ADST(A/Dスタート)をON(1を書き込む)にすると設定したとおりにA/D変換を開始します.
;今回は特に設定していないのでデフォルトの単一モードCH0のみのA/D変換を開始します.
;A/D変換が終了したらADF(A/Dフラグ)が1となり終了を知らせます.
;これを使って,A/D変換が終了するまで待ちます.
;今回はCH0でのA/Dなので変換値は上位8bitがADDRAHに,下位8bitがADDRAL入っています.
;これをRAM領域へとコピーしています.
;A/Dチャンネルとレジスタ(ADDR*)の関係は別表を参照してください.
;これらの操作が終わったらADFをクリアして割り込み動作等の禁止を解除します.
;

AD:     JSR     @TIME00         ;WAIT
        BSET    ADST            ;ADSTに「1」をビットセット,A/D変換を開始
ADEND:  BTST    ADF             ;ADFの状態をチェック,A/D変換が終了したか?
        BEQ     ADEND           ;ADFが「1」なら変換終了,「0」ならADENDにジャンプ
        MOV.L   #0,ER1          ;変換結果を入れるレジスタER1をクリア
        MOV.B   @ADDRAH,R1H     ;変換後のデータ上位8bitをR1の上位へ
        MOV.B   @ADDRAL,R1L     ;変換後のデータ下位2bitをR1の下位へ
        BCLR    ADF             ;ADFを「0」にビットクリア,変換終了フラグをクリア
        MOV.W   R1,@AD_BIN      ;AD_BINにA/D変換値を入れる
        RTS                     ;元のルーチンに戻る

;-----タイマ(WAIT)サブルーチン--------

TIME00: MOV.W   #H'FFFF,R0
TIME01: SUB.W   #1,R0           ;R0にH' FFFFを書き込みH'1ずつ減算
        BNE     TIME01          ;ゼロになるまでTIME01を繰り返す
        RTS                     ;元のルーチンに戻る

        .END

課題 5.1の説明

  • 7行目:CPUの指定をしています.
  • 10〜26行目:シンボルの定義をしています.ポートBデータレジスタをPBDRで表します.AD_BINにRAM領域,A/D変換値の格納場所を設定します.A/Dコントロール/ステータスレジスタをADCSR,ADCSRのbit5,変換開始/停止を選択するA/DスタートをADST,ADCSRのbit7,変換終了を示すA/DフラグをADF,A/D変換結果を入れる上位8bitレジスタの番地をADDRAH,A/D変換結果を入れる下位8bitレジスタの番地をADDRAL,D/A(CH-0)に比変換データを入力する番地をDADR0,D/A(CH-0,1共通)コントロールレジスタの番地をDACRで表します.
  • 28行目:コードセクション宣言です.H'000100番地を先頭にしなさいという指示をしています.
  • 30〜36行目:初期設定です.スタックポインタにH'FFF10を書き込んでいます.LEDにA/D変換した値を表示するためにポートBを出力に設定します.
  • 38〜48行目:67行のADにジャンプします.RTSで戻ってきたらPBDRにR0を介してAD_BINをいれます.その後,STARTにジャンプ(繰り返す)します.
  • 67,68行目:WAITします.A/DスタートADSTに「1」をビットセットし,A/D変換を開始します.
  • 69〜76行目:BTST(ビットテスト)でADF(A/Dフラグ)の状態をチェックします.このときADFが0ならZ(ゼロ)フラグを「1」にセットし,ADFが「1」ならZフラグを「0」にクリアします.A/D変換が終了すると,ADFには「1」が入ります.BEQでZフラグの状態を調べます.Zフラグが「0」ならば次の命令に進み,「1」ならばADENDにジャンプします.A/D変換が終了したら,変換結果を入れるレジスタER1を「0」にクリアします.そして,変換後のデータ上位8bitをレジスタR1の上位(R1H)へいれ,変換後のデータ下位2bitをレジスタR1の下位(R1L)へいれます.A/DフラグADFを「0」にビットクリアします.R1に入っているA/D変換値をAD_BINに入れます.元のルーチンに戻ります.
  • 78〜83行目:WAITのサブルーチンです



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