RL78/G1EのTO00でパルス出力8個の件

お世話になります初心者IKUZOと申します
RL78/G1EのTO00でパルス出力8個のみ出力したいと思います
R_TAU0_Channel0_Start();からたぶん
INTTM00割込みハンドラーにてカウンター確認しまして
R_TAU0_Channel0_Stop();を呼ぶような処理ではないかと思いますが
1.INTTM00割込みハンドラーはどのファイルになりますでしょうか?
2.その中でカウンターが8になっているかどうかは、どのように確認するのでしょうか?

  • チョコです。
    INTTM00割り込みハンドラーは'r_cg_tau_user.c'と言うファイルに,'r_tau0_channel0_interrupt'と言う関数名で生成されています。
    コード生成しただけでは,関数の入れ物が作られているだけなので,そこのユーザ・コード部に必要な処理を記述してください。
    方形波出力では,1パルスごとに2回割り込みが発生するので,8パルスだと,16回の割り込みをカウントする必要があります。
    そこで,このファイルの頭の方のグローバル変数を定義するところがあるので,そこで’volatile uint8_t g_TM00_count;'のような感じで8ビットの変数を定義しておき,R_TAU0_Channel0_Start();でTM00をスタートする前にこの変数(g_TM00_count)に16を設定しておき,TM00がスタートして,'r_tau0_channel0_interrupt'関数の処理として,この変数(g_TM00_count)をカウントダウンし,0になったら,R_TAU0_Channel0_Stop();を呼んで,TM00を停止,0でなければ,そのまま割り込み処理を終了することになるかと思います。
  • わわいです
    出力パルスの周波数(と言うかパルス間隔)はどんだけでしょうか?
    それが十分遅いなら、パルスごとの割り込みやらコンペアマッチの割り込みでカウンタ止める、という処理が有効ですが、割り込み応答時間よりパルス間隔が短くなるとこういう処理では無理となります
  • チョコさんありがとうございます
    下記のようにいたしましたところ、パルスが8個発生しております
    /* Start user code for global. Do not edit comment generated here */
    char r_tau0_channel0_interrupt_count=0;
    /* End user code. Do not edit comment generated here */
    /***********************************************************************************************************************
    * Function Name: r_tau0_channel0_interrupt
    * Description : This function INTTM00 interrupt service routine.
    * Arguments : None
    * Return Value : None
    ***********************************************************************************************************************/
    __interrupt static void r_tau0_channel0_interrupt(void)
    {
    /* Start user code. Do not edit comment generated here */
    if(r_tau0_channel0_interrupt_count < 16){
    r_tau0_channel0_interrupt_count++;
    }else{
    r_tau0_channel0_interrupt_count=0;
    R_TAU0_Channel0_Stop();
    }
    /* End user code. Do not edit comment generated here */
    }
  • わわいさん
    20uSですから。
  • __interrupt static void r_tau0_channel0_interrupt(void)
    {
    /* Start user code. Do not edit comment generated here */
    if(r_tau0_channel0_interrupt_count < 17){
    r_tau0_channel0_interrupt_count++;
    }else{
    r_tau0_channel0_interrupt_count=0;
    R_TAU0_Channel0_Stop();
    }
    /* End user code. Do not edit comment generated here */
    }
    16を17にするとパルスの反転することがなくなりました。
  • チョコさん
    アナログ機能のコード生成はまだないですよね?
  • チョコです。
    時間が気になるなら,DMAで時間を稼ぐことが考えられますよ。
    TM00でDMA転送可能な領域にあるのは,TDR00レジスタ位なので,15回分は通常の時間のデータにして,16回目(最後のパルスの後)を思い切り長くしておいて,その間でDMA完了の割り込みでTM00を停止させることも考えられます。
    (本当はTM00を停止するトリガレジスタにDMAできればいいのですが,それは不可能なので,TDR00で最後のパルスの後の時間を引き延ばしています。)
  • チョコです。
    >16を17にするとパルスの反転することがなくなりました。
    形波出力では,エッジで割り込みがでるので,どの状態からスタートするかでカウント値を調整することになります。目的のパルス数と出力の状態が得られたらOKと言うことで。
  • IKUZOさん
    スマートアナログ専用のコンフィグツールを使わないとですね。(ツールがCS+に組み込まれて色々できます)
    www.renesas.com/.../sa-designer.html

    Webの波形シミュレータは最近?閉鎖されてしまったようです。
    www.renesas.com/.../smart-analog-renesas-va.html

    シリアル使って例えば、SO出力の初期値を1にしておいて、SO端子から0x55を2回送信するのとかってダメです?
    送信バッファがあるので、1バイト(0x55)送信中にもう1バイト(0x55)を送信すれば、割り込みとかDMA使わずに、ぴったり8パルス作れますし。

  • チョコです。
    聞いたことは無いですね。
    アナログ関係はWebシミュレータ等の別のサポート手段があったはずですが,そこらは使ったことがないので分かりません。