2015年5月16日土曜日

AVRのヒューズをリセットしよう!(ATMegaxx8専用)

スーパーゴールデンウィークも終了しましたね、皆様いかがお過ごしでしょうか。

さて、今回の記事はちょっと長いので、まず序文をば。

Arduinoに多く使われていて、流通量も多いAtmelのATMegaシリーズは、全品にFlash EEPROMを採用していて、少々プログラムを書き損じてもAVRISP mkIIなどのICSPプログラマ(直列プログラミング)でチップを消去すれば何度でも修正が可能な点が魅力です。

Arduinoよりもマイコン寄りのプログラムを作って焼き込みたいときにも、Atmelから純正の開発ツール、Atmel studio6が提供されています。


しかしながら、マイコンの挙動を決め打ちする「ヒューズビット」の書き込みに誤った値を書き込んでしまうと、最早ICSP経由では書き込み出来ず、HVPP(高電圧パラレルプログラミング)といった手法で消去書き換えしないとアクセスできなくなってしまうのが痛いところです。しかもHVPPに対応したライタはSTK500, STK600, AVR dragonなど、どれも高価なものばかりです。

代表的な例(といっても筆者の例ですが)としては、SPIENヒューズビット設定項目の上の「DWEN(デバッグWIRE)」をプログラムしてしまうと、先に述べたように普通のライタでは書き込み、読み込みが不可能になってしまいます。
ちなみにAtmelの名誉(?)のために言っておきますが、デバッグWIRE機能はDragonと併せると非常に有用です。Atmel独自のプロトコルでコードの実行をトレースできます。誰かこの貧乏筆者にAVR  Dragonください。

こうなるとただの250円の燃えない、そして萌えない石ころになってしまいます。

でも、全国のMakerさん、Arduino使いさん、あきらめるのはまだ早いですよ!
Arduinoとブレッドボード、それに少々の電子部品で死んだマイコンを復活させる手段があるのです!
元ネタはこちら、MightyOhmさんの案まりす様の「構想100年」ブログ記事、そしてラジオペンチ様のブログ記事です。


それでは早速、死んだマイコンを復活させていきましょう。

用意するもの

  1. ターゲットのマイコン(Fuse bitを書き損じたチップ)
  2. NPNトランジスタ(2SC1815とか)1個
  3. Arduino
  4. ブレッドボード2枚
  5. ユニバーサル基板1枚(一番小さいサイズで大丈夫です)
  6. 抵抗10kΩ *2
  7. 抵抗1kΩ *2
  8. ジャンプワイヤ
  9. DC電源
  10. DCジャック
  11. 0.1uFセラミックコンデンサ
  12. 100uF電解コンデンサ
  13. スイッチ

8~12は人によっては要らない項目があるかもしれません。


まず、12Vの安定した電源を製作してください。筆者は下の写真のように、電源アダプタ(15V)から取った電源を、JRCの7812(78シリーズの正電圧レギュレータで12V出力なら何でも可。STでもOKだし、テスターが使える人はLM317で作ってもいいかも)という12V正電圧三端子レギュレータで降圧して12Vを得ました。

高電圧書き込みは普通の駆動電圧ではなく12Vを#RESETピンに送って、コマンドを発行してパラレルでリードライトを行う性格上(この方法は#WEに12Vを印加してA0~A16, D0~D7にコマンドを送信するといったROMのアクセスに似ています)、少なからずチップにストレスがかかりますので、電圧が不要になった時に遮断できるよう、スイッチを付けました。


次に、上記のMightyOhm氏のページの回路図のように、ターゲットとなるヒューズを書き損じたマイコンとArduinoを直結…するのですが、この回路は無駄に保護用の抵抗が多く、組み立てミスが起きやすいと思われるので、まりす様が独自に改良を加えてFritzingで書いてくださった実態配線図を利用します。

筆者はArduino nano 328P 5V 16MHzの互換機(中国製)をUnoの代わりに利用しました。
何故Nano互換機を利用したか、その理由は次の通りです。


  • 純正のUnoでやれば先駆者の成功例があるので安全パイだが、Unoの小さいレギュレータとFETにVinからの12Vが耐えられるか不安。
  • それに対して、皮肉にも安いNano互換機は裏面の電圧レギュレータに大きいものを使用しているので心なしか安心。
  • Unoを一つ買う値段でNano互換機が5つは買えるので壊れても泣く必要が無い。
  • 誰もやったことがなさそうなので、ここで発表する価値がある。



さて、実態配線図通りに配線すると、このようになります。


筆者は柔らかいジャンパワイヤが好きなので配線がごちゃごちゃしていますが、これであっています。

右上の白い小さなブレッドボードにターゲットのマイコンが入ります。白色の小型ブレッドボードの下部分が14,15番ピンになるように差し込みます。

Nano互換機は予めスケッチをコンパイルして書き込んでおいてください。
Arduinoのバージョンが1.6系列の方は、PROGMEMの扱いが変わりましたので、スケッチのコンパイルがうまく行きません。途中でavr-gccがコンパイルエラーを吐きます。

今回は328Pだけを修復したいので、ラジオペンチ様の改変バージョンスケッチを利用させていただきました。168や88を修復する場合はスケッチ内の対応するデバイスシグネチャを適宜書き換えてください。

Arduinoに使用されているAtmel ATMegaマイコンチップのデバイスシグネチャは以下の通りです。
ATMega328 : 1E 95 0F
ATMega168 : 1E 94 06
ATMega88  : 1E 93 0A

Nano互換機のVin、Gnd端子に電源の12V、Gndを接続し、USBケーブルを繋ぎ、Arduino IDEからシリアルモニタを開きます。

このような画面が出た場合はどこかでミスがあります。
速やかに12Vを遮断して、マイコンの位置と配線をチェックしてください。


D→Enterを押して、この画面が出ていればひとまずOKです。



ダイアログに従って、チップ消去とヒューズビットを元に戻しましょう。
手順としては
c ENT チップ消去
y ENT はい
(r ENT) Fuse bit確認
w ENT Fuse bit書き込み
y ENT はい
r ENT Fuse bit書き込み
です。



これで、購入当初と同様とまではいかないけれども、まっさらなATMegaチップに生まれ変わりました。


あとは、Arduino IDEなりAtmel studioなりでブートローダーを書き込んであげれば元通りのUnoに搭載されているATMegaチップの完成です。書き込み装置はDuemilanoveのFTDI Bit-bang法を用いたライタなり、USBaspライタなり、純正のAVRISP mkIIやstk500/600/ AVR Dragonライタなり、Arduino ISPライタなりご自由に。

ちなみに筆者はこれで書き込みました。

ん?UnoにはFTDIチップが載ってないのにどうして書き込めたのかって?
それはまた次回。(←


お疲れさまでした。
注意:NanoやLeonardo, Megaなどの表面実装型ATMegaチップのヒューズを書き間違えると修復は非常に困難になります。ご注意ください。


参考サイト・文献
Atmel ATMega48/88/168/328 datasheet pp.289-308.
ARDUINO-BASED AVR HIGH VOLTAGE PROGRAMMER, MightyOhm.

0 件のコメント:

コメントを投稿