例題5.3 SENSOR


A/D変換値を使った条件分岐です.
;SENSOR.SRC            yas@E-SYS Lab

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

;---------シンボルの定義----------
P1DR    .EQU    H'FFFFC2       ;PORT 1 DATA RESISTER ADDRESS  *

TSTR    .EQU    H'FFFF60       ;TIMER START RESISTER ADDRESS
TSNC    .EQU    H'FFFF61       ;TIMER SYNCHRO RESISTER
TMDR    .EQU    H'FFFF62       ;TIMER MODE RESISTER
TCR0    .EQU    H'FFFF64       ;CH0-TIMER CONTROLRESISTER
GRA0    .EQU    H'FFFF6A       ;CH0-GENERAL RESISTER A
GRB0    .EQU    H'FFFF6C       ;CH0-GENERAL RESITSER B

ADCSR   .EQU    H'FFFFE8
ADST    .BEQU   5,ADCSR
ADF     .BEQU   7,ADCSR
ADDRAH  .EQU    H'FFFFE0
ADDRAL  .EQU    H'FFFFE1

        .SECTION ROM,CODE,LOCATE=H'000100;CODE SECTION 宣言

;------初期化--------
INIT:   MOV.L   #H'FFF10,ER7           ;STUCK POINTER
        MOV.B   (____),R0L             ;PORT1を                      *
        MOV.B   R0L,@H'FFFFC0  ;出力用ポートに設定する               *
        MOV.B   #B'11000011,R0L ;GRB0 COMPARE MATCH φ2MHz
        MOV.B   R0L,@TCR0              ;COUNTER CLEAR 
        MOV.B   #B'00010011,R0L
        MOV.B   R0L,@ADCSR             ;SCAN MODE AN0-3

;-----数値設定-------
        MOV.W   @GRA_UP,R0             ;データ領域のデータを読み込む
        MOV.W   R0,@GRA0               ;GRAの設定
        MOV.W   @GRB_DW,R0
        MOV.W   R0,@GRB0               ;GRBの設定

        MOV.B   #B'10001111,R0L ;TMDR"10001111"
        MOV.B   R0L,@TMDR              ;CH0,1,2,3PWMモードに設定する
        MOV.B   #B'11101111,R0L ;TSTRに書き込み
        MOV.B   R0L,@TSTR              ;CH0,1,2,3のカウントを始める

;----MAIN-------

        MOV.B   #B'11111111,R0L ;全モータをブレーキに設定
        MOV.B   R0L,@P1DR
START:  JSR     @TIME00        ;TIME00にジャンプ
        JSR     (__)                   ;A/D変換を行なう
        BRA     START                  ;ループ 

;-------サブルーチン-------

AD:     BSET    ADST                   ;A/D変換スタート
ADEND:  BTST    ADF            ;ADFをチェック
        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にクリアする 

        SHLR.W  R1             ;R1を右側へ詰めるために右方向へ6bitシフト
        SHLR.W  R1
        SHLR.W  R1
        SHLR.W  R1
        SHLR.W  R1
        SHLR.W  R1

CHK:    MOV.W   #B'0000000011000000,R0
        CMP.W   R0,R1
        BPL     (______)       ;A/D変換値を比較して基準値より大きければNEGAラベルにジャンプ

POSI:   BSET    #0,@P1DR       ;ポート1 bit0を1に
        BCLR    #1,@P1DR       ;ポート1 bit1を0にしてモータを正回転に設定
        RTS

NEGA:   (___)   #0,@P1DR       ;ポート1 bit0を0に
        (___)   #1,@P1DR       ;ポート1 bit1を1にしてモータを逆回転に設定
        RTS

TIME00: MOV.L   #H'10000,ER6
TIME01: SUB.L   #1,ER6
        BNE     TIME01
        RTS
        .SECTION RAM,DATA,LOCATE=H'000B00
GRA_UP: .DATA.W H'1800         ;GRAの設定値
GRB_DW: .DATA.W H'3000         ;GRBの設定値
        .END 

課題 5.3の説明

  • 4行目:CPUの指定をしています.
  • 6〜19行目:シンボルの定義をしています.P1DRはポート1データレジスタで表します.TSTRはタイマスタートレジスタ,TSNCはタイマシンクロレジスタ,TMDRはタイマモードレジスタ,TCR0はタイマコントロールレジスタ,GRA0はジェネラルレジスタA,GRB0はジェネラルレジスタB,ADCSRはA/Dコントロール/ステータスレジスタ,ADSTはADCSRのbit5,変換開始/停止を選択するA/Dスタート,ADFはADCSRのbit7,変換終了を示すA/Dフラグ,ADDRAHはA/D変換結果を入れる上位8bitレジスタの番地を,ADDRALはA/D変換結果を入れる下位8bitレジスタの番地を表します.
  • 21行目:コードセクションの宣言です.
  • 24〜31行目:初期設定です.スタックポインタにH'FFF10を書き込んでいます.ポート1を出力用ポートに設定しています.TCR(タイマコントロールレジスタ)のCCLR1,CCLR0に1,0,CKEG1,CKEG0に0,0,TPSC2〜TPSC0に0,1,1を書き込みGRB0のコンペアマッチ(一致)でTCNT0がクリアされ,クロックの立ち上がりエッジでカウント動作が行われるように設定しています.また,クロックは内部クロックをプリスケーリングあり(2MHz)で使用するように選択されています.
  • 34〜42行目:PWMの立ち上がり,立下りの設定です.CH0からCH3をPWMモードに設定し,カウントをスタートさせる.
  • 45〜49行目:モータをブレーキに設定します.WAITしたあと,ADにジャンプします.RTSで戻ってきたらSTARTにジャンプ(繰り返す)します.
  • 52行目:A/DスタートADSTに「1」をビットセットし,A/D変換を開始します.
  • 53〜65行目:ビットテスト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の上位(R1L)へいれ,変換後のデータ下位2bitをレジスタR1の下位(R1L)へいれます.A/DフラグADFを「0」にビットクリアします.現在,R1に入っているA/D変換値は16bit左詰の状態です.これをSHLRで右にずらし,右詰にします.
  • 67〜69行目:センサからの入力値と設定値による場合分け分岐をします.A/D変換値が設定値より大きければNEGAにジャンプする,そうでなければPOSIに進む.
  • 71〜73行目:POSIモータ制御信号,元のルーチンに戻ります.
  • 75〜77行目:NEGAモータ制御信号,元のルーチンに戻ります.
  • 79〜82行目:WAITのサブルーチンです.
  • 84〜86行目:データセクション.PWMのGRA,GRBの設定.



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