Config_ICUでのIRQの設定について

いつも大変お世話になっております。リューキィです。

現在、RX65N Envision Kitでロータリーエンコーダを使用した試作機の開発をしているのですが、

信号の入力も表示も出来ているのですが、なぜか1回転した時の数字がズレてしまう事が多々発生してしまっています。

ロータリーエンコーダの接続の方法や、接続端子の接触不良等も疑ったのですがどうやら問題なさそうで、次にマイコン側の端子の設定

を疑っている次第です。

13chのD7(IRQ1)とD6(IRQ2)ロータリーエンコーダの信号線は接続しており、

モジュールのConfig_ICUでIRQ1/2ともに立上りエッジのレベル15 フィルタ無しにしてあります。

また、メインソース上で

R_GPIO_PinDirectionSet( GPIO_PORT_D_PIN_1, GPIO_DIRECTION_INPUT );
gpio_err |=R_GPIO_PinControl (GPIO_PORT_D_PIN_1, GPIO_CMD_IN_PULL_UP_ENABLE);
R_GPIO_PinDirectionSet( GPIO_PORT_3_PIN_2, GPIO_DIRECTION_INPUT );
gpio_err |=R_GPIO_PinControl (GPIO_PORT_3_PIN_2, GPIO_CMD_IN_PULL_UP_ENABLE);

で入力端子設定とプルアップ設定も行っております。

(※もしかしたらこれが二重設定とかになっていて邪魔をしているのか??とも思い始めました)

また、ロータリーエンコーダのカウントは

IRQ1が立ち上がった際に、IRQ2の状態を見て0だったらカウントをインクリメント

IRQ2が立ち上がった際に、IRQ1の状態を見て0だったらカウントをデクリメント

としています。(それぞれの立ち上がりを見ずとも、一行目にelseでデクリメントすれば良いのもわかっているのですが、ズレが発生しているので何か問題があるのかもと思い、わざと

分けてあります)

ロータリーエンコーダの1周の分解能は40なので、非常に少ないのですが数回転回すとズレる状態です。

何かわかる方がいらっしゃいましたら、ご指導いただきたく思います。

よろしくお願い致します。

  • リューキィさん、こんにちは。NoMaYです。

    割り込み禁止になっているかどうかを確認するには、CMT割り込みで1ms程度の割り込みを発生させ、その割り込み処理内でポート出力をトグルさせて、オシロで波形を見るというのがあります。問題無ければ、1msごとにトグルし続ける筈ですが、20~30msのレベルの長期間に渡ってトグルが止まってしまうようであれば、そこが問題ということになります。

    あるいは、100μs程度でトグルさせてみてもよいです。

  • リューキィさん、こんにちは。NoMaYです。

    あと、以前にリューキィさんにお渡しした土台のプログラムのさらに土台の手元の`Hello こんにちは`プログラムでは、以下の赤文字箇所にブレークポイントを設定してGo/Breakを繰り返してみると、デバッガの実行時間表示が5ms弱となりましたので、少なくともその時点では20~30msのレベルの長期間に渡って割り込み禁止になっていることは無かった、ということになります。(まだ、そういう割り込み禁止時間がある、ということがはっきりしたわけではありませんけれども。)

    void MainTask(void) {
      //
      // Setup configuration dependent pointers
      //
      APPW_X_Setup();
      //
      // Initialize AppWizard
      //
      APPW_Init(APPW_PROJECT_PATH);
      //
      // Create all persistent screens except initial screen
      //
      APPW_CreatePersistentScreens();
      //
      // Create initial screen...
      //
      APPW_CreateRoot(APPW_INITIAL_SCREEN, WM_HBKWIN);
      //
      // ...and keep it alive
      //
      while (1) {
        while (GUI_Exec1()) {
          APPW_Exec();
        }
        APPW_Exec();
        GUI_X_Delay(5);
      }
    }

     

  • NoMaYさん、こんにちは。リューキィです。

    A相・B相の波形は撮影していません。

    main()のemWinの部分をコメントアウトしようとしたのですが、どれか分からず、とりあえず「APPW_」の部分と

    最後にある

    -------------------------------------

    while (GUI_Exec1()) {
    APPW_Exec();
    }
    APPW_Exec();
    GUI_Delay(5);

    -------------------------------------

    をコメントアウトしたのですが、そうすると割込み自体が発生しません。エンコーダには電源が入っているので信号は出ています。コメントアウトしている場所を間違えているのだとは思うのですが。。。すみません。

  • リューキィさん、こんにちは。NoMaYです。

    では、こうして下さい。

    void main(void)
    {
        //MainTask();

        IRQを使えるようにする初期化コードをここに(既に作られているものをコピペすれば良い筈)

        for(;;)
        {
        }
    }

     

  • NoMaYさん、こんにちは。リューキィです。

    すみません。。。上記作業に入る前に

    なぜか立上り検出そのものをマイコンが認識しなくなりました。。。

    R_Config_ICU_IRQ2_Start();もメインにありますし、SCFG上でも割込みの設定はされていて、エラー等も出ていないのですが。コメントアウトしたところも戻しましたが、動いていたカウントの上下も反応しない状態です。。。

    オシロはエンコーダからの信号を得ているので、回路が外れたりとかは無いです。。。

  • デバッグ起動時に、インクリメント or デクリメントをすることがあるので、1度は検出しているのだと思いますが、連続しての検出がされなくなってしまいました。コンポーネントの設定でも立上りエッジですし、Stopもかけていないので検出されなくなる事自体が不自然なのですが。。。と言われても困りますよね。。。すみません。。。

  • リューキィさん、こんにちは。NoMaYです。

    そういう場合は、コーヒーを一杯飲む、とか、タバコを一服、とか、気持ちを落ち着かせてみて下さい。こちらは急ぎません。(ただ、これまで頂いていた投稿から感じるのは、そちらの環境がいくら何でも不安定過ぎるかなぁ、ということはあります。)

  • 上記解決しました。。。すみません。。。

  • 自分が非常に未熟なだけだと思います。。。本当にすみません。。。

  • 1ms毎でCMT割込みのオシロです。