RX210でタイマオーバーフロー割り込み周期がずれる

お世話になってます。

RX210で、8bitのtmr0を5ms周期、tmr1を500us周期でオーバーフロー割り込み
として使っているのですが、SCIの送信割り込みを使ってデータ送信
を行うようにするとtmrの周期がずれてしまいます。
SCIの送信割り込みは500msに1回5バイト程度のデータをテスト的に
送信しています。
送信タイミングに同期して周期が遅れているようで、SCIの送信を止めるときっちり

5ms、500us周期で割り込みがかかります。

割り込みはレベルはtmr0、1、SCIともにOVIに4を設定しています。
tmr0、1を5などSCIよりも高レベルに設定しても改善しませんでした。

他に見るべきところは有りますでしょうか?

Parents Reply Children
  • こんにちは
    説明が不足していました。

    SCIの送信割り込みでタイマ割り込みが阻害されていると推測しました。

    SCIの送信割り込み中でもタイマ割り込みを発生させるには多重割り込みを許可する必要があります。
    SCIの送信割り込みの中でPSWのIビットを0にすると、
    タイマ割り込みの優先順位がSCIの送信割り込みより高い場合、
    タイマ割り込みが入ります。

  • SAさん

    該当のSCIの送信処理vect.h内に
    #pragma interrupt (Excep_SCI7_TXI7(enable, vect=208))
    として多重割り込みを許可するようにしたら問題なくなることが確認できました。

    今までR8CやH8S等を使ってきましたが、特に多重割り込みを許可、不許可を意識
    したことはなく同じソフトで問題なく動いていたのですが、
    多重割り込みを許可しないといけないのはRX特有なんですかね。

    fujita nozomu さん

    原因とは直接関係なかったようですが、
    TCNTカウンタの再初期化を割り込み処理で行う実装だったので、あんまりきれいでもないので
    コンペアマッチを使うやり方に変更しました。
  • もんたさん
    こんにちはSAです。
    構成に多少の違いはありますが、H8SもR8Cも割り込みがはいった後、
    割り込み許可フラグによって割り込み禁止になります。
    割り込み処理内で割り込み許可を設定しないと多重割り込みが入りません。
    RX特有ではないと思います。

    ご参考のFAQです。

    https://support.renesas.com/hc/ja/articles/217534058

  • デフォルトで禁止になっているというこは多重割り込みをまったく使わずにうまく作れるもの
    なんでしょうか?

    例えばディスプレイの表示更新周期に一定サイクルの処理が必須で、それにさらにシリアル
    で通信したいとなった場合、多重割り込みは必ず必要になってくるような気がしますが。

    >構成に多少の違いはありますが、H8SもR8Cも割り込みがった後、
    >割り込み許可フラグによって割り込み禁止になります。
    今ソースコードを見直してみましたが、割り込み処理中に許可フラグの設定とか
    してない感じですが、H8SもR8Cもその辺意識しなくてもタイマ周期がずれるということは
    有りませんでした。
    まぁどこか見落としてるんでしょうね。
  • わわいです
    まあ、私の私見ですが、
    多重割り込みを使わなくても動くように作るもの、です。
    そもそも割り込み処理に、他の動作に影響するだけの時間がかかるというのは何か間違ってますね
    そりゃVsync割り込み中にビデオメモリをブロック転送せにゃならん、とかどーしても時間をかけざるをえない場合はありますが、そこは特別に多重を許可する、というアプローチですね