2017年9月
          1 2
3 4 5 6 7 8 9
10 11 12 13 14 15 16
17 18 19 20 21 22 23
24 25 26 27 28 29 30

最近のトラックバック

« bitDuino用フルカラーLED(RGBLED)ライブラリを作りました。 | トップページ | WaveシールドをArduino MegaやArduino Leonardoで使える様にしてみた »

2014年5月21日 (水)

ATmega48/88/168/328用のヒューズリセッターをArduinoで作る

 Arduinoにも使われているAtmelのAVRマイコンは、6本線のISP接続で簡単にプログラム転送などが出来るのですが、クロックソースを設定するヒューズビットの値を間違って書込んだりすると、ISPでは中々回復するのが難しい事態に陥る事が有ります。そんな時の救世主としてヒューズリセッター(その名の通り、ヒューズ設定を出荷時状態に戻す)という装置が有ります。今回は、 「Arduino-based AVR High Voltage Programmer」をベースに必要な時に簡単に組めて、なおかつ動作の確認をしやすくしたものを作ってみました。

 まずはArduinoに次のファイルをダウンロード・解凍し、スケッチをアップロードして下さい。

 その後、一旦Arduinoをパソコンから外し、回路の組み立てをします。

■材料
  • ヒューズリセットしたいAVRマイコン(ATmega48/88/168/328)チップ
  • Arduino (テストはUnoで行っていますが、他でも大丈夫なはずです)
  • 12V電源
  • ブレッドボード
  • NPNトランジスタ(テストでは2SC1815を使いました)
  • 1kΩ抵抗 x 2本 (R1,R4)
  • 10kΩ抵抗 x 2本 (R2,R3 ※トランジスタに合わせて1kΩ〜10kΩ程度で調整して下さい)
  • ジャンパーワイヤ 適宜

■回路図
Ez_hvfuse_schmatics_1024

 簡単に作れる様に保護抵抗は最小限にしました。D0,D1はシリアルモニタと通信する為に空けてあります。そのためピン数が足りないのでPAGELはプルダウン固定ですが、FlashやEEPROMのプログラミングをしない仕様なので問題有りません。

■実態配線図
Ez_hvfuse_ecb
こちらはECB配列のトランジスタ(2SC1815等)を使った場合

Ez_hvfuse_ebc
こちらはEBC配列のトランジスタ(2N3903等)を使った場合

もちろんブレッドボードは図の様な小型な物でなくてもかまいません。

 回路の組み立てが終わったら間違いないかチェックし、パソコンと12V電源を接続します。
 それからArduino IDEを立ち上げ、シリアルモニタを出します。シリアルモニタの下の設定は「CRのみ」(「改行なし」以外なら他でもOK)「9600bps」を選択します。
Ez_hvfuse_screenshot

 出て来たメッセージに「D」をタイプしてEnterキーで送信するとチップの型番を自動判定してくれます。ここで対象のチップが見つからないとメッセージが出た場合はただちにArduinoから12V電源とUSBケーブルを抜いて回路のチェックをして下さい。
 正しくチップが認識されたら、ヒューズの規定値書込みコマンド「W」を送信→確認の為の「Y」を送信します。するとチップに出荷時のヒューズが書込まれます。
 最後に「R」を送信して、ヒューズが正しく書込まれているか確認して下さい。
 もし、Lock bitsがFF以外になっていて、ヒューズ設定が書込まれない場合、「C」コマンドでチップ全体のクリアが出来ます。ただしLock bitsだけでなくFlashやEEPROMの内容もクリアされます。これでヒューズビットの書き換えが出来る様になるので、再度「W」コマンドを実行します。
 その他、「L」「H」「E」「K」コマンドで、ヒューズビットやLock Bitsの値を指定して書込む事も出来ます。

 普段はほとんど使う必要の無いヒューズリセッターですが、いざと言う時に欲しくなりますよね。なのでArduinoを使ってなおかつ正しく動作しているかをモニタしながら作業出来る様に構成してみました。

« bitDuino用フルカラーLED(RGBLED)ライブラリを作りました。 | トップページ | WaveシールドをArduino MegaやArduino Leonardoで使える様にしてみた »

Arduino」カテゴリの記事

コメント

お世話になります。
TQFPのATMEGA328P-AUにARDUINOのブートローダーを書き込もうとしている者ですが、情報過多で困っています。
貴方のフューズリセッターは専用機として作成しました(ブレッドボードの使用をやめただけです)、TQFPの方は、秋月の変換基板に半田付けを行い40PのZIF型ソケットを介して、フューズリセッターに接続しています。一応フューズの値は見えて、「W]コマンドで書き換えもできましたが、このあとOptibootからシリアルモニタでATMEGA328を確認できました。これでブートローダーは書き込めたと思っていたのです。
ただこのあと、「BLINK]プログラムを転送しましたが、書き込めないエラーとなりました。
そこで、各々のフューズ値が書き込める「L」、「H」、「E」、「K」コマンドの使い方を教えてもらえませんでしょうか、よろしくお願いします。
お忙しいなかお願いします。

大野さん、コメントありがとうごさいます。
こちらのヒューズリセッターでは、ブートローダーの書込みは行っていません。間違ったヒューズ設定をしてしまってSPI方式のライターで書込めなくなった場合に、ヒューズ設定を既定のものに戻すためのものです。
ブートローダーの書込みには別のツールが必要ですね。
Arduinoをお持ちならArduino ISPを使ってArduino IDEからブートローダーを書込むのが楽でしょう。
http://n.mtng.org/ele/arduino/ArduinoISP.html や https://www.switch-science.com/catalog/929/ を参考にして下さい。

「L」、「H」、「E」、「K」コマンドはそれぞれ単独でヒューズ設定を書込むものです。コマンドをタイプ→書込みたい値を16進数2文字でタイプ→実際に書込むかどうかのY/Nをタイプと言った感じで使います。


お世話になります、大野です。
こちらの、情報をお知らせします。
Arduinoは1.05です。
PCのOSは、Win7と8.1を使っています。ブートローダーを書き込むのは、別のArduino、UNO型です(純正ではありません)
ブートローダーの書き込み方法もISP方式と、配線は同じでotibootでやり取りする
ようですが・・・
ISP方式での書き込みを行いますとデジタル13に信号が現れ細かい点滅から荒い点滅間隔になりますが10分ぐらいつづきます。(ここで止めてしまうのですが・・)
この状態が正しいのか分かりません。IDE上では正常に完了とでています。
ただ新しいプログラムの書き込みはできません。
BLINKソフトをいれると、その時は動きますが、タイマー間隔を1桁増減しただけで書込み不可となります。

またヒューズリセッターの「L」「H」「E」「K」の設定ですが、コマンド窓にLといれると
下のコメント窓にデーターを促されますが、たとえばFFといれ、リターンキーをおすと
’>FFと表示されたまま止まってしまいます

それきり何の問い合わせ、もしくは書き換えたという文も現れません。
コマンド窓も受け付けませんので、シリアルモニターを切断することとなります。
再度シリアルモニタを起動させ、「R」を入れると元々の値が表示されFFにはなっていません。 何が原因か分かりませんか。

それきり何の問い合わせ、もしくは書き換えたという文も現れません。
コマンド窓も受け付けませんので、シリアルモニターを切断することとなります。
再度シリアルモニタを起動させ、「R」を入れると元々の値が表示されFFにはなっていません。 何が原因か分かりませんか。
TQFP型の基板には16MHzの水晶をつけています。

Arduino IDE付属のモニターをお使いですよね。下のbaudrate設定の隣に改行コードの設定が有りますが、そこを「改行なし」以外にして下さい。多分、それで先に進むと思います。
また、一度書込みをした後に再度書込み出来なくなる現象は、書込んでいるブートローダーとヒューズ設定が合っていない(特にブートローダー領域のサイズ設定)場合が考えられますので、チェックしてみて下さい。
ちなみにArduino Unoのヒューズ設定は、
low_fuses=0xff
high_fuses=0xde
extended_fuses=0x05
です。(Arduino IDEのboard.txtより)
extended_fusesは05で書込んでも未定義部分のビットが立って読み出すとFDになりますが、それで大丈夫です。

おはようございます。大野です。
早速のお返事ありがとうございます。
コマンドの実行は動きました。
「改行コードの設定が有りますが、そこを「改行なし」以外にして下さい」
「CR,LF有り」に変更してみましたら全てが動きました。
どうもありがとうございました。
また何かありましたらよろしくお願いします。

こんにちは、はじめまして、ラジオペンチと申します。

この記事のチップリセッターを製作中ですが、スケッチをコンパイルすると以下のエラーが出てしまって自力で解決出来ないで困っています。

何かアドバイス頂ければ幸いです。以下はエラーメッセージのコピーです。
なお、chipData.h はスケッチのあるフォルダに置いています。

---------------------------------------------
Arduino: 1.6.1 (Windows 7), ボード:"Arduino Uno"

In file included from EZ_HVFuse_v1_03.ino:21:0:

chipData.h:16:29: error: variable 'chipList' must be const in order to be put into read-only section by means of '__attribute__((progmem))'

PROGMEM chipSpec_t chipList[]={

^

コンパイル時にエラーが発生しました。

ラジオペンチさん、コメントありがとうございます。
Arduino IDE 1.6.0以降でPROGMEMの扱い方が変わった様ですね。ちょっといじってみましたが、上手く改善出来ませんでした。
この部分は、今後の拡張時にSRAM(データメモリ)を節約するために入れてあるのですが、当面余裕ある様なので、PROGMEMを外して、chipSpec_t chipList[]={ にして使ってみて下さい。
あるいはArduino IDE 1.0.6を別途ダウンロードしてお使いになるのも良いと思います。

まりすさん、早速のご回答ありがとうございます。

PROGMEMを外すとコンパイラは通るのですがうまく動きませんでした。たぶんditectChip()の中などで、pgm_read_dword( ) とかやっているのが空振りになっているような気がします。

とりあえず初期化したいのはATmega328Pだけなので、chipListは使わずに値を決め打ちで動かすようにしたいと思います。ある程度まとまったら私のブログで記事にさせて下さい。

それと、後になってしまいましたが、大変参考になる記事、ありがとうございます。

あ、おっしゃる通りコンパイルは通っても動きませんね(^^;;
対処方法の記事助かります。よろしくお願いします。

今晩は、

おかげさまでうまくいったので記事にまとめました
http://radiopench.blog96.fc2.com/blog-entry-563.html

ありがとうございました。

おはようございます、早速中国製のArduino nano互換機と秋月の15V電源アダプタ、7812三端子レギュレータを用いてブレッドボード2枚と、ユニバーサル基板を使って書き換えてみました。無事成功しました。
プログラムはラジオペンチ様の改変Ver.を使いました。

私のヒューズビットを書き損じて(DWENをプログラムしてしまった(^^;))ISP経由で書き込み出来なくなったATMega328Pが見事に復活しました。
有益な情報、本当にありがとうございます。

ところで、このヒューズリセッタについてですが、Nanoでやる手順を私のサイトで紹介してもよろしいでしょうか?

ご面倒をおかけしますが、よろしくお願いします。

Shiva FEさん、こんにちは。
ATMega328P復活出来て良かったですね。手順もどうぞ公開なさって下さい。
ところで、Shiva FEさんのページを拝見しようと思った所、こちらの環境ではすぐにアフィリエイト勧誘のダイアログが出て「キャンセル」を押しても広告ページに飛ばされてしまいます。これは何か対策された方が良いかもしれませんね。

ラジオペンチさん、コメント公開が遅くなってすみません。
ちょっと見落としてしまっていました。
プログ記事もありがとうございました。

許可していただき、ありがとうございます。
広告の件ですが、アフィリエイト広告に「変なURIに飛ばされる広告」が混じっていました。早速ブロックしましたので、もう変なURIに飛ばされることはないかと思います。
(登録してしばらく経つと悪質になる広告もあるんですね…しばらく私のブログを編集してなかったので気づくのが遅れました、(^^;))

ご迷惑をおかけして申し訳ありません。

広告の件、お手数おかけします。
まだ勝手に飛ばされるダイアログが出る様ですね。

ガジェットのモールス信号変換ウィジェットを削除したら飛ばされるダイアログが出なくなりました。これでおそらく大丈夫…な筈です。
ご迷惑をおかけして申し訳ありません。

Shiva FEさん、ブログ見られました。ありがとうございます。お手数おかけしました。

いえいえ、こちらこそありがとうございます。
あのままだったら見れなかった状態が続いてたでしょうから寧ろありがとうございます(*^-^*)

はじめまして。

"ATmega48/88/168/328用のヒューズリセッターをArduinoで作ります”を、
掲載くださいまして、ありがとう、ございました。

 ひとつ、お伺い致しますが、Atmel社のcpuは、一度、ヒューズビットを、
書き込みますと、消すことが、できなく、それで、ヒューズ・リセッターと、言いわれます
ツールが、必要に、なりますのでしょうか、教えてくださいませんか。

  kawauchi

kawauchiさん、はじめまして。

ご質問の件ですが、Atmel社のAVRマイコンチップは配線も手軽なISP書込み機を使ってヒューズビットの書き換えを通常何度でもする事が出来ます。
ところが、それはそのような条件のヒューズビットを設定している場合で、書き換えの禁止を設定したり、発振器を繋いでいないのに外部発振器使用の設定をしてしまったりすると、ISPでの書き換えが出来なくなる事があります。
これは気をつけていてもうっかりやってしまう事が時折起こりますよね。懐に余裕が有る方なら、新たに生のチップを買ってくれば良いのですが、まだ使える物を捨てるのももったいないですから、そこでヒューズビットリセッターの出番となるのです。
と言う訳で、AVRマイコンを使う人が必ずしも必要になるというツールではありません。でもいざという時、有り合わせのモノで何とかしたい場合も有るでしょうから、Arduinoとブレッドボードなどでカンタンに構成出来るヒューズピットリセッターを構成してみたのでありました。

コメントを書く

コメントは記事投稿者が公開するまで表示されません。

(ウェブ上には掲載しません)

« bitDuino用フルカラーLED(RGBLED)ライブラリを作りました。 | トップページ | WaveシールドをArduino MegaやArduino Leonardoで使える様にしてみた »