例題4.2 PWM2


PWM2課題4.2の書き込みを行い,2本のPWM信号の出力をオシロスコープで確認します.PWM信号を2本出力します.
;PWM2.SRC              (c)yas@E-SYS Lab.

;*******************************************
;*      2本のPWMを生成するプログラム   *
;*******************************************

;行の末尾にアクタリスク(*)があるところが前回から
;追加,変更された行です.

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

;---------シンボルの定義----------
;CH1用のTCR,GRA,GRB追加されています.

TSTR    .EQU    H'FFFF60               ;タイマスタートレジスタ
TSNC    .EQU    H'FFFF61               ;タイマシンクロレジスタ
TMDR    .EQU    H'FFFF62               ;タイマモードレジスタ
TCR0    .EQU    H'FFFF64               ;CH0タイマコントロールレジスタ
GRA0    .EQU    H'FFFF6A               ;CH0ジェネラルレジスタA
GRB0    .EQU    H'FFFF6C               ;CH0ジェネラルレジスタB
TCR1    .EQU    H'FFFF6E               ;CH1タイマコントロールレジスタ               *
GRA1    .EQU    H'FFFF74               ;CH1ジェネラルレジスタA              *
GRB1    .EQU    H'FFFF76               ;CH1ジェネラルレジスタB              *
        .SECTION ROM,CODE,LOCATE=H'000100     ;コードセクションの宣言

;------初期化--------
;PWMのCH0,CH1をクリアするタイミングを設定しています.
;両方ともカウンタがGRBになったときにクリアされます.

INIT:   MOV.L   #H'FFF10,ER7           ;スタックポインタの設定
        MOV.B   #B'11000011,R0L ;GRB0コンペアマッチ
        MOV.B   R0L,@TCR0              ;カウンタをクリア
        MOV.B   #B'11000011,R0L ;CH0に同期してCH1も同様に            *
        MOV.B   R0L,@(___)             ;カウンタをクリア                     *

;-----初期設定-------
;前回も使用したCH0に加えてCH1の立ち上げ,立ち下げタイミングを
;設定してます.
;また,下4行ではPWM端子0番と1番をPWMモードに設定し,
;CH0とCH1のタイマカウントを開始しています

        MOV.W   @GRA0_UP,R0            ;立ち上げデータ領域のデータを読み込む
        MOV.W   R0,@GRA0               ;読み込んだデータをGRA0に書き込む
        MOV.W   @GRB0_DW,R0            ;立下げデータ領域のデータを読み込む
        MOV.W   R0,@GRB0               ;読み込んだデータをGRB0に書き込む
        MOV.W   @GRA1_UP,R0            ;立ち上げデータ領域のデータを読み込む         *
        MOV.W   R0,@GRA1               ;読み込んだデータをGRA1に書き込む            *
        MOV.W   @GRB1_DW,R0            ;立下げデータ領域のデータを読み込む           *
        MOV.W   (__),@(____)           ;読み込んだデータをGRB1に書き込む            *
        MOV.B   #B'10000011,R0L ;TMDRに10000011を書き込む            *
        MOV.B   R0L,@TMDR              ;CH0とCH1をPWMモードに設定する      *
        MOV.B   #B'(8bit),R0L          ;TSTRに(______)を書き込む             *
        MOV.B   R0L,@TSTR              ;CH0とCH1のカウントを始める  *

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

PWM:    BRA     PWM                    ;PWMにジャンプする

;------DATA SECTION-------------
;PWMのCH0,CH1用データの数値設定をしています.

        .SECTION RAM,DATA,LOCATE=H'000B00     ;データセクションの宣言
GRA0_UP:       .DATA.W H'1800         ;GRA0,CH0波形立ち上げタイミングデータ
GRB0_DW:       .DATA.W H'3000         ;GRB0,CH0波形立ち下げタイミングデータ
GRA1_UP:       .DATA.W H'2300         ;GRA1,CH1波形立ち上げタイミングデータ *
GRB1_DW:       .DATA.W H'3000         ;GRB1,CH1波形立ち下げタイミングデータ *

                  .END 

課題 4.2の説明

  • 8行目 CPUの指定をしています.
  • 10〜18行目 シンボルの定義をしています.ほとんどがコントロールレジスタの番地です.
  • 20行目 CODEセクションの宣言をしています.
  • 23〜29行目 初期化.スタックポインタにH'FFF10を書き込んでいます.TCR0,1(タイマコントロールレジスタ)のCCLR1,CCLR0に1,0,CKEG1,CKEG0に0,0,TPSC2〜TPSC0に0,1,1を書き込みGRB0のコンペアマッチ(一致)でTCNT0がクリアされ,クロックの立ち上がりエッジでカウント動作が行われるように設定しています.また,クロックは内部クロックをプリスケーリングあり(2MHz)で使用するように選択されています.
  • 32〜39行目 データセクションの数値をGRA0,GRB0,GRA1,GRB1に書き込んでいきます.TMDRのPWM0,1に1,1を書き込み,CH0,CH1をPWMモードに設定し,TSTRのSTR0,1に1,1を書き込みカウンタをスタートさせます.
  • 49〜53行目 49行目ではデータセクションを宣言し,データ領域を確保します.そして,ここにはGRA0,GRB0,GRA1,GRB1に書き込むタイミング数値をデータとして書き込んでおきます.

課題:今のプログラムを 3本のPWMパルスの生成をするプログラムになおして下さい.
また,デューティー比を変えてみましょう.



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