RL78/G13 基本的な多重割り込み処理の操作方法

皆様、

初心者です。ご教示お願いします。

・外部のモメンタリSWに接続した割り込みP137端子(INTP0)と12bitインターバルタイマを使い、外部割り込みSWのチャタリング防止のプログラムを作成しました。

・INTP0で呼ばれる#pragmaで定義される割り込みルーチンプログラムの冒頭に、12bitインターバルタイマによるwait_25ms()を記述したところ、このwait_25ms()のHALT()で止まってしまいます。

・そこで、割り込みルーチンのwait_25ms()の代わりに、割り込みを使用しないNOP()を繰り替えすループを作成したところ(100ms程度?)、P137のSW動作はうまく行くようになりました。

お尋ねしたいのは、

(1)外部SWのチャタリング防止のウエイトのために、12bitインターバルタイマを使用するには、どうしたらよいのでしょうか?

(2)INTP0のデフォルト割り込み優先順位は"2"のようです(H/Wマニュアル)。インターバルタイマはこれより低い順位です。wait_25ms()の前に、EI()を入れ、後にDI()を挿入すればことたりるのでしょうか?

初歩的な内容ですが、よろしくお願いします。

Parents
  • こんにちは。NoMaYです。

    > 非常に短い時間のうちに割り込が連続して発生する、ということになります

    確かに、そうですね。

    実は、私は実務でチャタリング除去処理すら書いたことが無いという、少々経験が偏っている人物だったりするので、後は本物のベテランの方にお任せします。(でないと、間違ったことを言いそうなので、、、)

    #最近、FreeRTOSのサンプルプログラムでvTaskDelay()によるチャタリング除去を書いていたので反応してしまいました、、、すみません、、、

  • NoMayさん、わいわいさん

    ご指導ありがとうございます。
    本来の多重割り込みの基本的な使い方から、チャタリング対策処理に話題が移りました。
    チャタリング対策処理に関し、お二人に共通しているのは、INTP0の外でタイマーを使うということですね。これは了解いたしました。

    >わいわいさん
    INTP0は、チャタリング除去ではなく、SW押下のチェックのために使用したいというのがそもそもです。
    SWがバタついても、P137の"最初"のエッジ低下が認識されると、INTP0の割り込みルーチンに飛びます。
    このルーチンの始めにタイマーでウエイトさせ、その後、プルアップされているP137のステータスを再度確認し、0であれば、SWが押されたというフラグをセットし割り込みルーチンを抜けるというロジックです。現在は、割り込みを使用しないタイマーを使っています。
    チャタリング防止あるいはSW押下の認識方法とは別に、このような場合に、wait_25ms()というタイマー割り込みのHALT()を避けるにはどうしたらよいでしょうか?

    よろしくお願いします。
  • 失礼しました。わわいさんでした。
    NoMayさん、わわいさん

    ご指導ありがとうございます。
    本来の多重割り込みの基本的な使い方から、チャタリング対策処理に話題が移りました。
    チャタリング対策処理に関し、お二人に共通しているのは、INTP0の外でタイマーを使うということですね。これは了解いたしました。

    >わわいさん
    INTP0は、チャタリング除去ではなく、SW押下のチェックのために使用したいというのがそもそもです。
    SWがバタついても、P137の"最初"のエッジ低下が認識されると、INTP0の割り込みルーチンに飛びます。
    このルーチンの始めにタイマーでウエイトさせ、その後、プルアップされているP137のステータスを再度確認し、0であれば、SWが押されたというフラグをセットし割り込みルーチンを抜けるというロジックです。現在は、割り込みを使用しないタイマーを使っています。
    チャタリング防止あるいはSW押下の認識方法とは別に、このような場合に、wait_25ms()というタイマー割り込みのHALT()を避けるにはどうしたらよいでしょうか?

    よろしくお願いします。
  • わわいです
    > このような場合に、wait_25ms()というタイマー割り込みのHALT()を避けるにはどうしたらよいでしょうか?

    そうしなければ動かない、ということが、そもそもSW入力を割り込みに入れているため、でしょう。
    そこをどうにかしましょう。
Reply
  • わわいです
    > このような場合に、wait_25ms()というタイマー割り込みのHALT()を避けるにはどうしたらよいでしょうか?

    そうしなければ動かない、ということが、そもそもSW入力を割り込みに入れているため、でしょう。
    そこをどうにかしましょう。
Children
  • わわいです
    このような状況でどう処理をするか、というと、来た複数の割り込みを、それぞれ適切に処理をする、ということになります。

    一つのスイッチのアクション、入れるときと切るときに複数の割り込みがかかります。それを適切に処理をしましょう。

    #複数の割り込み、それは数個かもしれないし、数十個かもしれない。

    それができないでいるからこそ、不要なウェイトを噛ませたり割り込みをディセーブルしないといけないことになります

    #RL78はあんまし使ったことないので、具体的なことは言えませぬ