(続きです)
MsTimer2を使ったスケッチのアセンブリ言語展開リスト
を眺めないと正確なことは言えないんですが、多分
レジスタ類の退避(push処理)と、割り込みベクタの
ジャンプ処理などモロモロ合わせると64クロック以内
にTCNT2がクリアされている可能性は低いと思います。
(少なくとも将来にわたってあらゆる使い方には無担保)
一方、タイマー2関係のレジスタは、TCNT2も含めると
破壊されています。破壊されるということは、コアの
標準機能含めあらゆるタイマー2関係の処理とは
排他的に利用されることになります。
まぁ、ソースコード上は入出力ピン関係のレジスタ・
ビットを変化させてないのでアナログ出力(PWM)
を使用中にMsTimer2を使い始めた場合もPWM出力は
引き続き動作するコードになっているみたいですが、
動作中にTCNT2の値を弄り回しているので、PWMのピン
に出力される波形は期待とは異なるものになる
はずです。
さて、まぁ大体予想したとおりといえば予想したとおり
ですが、これらを踏まえてMsTimer2をどのように変更
すればいいか?
ikkeiさんやarms22さんからのご指摘を踏まえると
以下のようになるのかなぁ?と。
タイマー0を使ったmillis() 関数のように誤差を途中
途中で補正すればよいのか?(誤差が累積した際に2連発
で指定関数の呼び出しを行うなど)
→多分ノーでしょう。
これだと、一定の時間間隔ごとに処理をしたいっていう
場合に、途中途中で意図しない極小間隔で処理を連発
されてしまう恐れがあるため。
たとえばステッピングモーターをドライブすることを
想像すると、ほぼ一瞬で2ステップ分進むことになり、
モーターが追従できなくなる(→誤動作の元)
また、既存のタイマー2関係の処理とは完全に切り離した
世界で動かす前提になっているので、MsTimer2単体だけの
ことを考えてモディファイしても他機能に影響は無い。
加えて、タイマー2はmega48系のチップだけでなく、
mega8、mega128でもCTCモードで動作することが可能。
(c.f.mega8のタイマー0はCTCが使えない)
つまり、機種依存性は無い。
というわけで、やはりikkeiさんのおっしゃるように
CTCモードを使用する様に修正してしまうのがよさそう
です。
私がざーーーーっと調べてみたところではそんな感じ
なのですが、間違えがありましたらご指摘いただければ
ありがたく…。
まぁ、あとは実際にMsTimer2ライブラリをモディファイ
してみてから、作者の方にそれで問題ないか聞いてみる
って作業があるんだな。まぁ、できるだけ早めに…。
|