かふぇるね“ はルネサス製品に対して自由に会話をするツールとなります。(回答者はルネサス社内外の方たちとなります) その為ルネサス製品やソリューションに対して正式な回答をご希望の場合はMyRenesasのTicketシステムを使用するようにお願いいたします。
こんにちはNAKAといいます。
RL78/F15のタイマーRJ(TRJ)でパルス幅計測をしています。
計測はラジコンのPWM信号で周期が15msくらいで1ms~2msのパルス幅が変化する信号です。
★初期設定を
/*************************************************************************// 関数名 : fn_Init_TRJ0(void)// 動作 : タイマーRJ0の初期化 // ***********************************************************************/void fn_Init_TRJ0(void){ TRJ0EN = 1; //TRJにクロック供給 TRJCR0 &= ~0x01; //TSTART=0 :カウント停止! TRJMK0 = 1; //割込み禁止 TRJIF0 = 0; //割込みフラグクリア TRJPR10 = 0; //割込みプライオリティ TRJPR00 = 0; TRJMR0 = 0x13; //パルス幅計測モード & カウントソース設定;① TRJIOC0 = 0x21; //フィルタ| & "H"の幅を測定;② TRJ0 = 0xFFFF; //必要? PM4 |= 0x02; //TRJ入力ピン設定}
★★行い、割込みの中ではTRJを読み込んで(c_TRJに)、④TRJを強制STOPしTRJを0xFFFFにリセットしてます。
/************************************************************************//* タイマーRJ0割り込み関数 *//************************************************************************/void __near TRJ0_INT(void){ TRJMK0 = 1; //割込み禁止③ c_TRJ0 = TRJ0; //TRJ(パルス幅)の値を読み込み④ TRJCR0 |= 0x04; //TSTOP:強制停止}
★★★PWMが来る15ms毎での頻度でモニタの必要がないため、MAINの中の1秒毎くらいのタイミングでシリアル通信して
(③⑤c_TRJを)パルス幅をモニタしました。
TRJIOC0 = 0x21; //強制STOPしたので再設定(保険)
TRJMR0 = 0x13; //強制STOPしたので再設定(保険)
⑤ SCI_TX(c_TRJ0); //TRJの値を送信 TRJCR0 |= 0x01; //カウント開始 while((TRJCR0 & 0x02) == 0){__nop();} //TCSTFが1:カウント中になるまで待つ TRJIF0 = 0; //割込みフラグクリア TRJMK0 = 0; //割込み許可
TRJが0xFFFFがらダウンカウントして、だいたいは希望の値(0xED00程度)が取れるのですが、
PWMを変化させていないのに、時々(不定期)に0xF6**とか0xF9**とか変な短めの値になることがあります。
もしお気づきの点がございましたら、ご指摘いただけるとありがたいです。
①のフィルタの設定を変えてみても変わらず
カウントの開始と停止後はTCSTF(カウント中フラグ)が変化するまでTRJCR関連のレジスタは触らないとかありましたので待ってます。
よろしくお願いいたします。
チョコです。
タイマRJ(TRJ)は使ったことはありませんが、誰からもレスがないようなので、コメントさせていただきます。
RL78/G14のハードウェアマニュアルのTRJのパルス幅測定モードの説明の最初には、以下のように書かれています。
これから判断すると、TRJIO端子がハイの状態でパルス幅測定モードを起動すると、そこからカウント開始するのではないかと考えられます。
つまり、このモードはTRJIO端子がローの状態で起動する必要があるのでは?
NAKAさんが期待されている動作を実現するには、TRJは常に動作させておくべきでは。TRJ0を0xFFFFにしておけば、単純に16ビットで前回の値との差分を計算すればいいのでは。
個人的には、TAUでのパルス幅測定では、開始エッジを待ってからカウント開始するので、TRJではなく、TAUを使うべきだと考えますが。
以上
チョコ先生いつもありがとうございます。
>つまり、このモードはTRJIO端子がローの状態で起動する必要があるのでは?
⇒なるほど!計測開始をさせるタイミングが適当なので、たまたま”H”のタイミングでスタートをかける可能性があるということか!!では毎回計測が終わったタイミング(15ms-(1~2)msの間の”L"区間)でスタートをかければ良さそうですね!でも15ms毎に割込みが入るのももったいない感じなので、TRJIO端子が”L"であるか確認してスタートをかけようかな?ちょっと工夫してみます。
>TRJではなく、TAUを使うべきだと考えますが。
⇒ちょうどTRJIO端子がたまたま空いていて、パルス幅計測機能があったので使っちゃいました。(^_-)-☆
NAKAです。
ポートP41がTRJIO端子の機能の時でも、入力の判断は出来るのでしょうか?
できるのであれば、”L”を確認してタイマースタートするだけのような気がしますが
TRJIOC0 = 0x21; //強制STOPしたので再設定(保険) TRJMR0 = 0x13; //強制STOPしたので再設定(保険) SCI_TX(c_TRJ0); //TRJの値を送信 if(P4_bit.no1 == 0) { TRJCR0 |= 0x01; //カウント開始 while((TRJCR0 & 0x02) == 0){__nop();} //TCSTFが1:カウント中になるまで待つ TRJIF0 = 0; //割込みフラグクリア TRJMK0 = 0; //割込み許可 }
在宅勤務中で会社のボードへラジコン操作できない(PWMを加えてもらえない)ので、来週の出勤時に確認します。
P.S.
オミクロンが広がってきたので、会社になかなか行けない!!!(~_~;)
>ポートP41がTRJIO端子の機能の時でも、入力の判断は出来るのでしょうか?
端子が入力に設定してあれば、読めます。
RL78/G14のP41の端子のブロック図は端子タイプ7-1-3でそのブロックを以下に示します。
ポート入力の2つのセレクタの右側が入力になっていれば、1の側の外部からの信号が読めます。パルス幅測定ではTRJIO端子は入力で、PM41は1になっているので、外部端子の状態を読むことはできます。
ここらは、RL78では共通的なことなので、F15でも同じはずです。
チョコ兄貴!愛弟子のNAKAです。(お前を弟子にした覚えはない?(T_T))
本日出勤して、確認しました!ばっちりでした!
いつもいつも、ありがとうございます。
NAKAさん、無事に解決できたようでよかったです。
>チョコ兄貴!愛弟子のNAKAです。(お前を弟子にした覚えはない?(T_T))
十分に弟子ですよ。