ELCを利用してTAU0のインプットキャプチャを行いたい

お世話になります。

RL78/G14を使用しています。

外部割込みINTP0の立下りエッジでタイマアレイユニットTAU0 チャンネル0の入力間隔測定を行いたいと思っています。

しかし、TAU0のインプットキャプチャ割込みが発生しません。

アプリケーションノートに似たようなことをしている例があったのですが、

(1) アプリケーションノート、サンプルコードでは "PM0 |= 0x01"と記述があります。

    TI00を使用しないにもかかわらずTI00を入力として設定しなければならないのでしょうか。

(2) サンプルコードではINTP0の割込みが記述されています。(優先順位の設定や実際の割込み関数)

    INTP0の割込みは必要ないのですが、記述しなければならないのでしょうか。

ご教授をお願いいたします。

  • チョコです。
    >TAU0 チャンネル0の入力間隔測定を行いたい...TI00を使用しないにもかかわらず
    タイマの機能を誤解されているようです。TAUの入力間隔測定には,入力信号の立ち上がりエッジ又は立下りエッジの間隔を測定する機能(入力パルス間隔測定機能)と入力信号のハイ/ロウ・レベル幅測定があります。これらは,どちらも,TImn入力を対象とした機能です。したがって,TImnを入力に設定するのは必須です。

    >しかし、TAU0のインプットキャプチャ割込みが発生しません。
    TAU0 チャンネル0の入力間隔測定では,TI00に入力する信号を測定するので,その入力がなければ割り込みは発生しません。

    >アプリケーションノートに似たようなことをしている例
    具体的なアプリケーションノートのタイトルが分からないとコメントできません。

    >INTP0の割込みは必要ないのですが、記述しなければならないのでしょうか
    INTP0割り込みを使うのか使わないのかで変わります。「外部割込みINTP0の立下りエッジでタイマアレイユニットTAU0 チャンネル0の入力間隔測定を行いたい」であれば,INTP0の設定は必要で,INTP0割り込みが受け付けられたら,そこで,TAU0 チャンネル0(入力間隔測定)を起動するのではないですか。
  • チョコさん
    ご教授ありがとうございます。
    >具体的なアプリケーションノートのタイトルが分からないとコメントできません。
    R01AN2860JJ0100 ELCを使用した 3イベント組み合わせ動作 CC-RL
    INTP0のエッジでTAUのディレイカウンタを作動させ、カウンタ完了をトリガにA/D変換を行っています。

    >これらは,どちらも,TImn入力を対象とした機能です。したがって,TImnを入力に設定するのは必須です。
    コード生成ダイアログで入力間隔測定機能を選択した場合、入力ソースとしてTI00かELCを選択するようになっています。TI00を使用せずにINTP0で代用できると解釈したのですが違うのでしょうか。

    お手数をお掛けしますがよろしくお願いいたします。
  • チョコです。

    >入力ソースとしてTI00かELCを選択するようになっています。TI00を使用せずにINTP0で代用できると解釈したのですが違うのでしょうか。

    それは,問題ありません。

    「外部割込みINTP0の立下りエッジ」とあったので,これをトリガとしてTI00のエッジ間隔を計測すると勘違いしていました。「外部割込みINTP0の立下りエッジ」だったんですね。

    この場合にはTI00のポートの設定は不要です。

  • チョコさん。
    qazです。
    >…「外部割込みINTP0の立下りエッジの」だったんですね。
    そうです。周期測定を行いたいのはINTP0の立下りエッジ間です。
    わかりにくい文章で申し訳ありませんでした。

    で、割込み、TAU、ELCのみのプラグラムを組んでみました。
    INTP0は割込みの初期化(優先順位設定やフラグクリア)だけ行って、割込み禁止状態。
    TAU0はチャンネル0を入力間隔測定に設定。(もちろん入力ソースはELC)
    ELCは画像のように出力をTAU0、イベント発生元をINTP0としました。
    main()でTAU0チャンネル0のカウント開始を呼び、TAU0チャンネル0の割込み内でLEDを点灯させるようにしました。(割込みが入るたびにLED ON/OFF反転)

    INTP0に80msec周期のパルスを入力すると、不定期でLEDが点滅します。
    数秒おきに点灯/消灯しますがその間隔はランダムなようです。
    割込みの発生が邪魔されるような要因があるのでしょうか。
  • チョコです。
    >数秒おきに点灯/消灯しますがその間隔はランダムなようです。
    そのような長い周期の場合によくあるのが,WDT(ウォッチドッグ・タイマ)が悪さをしているケースです。
    新たにプロジェクトを作成して,コードを使った場合に,WDTがディフォルトでONになっているので,意識的にWDTを使わないと設定しないとWDTが動作して,WDTによるリセットがかかります。
    まずは,WDTをご確認ください。
  • チョコさん。
    qazです。
    WDTは使用していません。
    しかし、どうにも原因がつかめません。ELCをあきらめようかと思っています。
    マニュアルの6.8.4に
    「また,TEmn = 1の期間中に,ソフトウエア操作(TSmn = 1)をキャプチャ・トリガにして,カウント値をキャプチャすることもできます。」
    とありますので、INTP0の割込み内でTAU0のTSレジスタを1にして、インプットキャプチャを行ってみます。
    ありがとうございました。
  • チョコです。
    WDTではないとすると,INTP0の割り込みがどうなっているのでしょうか。この使い方ではINTP0は使わない設定で良いはずです。
    後は,割り込みの設定がどうなっているかです。
    詳しくは実際のプロジェクトを見ないとわからないですね。
  • チョコさん。
    qazです。
    INTP0は立下がりエッジ、優先順位 高でコード生成を行いました。
    初期化関数でフラグのクリアと割込み優先順位の設定、エッジの方向設定を行っています。
    INTP0の開始関数、停止関数、割込み関数も吐き出されますが、呼んでいません。
    INTP0を何もせずにコード生成を行うと、全くTAU0の割込みが入りません。

    先程書いたソフトウェアトリガでインプットキャプチャを行う方法で機能は実現できそうです。
  • チョコです。
    ところで,TM00は起動(起動後にR_TAU0_Channel0_Startを1回呼び出す)させていますよね。
    そうしないとパルス間隔測定を開始しませんが。(念のため)
  • チョコさん。
    qazです。
    >ところで,TM00は起動(起動後にR_TAU0_Channel0_Startを1回呼び出す)させていますよね。
    はい。メインループに入る前に1回呼び出しています。