タイマー2の動作の件、昨日の文章ではなんとなく奥歯に
モノが挟まったような書き方をしましたが、もう一度
実験してみて、結果を紙に書き出してみたら、
「何が変なのか」が判りました。
結論を先に言うと、AVRstudioの内部処理で
使用している(であろう)フラグか何かの初期化処理が
上手く動作していないということ。バグでしょう。
AVRstudioは、タイマー1だけでなくタイマー2
にもバグが潜んでいるようです。
どういうことかというと…
タイマー0とタイマー2それぞれにおいて、フェーズ
コレクトPWMを使用してシミュレートをかけると、
ある条件下では全く同じ動作結果が得られます。
が、ある条件では動作内容がタイマー2だけ動作が狂います。
その条件と動作内容を以下に記します。
↓この設定でプログラムを作り、シミュレーションを実施します
・タイマー0と2でフェーズコレクトPWM(モード5)を使用
・OCRxA(TOP値として使用される)に3を設定
・OCRxB(出力が反転するカウンタ値)に2を設定
・COMxBに0b10(カウントアップ時にコンペア
マッチするとLOW出力、カウントダウン時なら
HIGH出力)を設定
この設定でタイマー0、タイマー2それぞれでシミュレート
を行うと、1回目は両方とも同じ結果が得られますが、
一旦停止してからもう一度最初からシミュレートを
やり直すと、タイマー0は上記と全く同じ結果が得られる
(あたりまえですが)のに対して、タイマー2では
1回目と異なる結果が得られます。
(OCxBの出力(というか、シミュレーター画面の
PINxの値)が、1回目は両方とも最初の5カウントの
間0のままで、6カウント目から1出力になるのですが、
2回目のシミュレートを実行した時、タイマー2だけは
1カウント目から3カウント目までも1が出力されます。
言葉で書くと判り難いですね…すみません。)
カウンタが初期状態のとき(リセット直後)は、コンペアマッチ
してないはずなので、仕様に愚直ならタイマー0の動作が正しい
と思います。
タイマー2も、1回目のシミュレーションでは同じ
結果が得られます。
2回目以降、なぜ動作が異なるのかというと、ここからは
憶測ですが、タイマー2のカウントダウン時のコンペアマッチ
のフラグを初期化しないまま、次のシミュレーションが
開始してしまうということかと思います。
で、リセット直後にもかかわらずコンペアマッチ状態であると
認識されてしまい、出力が1になる…と。
実際AVRstudio自体を再起動すると、1回目はまた
タイマー0と同一になり、2回目からは誤動作します。
つまり、1回目のシミュレーションと2回目以降のシミュレーション
という”条件”によって再現するわけです。
タイマー0に対し、タイマー1やタイマー2は、あとから
追加された機能だろうと思うので、AVRstudio自体の
品質がまだ確保されていないってことなのでしょうかねぇ?
いずれにしても、今の私の開発環境ではこれ以上はどうする
こともできそうにありません。
もしICDを使ってデバッグできるなら、実機にプログラムを
流し込んで動作確認することが出来るんでしょうけど、
私は環境持ってませんし… (AVR ISP mk2しか
持ってません。JTAGICE-mk2は高いし…)
シミュレーターには「バグは付き物」という前提でテストを
するなら、やはりICDの環境は必須なのかもしれません
ねぇ…
ただ、今の私にできるのは、シミュレーターでも信用できる
機能のみを利用するということだけ。
ひとまずは、その範囲内で実現できることをしたいと思います。
もしかして、ICD環境の販促の為に、わざとバグfixを
先延ばしにしているんでしょうかね…?
(意地悪く考えすぎ??)
|