ENYUKI 猿遊記(えんゆうき)

2024年10月10日

ヒューズ・リセッター(パラレル・ライター)

1. 参考にしたWEB記事:ラジオペンチさんの「ATmega328P用のヒューズリセッターの製作」http://radiopench.blog96.fc2.com/blog-entry-563.html
ATmega328P 和訳データシート(184頁~) http://aitendo3.sakura.ne.jp/aitendo_data/product_img/microcontroller/Colorduino/ATmega328P.pdf

2. 作成した基板 Arduino UNO 用のユニバーサル基板上にゼロプレッシャーICソケットとDC-DCコンバータ(MAX662 DIPモジュール)を使い作成する。 回路図  Arduino UNO R3用ソース
 注意した点:DC-DCコンバータに接続するコンデンサの基本は C1, C2は 0.22μF、5V入力と12V出力部分は 4.7μFであるが、出力電圧を安定供給する為に C1, C2 部分は積層セラミックの1μF、5V入力と12V出力部分は22μFを用いる。
 Arduino UNOの入出力端子は全て使っているので、自動処理結果を表示するLEDを制御する端子はBS2で使用しているD10を共用する。(その為、処理中にLEDの点滅が入る)
また、Auto Mode / Manual Mode 切替SWは、シリアル通信で使っているTx端子(D1)を共有する。この為、プログラムの初期処理の部分にシリアル通信の初期化をする箇所があるが、SWの状態はその前に読み取るようにしている。また、SWとD1の間に22kの抵抗を入れているが、これはSWの入り切りの状態がシリアル通信のTxになるべく影響を与えないように入れている。
 当初、47kの抵抗を入れていた。この時のD1端子の電圧は、SWを5V側に接続時:3.7V SWをGND側に接続時:2.0V になっていた。Arduino(ATmega328P)のデジタル入力のスレショールド電圧は、Highレベルが2.7V以上 Lowレベルが2.1V以下なので、Lowレベルの余裕が0.1Vと極端に少ない。
それで、22kの抵抗に変えた。変更後のD1端子の電圧は、SWを5V側に接続時:3.7V SWをGND側に接続時:1.5V になり、Lowレベルの余裕が0.6Vになった。

3. 使い方 ヒューズリセットの対象となるATmega328Pを作成した基板のICソケットに入れ、それをArduino UNO R3 に載せる。作成した基板のAuto/Manualの切替SWを予め設定する。(Arduino UNO はまだPCに接続しない)
① PCでArduino IDEを起動し、前項で示したソースをコピーし、新規スケッチとして登録し、コンパイルする。コンパイルでエラーがないことが確認できたら、作成した基板を搭載したArduino UNOをPCに接続し、スケッチを書き込む。
② Arduino IDEでシリアルモニタを起動する(9600baud、改行選択は[LFのみ]or[CRおよびLF]のいずれかを選択)
③ Auto/Manual切替SWがManualの場合、元ソースの基本コマンド以外に電源チェック用コマンド1~3があり、5V 12V検査用端子で電圧を検査できる。(1:VCC[5V]をON, 2:RST[12V]をON, 3:VCC[5V]をON 且つ RST[12V]をON)
 なお、Wコマンドは、電池駆動用のヒューズ設定(Low:0x42 High:0xde Ext:0xfe)にしている。この為、Aコマンドを追加し、Arduino用ヒューズ設定(Low:0xff High:0xde Ext:0xfd)ができる。
④ Auto/Manual切替SWがAutoの場合、電池駆動用のヒューズ設定を自動的に行う。自動処理開始時、LEDの長い点灯(約0.8秒)を1回行い、処理を開始する。処理が正常終了したら、長い点灯を2回行う。そして2秒程度消灯した後、長い2回点灯を繰り返す。
自動処理が途中でエラーになった場合、LEDが短い点灯(約0.2秒)を複数回行う。そして2秒程度消灯した後、同回数の短い点灯を繰り返す。
 短い点灯1回:ソケットに入れたチップのシグネチャーがATmega328Pではない(自動処理対象のチップではない)
 短い点灯2回:ヒューズの下位バイトが書き込んだ値(0x42)にならない
 短い点灯3回:ヒューズの上位バイトが書き込んだ値(0xde)にならない
 短い点灯4回:ヒューズの拡張バイトが書き込んだ値(0xfe)にならない
 短い点灯5回:ロックビットの値が書き込んだ値(0xff)にならない
※スケッチを書き込み済であれば、Autoの場合、PCに接続しなくてもヒューズリセット対象のATmega328Pをソケットに入れた後、ArduinoのUSBケーブルをUSB電源に接続すれば、電池駆動用のヒューズ設定を自動的に行える。

※ 問題はヒューズの色々なビットパターンを試しに書き込み、それを正しくリセット処理できるかテスト中に発生した。
下位バイトのテストが終わり、上位バイトのテストでパターン0xAA(DWEN=0:デバッグWIRE機能許可、WDTON=0:ウォッチドッグタイマ常時有効、BOOTSZ=01:ブートローダー容量 2048ワード、BOOTRST=0:リセットベクタ選択)を書き込んだ後のリセット処理が正常に動作しなくなった。
 リセット後のチップの読出し値は、signature:10103 Low:0x05 High:0x05 Ext:0x05 Lock:0x05 となる。Manual ModeでErase処理を行うと、10~20秒程度処理が続きその後モニタが入力待ちに戻る。Erase処理中のRST端子(12V)とVCC端子(5V)の電圧をテスタで確認すると、 12VあるはずのRST端子は4.6Vになっている。5VあるはずのVCC端子は3.9Vになっている。現在の設計は、12Vラインは最大0.5mA、5Vラインは最大20mAである。
12Vのラインは1kΩの抵抗を経由してRST端子に接続しているので、7.4mAの電流が流れ込んでいる。リセット対象のチップが壊れたかそれとも12Vの供給方法を変え20mA程度まで供給できるようにするべきか?
5VのラインはArduino UNOのデジタル出力をそのまま使っているので、ここも供給方法を変え50mA程度まで供給できるようにするべきか?

> TOP