Mega644Pの不具合


UART0で不具合
2chの(5月の)AVRスレやAVR-Wikiで話題になっていますが
Mega644P, 164PでUART0を使うとAVRの動作がおかしくなります。
レジスタの値が勝手に書き変わるようで、どう動作しているのかよく解りません。

自分で確認したところでは、
1.UART0で起きるがUART1では問題ない。
2.クロック周波数が高いと起きやすい。
  20MHzはダメ。8MHzならとりあえずOK。
3.プログラムを書き直すとうまく動くときがある。
  (論理的ではないが実行コードのわずかな違いでたまたま動く?)

意味不明な動作をするので困っています。
何かご存知でしたら2chのAVRスレやAVR-Wikiでお知らせいただくと幸いです。
解決しました。内容は下記を参照してください。



クロックの異常でした
AVR-Wikiでkkkさんからヒューズ設定がおかしいとの指摘がありました。
そして、jujurouさんからフルスィングにしたら誤動作が直ったと。

私もExt. Crystal Osc 8.0- MHz(ヒューズLow: FF)で実験していて、
フルスィングにしたら2chとjujurouさんの件は正常動作になりました。

ちなみにブレッドボードで実験してます。低電力発振は誤動作しやすいんですね、知らなかったです。とりあえずkkkさんがエスパーだということが判りました。



発振出力の違い
発振入力ピンの隣りが通信ピンだったからクロックが誤動作していたという今回の不具合、どのくらいのレベルなのかオシロで測ってみました。(↑の波形参照)
低電力で周波数が高いとかなり小さいです。



セラロックでは
セラッロクだと発振しないときがあるそうです。8MHzの波形がきれいな正弦波になっていませんが意味があるのかよく解りませんでした。。




2313では
基板の都合でセラロックを使っています。
旧型のAT90S2313は最も振幅が大きかったです。(上の波形参照)
恐ろしいのはTiny2313で、フルスィングの設定が無く低電力のみです。
2009年6月21日:追記
上の文は訂正します。

Tiny2313の追加実験
先週はTiny2313がフルスィング発振でないことを発見しました。
しかし、今まで水晶やセラロックを使ったからといってAVRが誤動作した経験がありません。
又、「振幅が小さい=Mega644P(ピコワット)と同じ。」とも限らないのでさらに実験しました。
1.ブレッドボードでクロック入力の隣りピンに信号を入れてみる。
2.クロック入力を指で触ってみる。
  S2313やS1200だと簡単に暴走したり、発振停止、リセットしたりします。
  (下の動画参照)

結果
Tiny2313をさらに実験した結果、振幅が小さいもののノイズに弱いわけではありませんでした。
数値で比較できる実験方法ではないですがS2313より誤動作しにくかったです。

尚、ヒューズLの設定は0xFF(8MHz以上)にしています。
0xFD(3M〜8MHz)に設定すると振幅が小さくなります。(下の波形参照)
0xFB(0.9M〜3MHz)設定ではプローブを当てると発振が止まるのでオシロでは測れませんでした。


指で触ると暴走する基板



製作の注意点
Tiny2313は振幅が小さくても問題なかったのですが、水晶を使うときは注意すべきでしょう。
具体的には
1.発振回路を最短で配線する
  これは配置(パターン)優先度の考え方ですね。
  後から「水晶をどこに入れよう。」とか考えてると遠い所に配置してしまいます。
2.専用GNDにする
  例えばモータ動力へいくGND線の途中から分岐した0Vラインを
  水晶回路のGNDにするのは良くないです。
  マイコンのGNDから発振専用のGNDを取れば余計な電流で揺すぶられないでしょう。

更新履歴
2009年6月21日:Tiny2313の実験を追加。
2009年6月13日:オシロ波形を追加。
2009年6月12日:クロックの異常を追加。
2009年6月 8日:Mega644Pのバグを公開。

トップ アイコン
直線上に配置