Top Page [◀◀]  2   3   4   5   6   7   8   9   ... [▶▶Last Page

RL78/G14 複数のINTPを要因としたDTC

初めて投稿します。

 

RL78/G14で、外部割込み(INTP4~7)の両エッジでタイマのカウンタ値をDTCでメモリに取り込んで割り込み処理で使おうと思っています。

割り込み処理の先頭でタイマのカウンタ値を読んでもいいのですが、少しでも誤差を少なくするために、CPUを介在せずに値を取得したいと考えています。

まだ現物の基板が出来上がっていないため、CS+のシミュレータ上で動作の確認を行っています。

しかしどうしても上手く動作しないため、皆様のお知恵をお借りしたく投稿いたしました。

 

極力シンプルにするため、他の機能をすべて省いたプロジェクトを作成します。

マイクロコントローラはR5F104LJ。ROM 256KB、内部RAM 24576バイト。

コード生成の端子割り当て設定、クロック設定はデフォルトのまま。

外部割込みは、INTP4~INTP7を両エッジ、優先順位「低」に設定。

DTC設定は、DTCベースアドレス0xffd00、DTCD0~DTCD3を有効にして、それぞの起動要因としてINT4~7を設定。

DTCD0設定は、ノーマルモード、データサイズ16ビット、転送元アドレス0xfe80固定、転送先アドレス0xfe00固定、転送回数1回、ブロックサイズ2。

DTCD1設定は、ノーマルモード、データサイズ16ビット、転送元アドレス0xfe80固定、転送先アドレス0xfe10固定、転送回数1回、ブロックサイズ2。

DTCD2設定は、ノーマルモード、データサイズ16ビット、転送元アドレス0xfe80固定、転送先アドレス0xfe20固定、転送回数1回、ブロックサイズ2。

DTCD3設定は、ノーマルモード、データサイズ16ビット、転送元アドレス0xfe80固定、転送先アドレス0xfe30固定、転送回数1回、ブロックサイズ2。

 

以上の設定でコード生成し、r_main.cのmain()のuser code部分に以下のコードを記述。

    /* DTC転送先をクリアしておく */
    *(volatile __near uint16_t *)0xfe00 = 0;    /* DTCD0(INTP4)の転送先 */
    *(volatile __near uint16_t *)0xfe10 = 0;    /* DTCD1(INTP5)の転送先 */
    *(volatile __near uint16_t *)0xfe20 = 0;    /* DTCD2(INTP6)の転送先 */
    *(volatile __near uint16_t *)0xfe30 = 0;    /* DTCD3(INTP7)の転送先 */
    *((volatile __near uint16_t *)0xfe80) = 0x8000;    /* TCDD0~3の転送元(タイマカウント値の代わり) */
    /* DTCD0~3スタート */
    R_DTCD0_Start();
    R_DTCD1_Start();
    R_DTCD2_Start();
    R_DTCD3_Start();
    /* INTP4~7割り込みスタート */
    R_INTC5_Start();
    R_INTC6_Start();
    R_INTC7_Start();
    R_INTC4_Start();
    while (1U)
    {
        (*(volatile __near uint16_t *)0xfe80)++;    /* TCDD0~3の転送元データカウントアップ */
    }
 
r_cg\intc_user.cのr_intc4_interrupt()に
    *((volatile __near uint16_t *)0xfd42) = 1;   /* DTCCT0 ← 1 */
    R_DTCD0_Start();   /* DCT0再スタート */
r_intc5_interrupt()に
    *((volatile __near uint16_t *)0xfd4a) = 1;   /* DTCCT1 ← 1 */
    R_DTCD1_Start();   /* DCT1再スタート */
r_intc6_interrupt()に
    *((volatile __near uint16_t *)0xfd52) = 1;   /* DTCCT2 ← 1 */
    R_DTCD2_Start();   /* DCT2再スタート */
r_intc7_interrupt()に
    *((volatile __near uint16_t *)0xfd5a) = 1;   /* DTCCT3 ← 1 */
    R_DTCD3_Start();   /* DCT3再スタート */
をそれぞれ記述しました。
 
コンパイルしてシミュレータGUIの信号データエディタでINTP4~7が順次変化するデータを作成します。
r_intc4_interrupt()r_intc7_interrupt()にブレークポイントを設定して実行してみると、INTP7(DTCD3)にしかブレークがかかりません。
メモリの0xffe00、0xffe10、0xffe20、0xffe30を見ても、0xffe30の値だけしか変化していません。
 
INTPとDTCDを1個づつにすれば正しく動作しています。2個以上にすると、そのうちの1個だけしか動作していないように見えます。
 
使い方の間違いなどがありましたらアドバイスを頂けたらと存じます。よろしくお願いいたします。
  • cinquantaseiさん、こんにちは。NoMaYと申します。

    こちらでも再現しましたが、私は、これはシミュレータのバグではないだろうか、と思います。

    シミュレータ不具合内容

    (1) 最後にDTCENiレジスタで禁止→許可に切り替えたDTC起動許可ビットのものしか起動しない
    (2) 複数のDTCENiレジスタを操作する場合はiが大きいもの→小さいものの順に設定する必要がある

    期待値

    (1) DTCENiレジスタでDTC起動許可ビットが許可となっているものは全て起動すること
    (2) 複数のDTCENiレジスタを操作する場合にDTCENiレジスタの設定順序は無関係であること

    ですので、あくまで対症療法的な一時しのぎの不具合回避策、としてですが、以下のようにしたところ動作しました。

    プロジェクトのファイル一式
    issue_20190809.zip

        /* DTCD0~3スタート */
    //    R_DTCD3_Start();
    //    R_DTCD2_Start();
    //    R_DTCD1_Start();
    //    R_DTCD0_Start();
        DTCEN1 |= 0x80;
        DTCEN0 |= 0x07;
        *((volatile __near uint16_t *)0xfd42) = 1;   /* DTCCT0 ← 1 */
    //    R_DTCD0_Start();   /* DCT0再スタート */
        DTCEN0 = 0x00;
        DTCEN1 = 0x00;
        DTCEN1 |= 0x80;
        DTCEN0 |= 0x07;
        *((volatile __near uint16_t *)0xfd4a) = 1;   /* DTCCT1 ← 1 */
    //    R_DTCD1_Start();   /* DCT1再スタート */
        DTCEN0 = 0x00;
        DTCEN1 = 0x00;
        DTCEN1 |= 0x80;
        DTCEN0 |= 0x07;
        *((volatile __near uint16_t *)0xfd52) = 1;   /* DTCCT2 ← 1 */
    //    R_DTCD2_Start();   /* DCT2再スタート */
        DTCEN0 = 0x00;
        DTCEN1 = 0x00;
        DTCEN1 |= 0x80;
        DTCEN0 |= 0x07;
        *((volatile __near uint16_t *)0xfd5a) = 1;   /* DTCCT3 ← 1 */
    //    R_DTCD3_Start();   /* DCT3再スタート */
        DTCEN0 = 0x00;
        DTCEN1 = 0x00;
        DTCEN1 |= 0x80;
        DTCEN0 |= 0x07;

    以下、CS+の画面コピーです。




    [追記]

    動作を調べていた時の名残りでOR代入になっていますが、これは素朴に以下の代入でよいです。

        DTCEN1 = 0x80;
        DTCEN0 = 0x07;

     

Top Page [◀◀]  2   3   4   5   6   7   8   9   ... [▶▶Last Page