SNSへはこちら

Fuse BytesをミスったATmegaの救出劇

今回は同じサークルの後輩から借りた ATmega328P で遊ばせてもらっていた所、ヒューズバイトの値をミスりお陀仏となっていたものの復旧を行いました。

経緯

後輩が「マイコンにクリスタル繋いでも動かないンゴ!」と言っていた時、「貸してみ」と自宅で動作確認を行い、そのまま使わせてもらっていました。
丁度その頃、自作 AVR ライタである avrNerd を作りつつ、これできちんとヒューズバイトの書き換えができるかとテストをしていた時のこと…

どのビットがどの意味なのかはこちらの計算サイトを参考にやっていました。そこで試しに DWEN というデバッグ機能を ON にするビットを立てた所、見事に Brick。リセットこそ聞くものの、これ以降一切シリアルでの応答がありません。こちらの情報によると

* DWENヒュース を元に戻すには(→1)  高電圧プログラミンク が必要。
  元に戻すまではISP書き込みはできない

との絶望的な記述が。データシートにはそんなこと書いてないぞ!第一たった今 AVR のシリアルライタが完成しかけてた所なのに、高電圧パラレルライタ作れってか…無理…
あと、金を詰めば AVR Dragon でもとに戻せるらしいがこのためだけに買いたくない…

ググりました

実際高電圧パラレルライタの作例は皆無で、とても作る気にはなれません。配線数めちゃ多いし、制御すべきピン多すぎるし。
ということで、どなたかそれっぽいものを作っているモノを探してみることに。するとこちらにATmega48,88,168リセッターなるものが。

ありがたくこちらを採用させていただくことにしました。328P はこれらとピン・機能がコンパチだしできるやろ、と言った感じです。このリセッターはPC側からは何も操作せず、ただただ ATmega ちゃんにターゲットのヒューズリセットをパラレルで行ってもらうと言うものになります。もちろんプログラムの書き込みは事前に必要ですがね。
作者様では ATmega88 をマスタに使っているらしいですが(リンク先回路図参照)、僕は持ち合わせがなかったので ATmega328P を用いることにしました。という訳で配布されているプログラムをダウンロードしてコンパイルします。

$ avr-gcc -mmcu=atmega328p mega168reset.c -O0 -o mega168reset.elf
$ avr-objcopy -O ihex mega168reset.elf mega168reset.hex

1行目でまずバイナリを生成。2行目でそれを書き込みができる hex ファイルに変換しています。後はマスタとなる ATmega328P に書き込みです。
そのあとはエターナル配線地獄です。回路図の通りちゃんとやりました。また、僕はリセット回路を作るのが面倒だったので、12Vを直接RESET端子に印加してしまいました。電源はまず 5V を USB からとって、12V は MAX662A というものを使って(5V から 12V への変換。3.3V からでは無理)やりました。配線はこんな感じにトチ狂ってます

重要な点として、昇圧モジュールの出力と電源ラインにパスコンを忘れないということです。このせいで何度もヒューズリセットに失敗しました。やはりこれらは舐めてはいけない。パスコンを入れた後は何度やってもヒューズリセットが成功していましたね。あと、作者様の環境に合わせるため、マスタの ATmega328P は 内部クロック動作かつクロック8分周、あとオマケでウォッチドッグタイマとブラウンアウト検知を無効(LOW: 0x42, HIGH: 0xDF, EXTENDED: 0xFF) としました。

あとは説明通りにマスタのスイッチのピンを Low に下げるとヒューズリセットが一瞬で行われます。マスタに付けた LED がピコピコ点滅せずに点灯したら完了!!

復旧

というわけで avrdude にて読ませた所、応答が帰ってきました。やったね!

この後、我ながら馬鹿だなぁと思うのですが、自作ライタである avrNerd にてヒューズバイトを書き換え、内部発振の分周なしとしました。もちろん書き換えは成功しましたよ。そして今現在平和にLチカ出来ています。これで後輩に土下座しないで済む。やったぁ…