Copyright (C)SUWA TSUSHIN NETWORK.
All Rights Reserved. TOPへ戻る
スポンサードリンク

No.0020 2021.3.17




ルネサス RX621マイコン 初心者(10) タイマー機能を使ってみる





今回のソースファイル: rx62_test4.zip (432 KB)


□ 1.RX621のタイマー機能

タイマーとは、設定した時間が経過したとき、割り込み処理ができる機能です。
マイコンと呼ばれるものには必ず搭載されている、基本的な機能です。
RX621には、以下の3種類のタイマー機能があります。

@ マルチファンクションタイマパルスユニット2(MTU2)
A 8 ビットタイマ(TMR)
B コンペアマッチタイマ(CMT)

「マルチファンクションタイマパルスユニット2(MTU2)」は、16bit(〜65535カウント)のカウンタを持ち、デジタル入出力に特化した機能を持っています。AKI-RX621では、他の機能との兼ね合いですが最大10chまでの入出力に対応しています。各chごとにモーター制御用の3相出力ができたり、信号のON時間を測定できりと機能が異なるため、どのchを使うのか予め決めておく必要があります。タイマーの1カウントを何秒にするのかといった設定範囲もchごとに異なります。入出力端子を使用せず、内部処理用としてタイマーを使うこともできます。1ch分は、2つのタイマを合体させて32bitカウンタとして使用することもできます。

「 8 ビットタイマ(TMR)」は、8bitのカウンタ(〜255カウント)を持っています。 AKI-RX621では、他の機能との兼ね合いですが1chの入出力に対応しています。

「コンペアマッチタイマ(CMT)」は、入出力端子を持たない内部処理専用のタイマーです。カウンタは16bit(〜65535カウント)です。



□ 2.タイマーを使ってみる

AKI-RX621 ビンアサイン デジタル IO反映 .xlsx

今回は、MTUとCMTを使用したテストプログラムを作成してみます。

・ボタン1(PD2)が押されている時間を測定し、ボタンが離されたときLED1(PA0)が押されていた間と時間で点灯
・ボタン2(P46)が押されたとき、LED2(PA2)が点灯→消灯、もしくは消灯→点灯


という処理にします。

PD2は、MTUのMTU11、MTIC11W-B端子をタイマ機能の入力端子として使用します。
MTU6、CMT0を内部処理用として使用します。

これらのタイマの端子機能を使用して、以下のように処理させます。


 @ MTU11で、ボタンの押された瞬間、離された瞬間を検出
     ↓
 A ボタンが押されたとき、CMTのCMT0で時間を計測
     ↓
 B ボタンが離されたとき、CMTのCMT0を停止
     ↓
 C 測定時間をMTU6にセットして動作させ、LED1(PA0)を点灯
     ↓
 D 測定時間経過後、MTU6を停止して、LED1(PA0)を消灯



ソースコードは以下のようになります。




vect.h の 以下の個所をコメントアウトしておきます。

//#pragma interrupt (Excep_CMT0_CMI0(vect=28))
//void Excep_CMT0_CMI0(void);




//#pragma interrupt (Excep_ICU_IRQ14(vect=78))
//void Excep_ICU_IRQ14(void);




//#pragma interrupt (Excep_MTU6_TGIA6(vect=142))
//void Excep_MTU6_TGIA6(void);




//#pragma interrupt (Excep_MTU11_TGIW11(vect=169))
//void Excep_MTU11_TGIW11(void);






intprg.c の以下の個所もコメントアウトしておきます。

//void Excep_CMT0_CMI0(void){ }




// void Excep_ICU_IRQ14(void){ }




//void Excep_MTU6_TGIA6(void){ }




//void Excep_MTU11_TGIW11(void){ }







□ 3.デジタル入出力、IRQ14の設定

前回までのレポートを参照してください。

No.0017 ルネサス RX621マイコン 初心者(7) デジタル入力、出力をしてみる
 
No.0018 ルネサス RX621マイコン 初心者(8) 割り込み入力を使ってみる



□ 4.CMTの設定

最初に、このCMTの機能は無効になっていますので、有効にします。 この機能に限らず、ほぼすべての機能は初期状態で無効になっています。意味が分かりませんが、ルネサス曰く消費電力低減のためだそうです。

ハードウェアマニュアル(R01UH0033JJ0140)の「9.2.2 モジュールストップコントロールレジスタA(MSTPCRA)」の一覧にあるレジスタのうち、MSTPA15を0に設定します。




ソースコードでは以下のように記述します。


  SYSTEM.MSTPCRA.BIT.MSTPA15 = 0;     //CMT0、CMT1 有効化


次にCMT0で使用するカウンタの1クロック分の周波数を設定します。1: PCLK/32 のクロックを選択します。PCLKは、外部クロック12MHzの2倍で、24MHzです。24MHz÷32=750kHz=1.3μs が1カウント分の時間になります。ハードウェアマニュアル「22.2.3 コンペアマッチタイマコントロールレジスタ(CMCR)」 のCKSレジスタを使用します。




ソースコードでは以下のように記述します。


  CMT0.CMCR.BIT.CKS = 1;   // クロック選択 1:PCLK/32

次にCMT0での割り込み処理を有効にします。カウンタが設定したカウント値に達したとき、割り込みが発生します。クロック設定と同じ、CMCRレジスタにあるCMEレジスタを使用します。
ソースコードでは以下のように記述します。


  CMT0.CMCR.BIT.CMIE = 1;   // 1:コンペアマッチ割り込み(CMIn)を許可

次にCMT0で使用する割り込みの機能設定を行います。前回行ったIRQ14に対する設定と考え方は同じです。
ベクタテーブル一覧表から、ベクタ番号:28、IER:IER03.IEN4、IPR:IPR04 の値が重要になります。
ソースコードでは以下のように記述します。


  ICU.IR[28].BIT.IR = 0;    // 割り込みステータスレジスタリセット
  ICU.IPR[0x04].BIT.IPR = 0xE;  // 割込みレベル 14(高)
  ICU.IER[0x03].BIT.IEN4 = 1;  // CMT0(vect=28) 割込み許可



次にCMT0のタイマー時間を設定します。16bitカウンタを最大(65535、0xFFFF)まで使うように設定します。
ハードウェアマニュアル「22.2.5 コンペアマッチタイマコンスタントレジスタ(CMCOR)」 を使用します。




ソースコードでは以下のように記述します。


  CMT0.CMCOR= 0xFFFF;    // コンペアマッチ周期 セット

次にCMT0のタイマーカウンタを設定します。初期値はゼロのため、この設定は省略してかまいません。
ハードウェアマニュアル「22.2.4 コンペアマッチタイマカウンタ(CMCNT)」 を使用します。




ソースコードでは以下のように記述します。


  CMT0.CMCNT= 0xFFFF;    // コンペアマッチカウンタ リセット

最後にCMT0のタイマーカウンタの動作を停止します。初期値は停止のため、この設定は省略してかまいません。
ハードウェアマニュアル「22.2.1 コンペアマッチタイマスタートレジスタ0(CMSTR0)」 を使用します。




ソースコードでは以下のように記述します。


  CMT.CMSTR0.BIT.STR0 = 0;     // 0:CMT0.CMCNTカウンタのカウント動作停止



□ 5.MTU11の設定

最初に、このMTUの機能は無効になっていますので、有効にします。

ハードウェアマニュアル(R01UH0033JJ0140)の「9.2.2 モジュールストップコントロールレジスタA(MSTPCRA)」の一覧にあるレジスタのうち、MSTPA8を0に設定します。




ソースコードでは以下のように記述します。


  SYSTEM.MSTPCRA.BIT.MSTPA8 = 0;  // MTUユニット1 有効化



MTU11の設定から始めます。MTU11は、外部入力(ボタン押し離し)のタイミングで割り込みを発生させるために使います。タイマー本来の使い方ではありませんが、MTU11だけは割り込み入力IRQのように使うこともできます。また、MTU11は「18.3.10 外部パルス幅測定機能」という便利そうな機能がありますが、この機能を有効にしてもカウンタがオーバーフローしたときに割り込みが発生しないようですので使い道が限られます。

最初に外部入力端子の設定をします。デジタル入出力端子PD2をMTU11用のMTIC11W-B端子として使用するようにします。ハードウェアマニュアル「17.1.2.20 ポートファンクションレジスタD(PFDMTU)」 のMTUS6レジスタを使用します。




ソースコードでは以下のように記述します。


  IOPORT.PFDMTU.BIT.MTUS6 = 1;    // PD2をMTIC11W-B端子として選択



次にMTU11で使用するカウンタの1クロック分の周波数を設定します。3: PCLK/64 のクロックを選択します。MTU11は通常のタイマー機能を使用しないため、クロックは何でも良いでしょう。ハードウェアマニュアル「18.2.1 タイマコントロールレジスタ(TCR)」 のTPSCレジスタを使用します。





ソースコードでは以下のように記述します。


  MTU11.TCRW.BIT.TPSC = 0x3;   // クロック選択 1:PCLK/64



次にMTU11の端子入力について、立ち上がり、立ち下がりで割り込みが発生するように設定します。ハードウェアマニュアル「18.2.3 タイマI/O コントロールレジスタ(TIOR)」 のIOCレジスタを使用します。





ソースコードでは以下のように記述します。


  MTU11.TIORW.BYTE = 0x13;   // 両エッジでインプットキャプチャ



次にMTU11の端子入力について、割り込みを有効にします。ハードウェアマニュアル「18.2.5 タイマインタラプトイネーブルレジスタ(TIER)」 のTGIE5Wレジスタを使用します。MTU11は、U,V,Wと機能が分かれており、PD2入力はWの機能に属しています。




ソースコードでは以下のように記述します。


  MTU11.TIER.BIT.TGIE5W = 1;   // 1:TGI11W割り込み要求を許可


次にMTU11で使用する割り込みの機能設定を行います。IRQ14やCMT0の設定と考え方は同じです。
ベクタテーブル一覧表から、ベクタ番号:169、IER:IER15.IEN1、IPR:IPR66 の値が重要になります。
ソースコードでは以下のように記述します。


  ICU.IR[169].BIT.IR = 0;    // 割り込みステータスレジスタリセット
  ICU.IPR[0x66].BIT.IPR = 0xF; // 割込みレベル 15(高)
  ICU.IER[0x15].BIT.IEN4 = 1;  // TGIW11(vect=169) 割込み許可



最後にMTU11のタイマーカウンタの動作を開始します。
ハードウェアマニュアル「18.2.14 タイマスタートレジスタ(TSTR)」 のCSTW5レジスタを使用します。




ソースコードでは以下のように記述します。


  MTU11.TSTR..BYTE = 1;     // カウンタスタートWビット カウント動作





□ 6.MTU6の設定

次にMTU6の設定を始めます。MTU6は、LEDの点灯時間の制御に使います。タイマー本来の使い方です。

最初にMTU6のタイマーカウンタの動作を停止します。初期状態は停止のため、この設定は省略可能です。
ハードウェアマニュアル「18.2.14 タイマスタートレジスタ(TSTR)」 のCST0レジスタを使用します。




ソースコードでは以下のように記述します。最初のレジスタ名は、「MTUB」です。MTU6ではないので注意してください。


  MTUB.TSTR..CST0 = 0;     // MTU6カウンタ停止 カウント動作


次ににMTU6のタイマーの機能を選択します。通常のタイマーとして使用する設定にします。初期状態はノーマルモードのため、この設定は省略可能です。
ハードウェアマニュアル「18.2.2 タイマモードレジスタ(TMDR)」 のMDレジスタを使用します。





ソースコードでは以下のように記述します。最初のレジスタ名は、「MTU6」です。以後すべてMTU6です。MTUBではないので注意してください。ホントにややこしいマイコンです。


  MTU6.TMDR.BIT.MD = 0;     // MTU6カウンタ停止 カウント動作


次ににMTU6のタイマーのカウンタ機能を選択します。今回はTGRAカウンタを使用し、通常のタイマーとして使用する設定にします。初期状態が通常動作になっているため、この設定は省略可能です。
ハードウェアマニュアル「18.2.2 タイマモードレジスタ(TMDR)」 のBFAレジスタを使用します。
ソースコードでは以下のように記述します。


  MTU6.TMDR.BIT.BFA = 0;     // モード選択 ノーマルモード


次にMTU6で使用するカウンタの1クロック分の周波数を設定します。3: PCLK/64 のクロックを選択します。PCLKは、外部クロック12MHzの2倍で、24MHzです。24MHz÷64=375kHz=2.6μs が1カウント分の時間になります。 CMT0では PCLK/32 を選択したため同じ分周比を使いたいところですが、設定不可です。CMT0が2クロックでMTU6の1クロックとして処理するようにアルゴリズムを作成する必要があります。 ハードウェアマニュアル「18.2.1 タイマコントロールレジスタ(TCR)」 のTPSCレジスタを使用します。





ソースコードでは以下のように記述します。


  MTU6.TCR.BIT.TPSC = 0x3;   // クロック選択 1:PCLK/64


次にMTU6のカウンタがリセットされる条件を設定します。TGRAのコンペアマッチ/インプットキャプチャが条件となるようにします。ハードウェアマニュアル「18.2.1 タイマコントロールレジスタ(TCR)」 のCCLRレジスタを使用します。




ソースコードでは以下のように記述します。


  MTU6.TCR.BIT.CCLR = 0x1;   // TGRAのコンペアマッチでTCNTクリア


次にMTU6のカウントについてクロックの立ち上がり、立ち下がりのどちらで判定するかの設定をします。どちらでもかまりませんが、今回は立ち上がりエッジでカウントします。初期状態が立ち上がりエッジになっているため、この設定は省略可能です。実は「両エッジでカウント」を選択すると分周比が半分になります。PCLK/64を選択した場合は、PCLK/32になります。 ハードウェアマニュアル「18.2.1 タイマコントロールレジスタ(TCR)」 のCKEG レジスタを使用します。


ソースコードでは以下のように記述します。


  MTU6.TCR.BIT.CKEG = 0x0;   // 立ち上がりエッジでカウント


次にMTU6の端子機能を設定をします。タイマー機能端子として使用しないため、出力禁止に設定します。初期設定で出力禁止になっているため、この設定は省略可能です。 ハードウェアマニュアル「18.2.3 タイマI/O コントロールレジスタ(TIOR)」 のTIORH レジスタ と TIORL レジスタを使用します。





ソースコードでは以下のように記述します。


  MTU6.TIORH.BYTE = 0x00;   // MTIOC6Aの機能 出力禁止
  MTU6.TIORL.BYTE = 0x00;   // MTIOC6Cの機能 出力禁止


次にMTU6の端子入力について、割り込みを有効にします。ハードウェアマニュアル「18.2.5 タイマインタラプトイネーブルレジスタ(TIER)」 のTGIEAレジスタを使用します。




ソースコードでは以下のように記述します。


  MTU6.TIER.BIT.TGIEA = 1;   // 1:割り込み要求(TGIA)を許可


最後にMTU6で使用する割り込みの機能設定を行います。
ベクタテーブル一覧表から、ベクタ番号:142、IER:IER11.IEN6、IPR:IPR5C の値が重要になります。
ソースコードでは以下のように記述します。


  ICU.IR[142].BIT.IR = 0;    // 割り込みステータスレジスタリセット
  ICU.IPR[0x5C].BIT.IPR = 0xF; // 割込みレベル 15(高)
  ICU.IER[0x11].BIT.IEN6 = 1;  // TGIA6(vect=142) 割込み許可


□ 7.動作確認
ボタンが離されていてカウンタ値が1以上のときの処理(109〜133行目)、 タイマーの処理(10〜18行目、148〜194行目)を追加し、ビルド&ダウンロードして実行します。 ボタンを離した瞬間、ボタンが押されていた時間でLEDが点灯するようになります。

オシロスコープの画像は、Ch1がボタンの入力端、Ch2がLEDの出力端です。 押された時間で、きちんとLEDが点灯していることがわかります。














スポンサードリンク

TOPへ戻る


ご利用条件
 Copyright (C)SUWA TSUSHIN NETWORK. All Rights Reserved.