こんばんは。
タイマ割込みを実装したのですが、実装が正しいのかどうか判断がつきません。
よろしくお願いいたします。
インターバルタイマを利用し、1ms周期で割込みを発生する処理を実装しました。
正確に1ms周期で割込みが発生することを計測するには、
オシロでテストポートをHi/Loするのが良いかと思いますが、
手元にオシロがありませんので、CS+上のデバッグ実行時間を見て確認しております。
計測時間は以下のようになりました。(赤枠部分)
関数の先頭でブレイクを張ると、「未計測」となるので、
10ms経過時点にブレイクポイントを仕込み計測しております。
break → goを繰り返すと、8.3ms,8.7ms,8.2msと、だいたいこの近辺の結果となります。
これはCS+の誤差によるものでしょうか?
実装は以下の通りです。
(クロックは最初の画像の通り、オプションバイトで高速オシレータ32MHzで設定しております。)
チョコです。
おそらく,ブレーク中にもタイマが動作していることが原因だと思われます。
ブレーク中にもタイマ割り込みが入ってきますが,割り込み要求フラグは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
以上