RL78 TRJ パルス幅計測が不安定です。

こんにちは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))

    十分に弟子ですよ。