レトロでハードな物語

レトロなゲーム機・マイコン・中古デバイスなどをArduinoやAVRで再活用する方法を模索しています。

動かなくなったATmega328Pを復活させる

2019年08月09日 | 電子工作

先日秋月電子で購入したATmega328Pですが、外部に16MHzの水晶発振器をつけPro Mini 5V16MHzとしてブートローダーとスケッチを書き込んで遊んでいました。ところがちょっと魔が差して、内部クロック8MHzで動かしてみたいという欲求にかられました。
そこでArduinoのサイトを参考に内部クロック用のブートローダーを書き込んで見たところ書き込みは問題なく行えたのですが、その後にスケッチを書き込む段階でエラーが発生してなにも書き込めなくなってしまいました。そこから復旧させようと外部に8MHzや16MHzの水晶発振器を付けたり動作電圧を変えたりして色々いじっていましたが、ブートローダーもスケッチも一切書き込めない状態から抜け出せず、完全に使用不能になってしまいました。

ネットで調べてみるとAVRの動作を書き込むヒューズビットに、間違った値を書き込むとこのような状態になることが分かりました。なぜそうなってしまったのかこの時点でははっきり分かりませんでしたが、こうなるといつも行っているICSP端子での書き込みはできなくなるそうです。別の方法での書き込みは可能なようですが、そのためには高価な書き込み装置を購入するか、Arduinoでヒューズをリセットする回路を構築するしか方法が無いようです。
ヒューズリセッターの回路は配線の本数も多く面倒くさそうなので、もうこのATmega328Pは諦めてほったらかしておくことにしました。

後日、別のATmega328Pの外部に8MHzの水晶発振器をつけPro Mini 3.3V8MHzとして使用していたところ、スケッチを書き込んだ途端エラーが発生しました。焦って配線を確かめてみると書き込み時の電圧が3.3Vのままでした。スケッチ書き込みはLeonardoのICSP端子経由で行っていたのですが、スケッチ書き込み後の動作確認のときにICSP端子周りの接続ケーブルの抜き差しがちょっと面倒くさかったので、電源はICSP端子の5Vではなく3.3Vと5Vが並んでいる方の5Vピンにつなぎ、動作確認の時に3.3Vピンに差し替えていたのです。電源ピンを差し替えるのを忘れたままスケッチ書き込みを行ってしまいました。

その後は何をしても、スケッチ書き込みやブートローダーの書き込みが行えなくなってしまいました。最初に動作しなくなったATmega328Pも原因は同じだったのでしょう。ちょっとの手間を惜しんだばかりに、ATmega328Pを2つも動作不能にしてしまいました。

さすがに2つも無駄にするのはもったいないので、面倒ですがヒューズリセッターを構築することにしました。構築方法についてはネットには山ほど情報がありますが、こちらのサイトが分かりやすかったので利用させてもらいました。ありがとうございます。

参考にしたサイトではArduino UNOでヒューズリセッターを構築していましたので、手持ちのLeonardoを使うことも考えたのですが、ヒューズリセッターからATmega328Pには12Vの電圧をかけるので、万が一配線ミスでLeonardoを破壊してしまったらショックが大きすぎます。そこで、壊しても精神的ダメージの少ないPro Miniで構築することにしました。

回路の構築に必要な部品は全て手元にあったので、ヒューズリセッターのスケッチをPro Miniに書き込んでから回路構築に取り掛かりました。配線が多いので間違えないように、上記サイトの回路図を印刷して配線を一本ずつチェックしながら慎重に組み上げました。配線は大変ですが殆どピンの並び順に配線されているので、意外に早く作業は終わりました。



ヒューズの書き込みはIDEのシリアルモニタに表示されるメニューから行うようになっていましたが、Pro Mini単体では無理なので、前に作成したMAX232レベルコンバーター経由でPCとつなぎ、Ubuntuのシリアル端末から操作することにしました。

ドキドキしながら電源を入れてみると、無事シリアル端末に操作メニューが表示されました。ヒューズのリセットはWコマンドで行います。確認のメッセージが表示されたらYと入力すると、一瞬でヒューズへの書き込みは終了です。拍子抜けするくらい簡単です。
RやSコマンドで確認すると無事に書き込まれているようです。動作しなくなったATmega328Pのヒューズを2つとも書き終え、すぐにLeonardoを使ってPro Mini 3.3V8MHzのブートローダーを書き込んでみると、エラーもなく普通に書き込むことが出来ました。

その後Blinkのスケッチを書き込んで見たところ、全く問題なく動作しました。



これでATmega328Pを無駄にしなくて済みました。めでたしめでたし。



最新の画像もっと見る

コメントを投稿