タイマ割込み周期にずれが生じます

こんばんは。

タイマ割込みを実装したのですが、実装が正しいのかどうか判断がつきません。

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

 

インターバルタイマを利用し、1ms周期で割込みを発生する処理を実装しました。

正確に1ms周期で割込みが発生することを計測するには、

オシロでテストポートをHi/Loするのが良いかと思いますが、

手元にオシロがありませんので、CS+上のデバッグ実行時間を見て確認しております。

計測時間は以下のようになりました。(赤枠部分)

関数の先頭でブレイクを張ると、「未計測」となるので、

10ms経過時点にブレイクポイントを仕込み計測しております。

break → goを繰り返すと、8.3ms,8.7ms,8.2msと、だいたいこの近辺の結果となります。

これはCS+の誤差によるものでしょうか?

実装は以下の通りです。

(クロックは最初の画像の通り、オプションバイトで高速オシレータ32MHzで設定しております。)

Parents
  • チョコです。

    おそらく,ブレーク中にもタイマが動作していることが原因だと思われます。

    ブレーク中にもタイマ割り込みが入ってきますが,割り込み要求フラグは1ビットだけなので,ブレーク中に何回1msの割り込みが発生しても1回と判断されます。

    そのため,実行開始して割り込み処理から抜けると,すぐに割り込みを受け付けるので,10msのところが1ms短くなります。さらに,本来のインターバル割り込みが非同期に発生するために0~1msの範囲で短くなります。この分が小数点以下の変動となって現れます。これが,1ms以上短くなったことの理由ではないかと想像できます。

    この問題に対応するには,ブレーク中にはタイマを停止させる必要があります。

    このためには,「デバッグ・ツール」の「プロパティ」「デバッグ・ツール設定」タグの「ブレーク」の中の「停止時にタイマ系周辺エミュレーションを停止する」を「はい」に変更してください。(下図参照)

    これで,期待した結果が得られるはずです。

    ここらは,「チョコさんのRL教室」の第2回(下のURL参照)のPDFの34~35ページで説明されています。

    http://japan.renesasrulz.com/cafe_rene/b/rl78-classroom/posts/rl78-2

     

    以上

  • チョコ様

    ありがとうございます。
    確かにおっしゃる通りでした。
    教えていただいた設定で再度計測値を確認したところ
    期待通り10msの計測結果が得られました。

    ありがとうございました。
    (他の皆様もご回答いただきありがとうございました。)
Reply
  • チョコ様

    ありがとうございます。
    確かにおっしゃる通りでした。
    教えていただいた設定で再度計測値を確認したところ
    期待通り10msの計測結果が得られました。

    ありがとうございました。
    (他の皆様もご回答いただきありがとうございました。)
Children
No Data