AVRマイコンで、DWENを0にしちゃった!
AVRマイコンをArduino Unoなどで素直に使っている分には、本当に使いやすい便利なチップですが、素のAVRとして見た時にはFUSEビットの設定が本当に何年使ってても迷子になる厄介なものです。他のチップにもいろいろありますが、Arduinoとして使うという前提がないので最初に設定すれば後は触ることがないです。AVRも最初から素のAVRとして使うなら同じなのですが、ついつい欲が出てきて、Arduino と NON Arduino 素のAVRとしての使い方を行き来するとはまります。
さて、素のAVRではAtmel ICEを接続することが多いと思います。EEPROMへの焼きこみだけでなく、DebugWireという特殊なデバッグモードが使えます。この際DWENビットを0にしてDebugWireモードに突入しますが、そのまま1に戻さずにデバッグモードから抜けてしまうと、ISPでは2度とチップとつながらなくなります。高価なEEPROMライタをお持ちならなんとかなりますが、安価なシリアルのライタでは太刀打ちできません。
というときに、ネット上を見れば多くの方々がハマってしまった後、簡易ライタを作成して復活させた記事があります。まあその時間がもったいない業務でチップを使われているなら、素直に捨てるのが正解だと思いますが、一度やってみることにしました。
今回は、まりすさんが公開されている「ATmega48/88/168/328用のヒューズリセッターをArduinoで作る」 を参照させていただき実行してみました。
運良く12VのACアダプタやNPNのトランジスタや抵抗などの部品を持っていたため回路を構成するのは全く問題ありませんでしたが、やはり日頃電子部品を触っていない方にとっては敷居が高いなあと感じました。結論から言ってしまえば、新品のATmega328Pを購入されるのが早くて確実でした。
それでもやってみたい方は、まりすさんのページの解説のままでほぼ大丈夫です。
一点、以下の赤枠のconstを追加しないとコンパイルエラーになるはずですので修正します。
あと、間違いそうなのが、シリアルモニタを9600BPSにすること位でしょう。
AtmelICEが接続できるのが確認できればもう安心です。そのあとのFUSE設定は下に転記させてもたった内容に設定すればよいかと思います。
==================================================
Auduino 特にUNOはいろんな場面で実験でさっと使うには非常に便利ですが、それゆえにArduino 純正のATmega328Pから変更したチップや、元のボードに乗ってたものではないAVRをArduino化する際には、FUSEビットの設定が何が何やらよくわからなくなります。
スイッチサイエンスさんがまとめてくれているページがありますので転記させていただきます。
出典:スイッチサイエンス https://trac.switch-science.com/wiki/ArduinoFuse
Arduinoのヒューズ設定
AVR Studo 4やAtmel Studio 6を使う場合の設定です。
Uno
- ATmega328P
- ヒューズ
- EXTENDED = 0xFD
- HIGH = 0xD6
- LOW = 0xFF
- LOCKBIT = 0xCF
- プログラム optiboot_atmega328.hex
Duemilanove 328
- ATmega328P
- ヒューズ
- EXTENDED = 0xFD
- HIGH = 0xDA
- LOW = 0xFF
- LOCKBIT = 0xCF
- プログラム ATmegaBOOT_168_atmega328.hex
Duemilanove 168
- ATmega168
- ヒューズ
- EXTENDED = 0xF8
- HIGH = 0xDD
- LOW = 0xFF
- LOCKBIT = 0xCF
- プログラム ATmegaBOOT_168_diecimila.hex
ATmega 328 (8MHz 内部クロック)
- ATmega328P
- ヒューズ
- EXTENDED = 0xFD
- HIGH = 0xDA
- LOW = 0xE2
- LOCKBIT = 0xCF
- プログラム ATmegaBOOT_168_atmega328_pro_8MHz.hex
Nano 3.1
- ATmega328P
- ヒューズ
- EXTENDED = 0xFD
- HIGH = 0xDA
- LOW = 0xFF
- LOCKBIT = 0xCF
- プログラム ATmegaBOOT_168_atmega328.hex