現在地

ATmega164でWDTが勝手に動作した件


カテゴリー:

PLLシンセサイザ(その5)のところで「ちょっとトラブルがあった」と書きましたが、今回はそれについて書いてみようと思います。

VCOが出来たのでD/Aコンバータから電圧を与えてV-F特性を見ようと電源を入れたのですが......

何故かマイコンがリセットを繰り返してしまいD/Aを操作できません。最後にD/Aコンバータを確認したときには動作していましたし、それからソフトウェアは変更していません。ハードウェア的には電源とD/Aの出力をくらいでマイコンの動作に影響を与えるとは考えにくいのです。電源が揺れれば考えられなくはありませんが、オシロで見ても問題なさそうですしVCO基板を外しても解決していません。

以前試したときは(初期化を忘れていたのに)偶然動いていただけかもしれません。未使用割り込みベクタをreti命令を指すようにしたり、I/Oポートの初期化を見直したりしましたが効果ありません。

ふとWDT(Watch Dog Timer)が動作しているのではと思い当たり、要所にwdr命令を入れてみると問題が消失しました。ただWDTを有効にはしていないはずなのです。

WDTを有効にする方法は2つあって、一つはソフトウェアからレジスタのビットを立てる方法、ですが勿論そんなコードは書いていません。もう一つはヒューズビットでONする方法、これも確認してみましたがOFFのままでした。

他に有効化する方法が無いかデータシートを熟読しなおしていたところ気になる記述を見つけました。

Note: If the Watchdog is accidentally enabled, for example by a runaway pointer or brown-out condition, the device will be reset and the Watchdog Timer will stay enabled. If the code is not set up to handle the Watchdog, this might lead to an eternal loop of time-out resets.

一度有効になってしまうとそのままになるんですね。これでほぼ状況を説明できますが、実はいくつか疑問があります。

一つは最初になぜWDTが有効になってしまったか、ですが心当たりがない上に今となってはもうわからないでしょう。

もう一つは何度もソフトウェアの書き換えを行なっているということ。書き換えはISPで行なっており、この際にRESETピンがアサートされます。これでもWDTは切れないものなんですね。

さらにVCO基板を抜き挿しするときなど電源も切っているのですが...... これは接続したままのシリアル経由で電源が供給されてしまったのかもしれません。(このボードではダイオードによる対策はしていません)

いずれにせよWDTが意図せずONしてしまうと厄介なので明示的にOFFするコードは必要なようです。

参考文献・関連図書: 
ATmega164A/164PA/324A/324PA/644A/644PA/1284/1284Pデータシート, Atmel.

コメントを追加

Plain text

  • HTMLタグは利用できません。
  • ウェブページアドレスとメールアドレスは、自動的にハイパーリンクに変換されます。
  • 行と段落は自動的に折り返されます。
※ コメントは原則公開です。個別のご相談などは「ご意見・ご要望」からお願いします。