USB接続のUSBasp AVRライターで、秋月で購入したブートローダーの書き込まれていないAtmega328P-PUにブートローダーを書き込もうとしたら以下のエラーが出て書き込めませんでした。
avrdude: error: program enable: target doesn't answer. 1
avrdude: initialization failed, rc=-1
Double check connections and try again, or use -F to override
this check.
詳細情報の表示
このメッセージだけでは情報が少ないのでメニューバーの「Arduino」>「Preferences…」の環境設定画面で、「より詳細な情報を表示する:コンパイル 書き込み」を有効にすると
Arduino:1.8.13 (Mac OS X), ボード:"Arduino Uno"
/Applications/Arduino-3.app/Contents/Java/hardware/tools/avr/bin/avrdude -C/Applications/Arduino-3.app/Contents/Java/hardware/tools/avr/etc/avrdude.conf -v -patmega328p -cusbasp -Pusb -e -Ulock:w:0x3F:m -Uefuse:w:0xFD:m -Uhfuse:w:0xDE:m -Ulfuse:w:0xFF:m
avrdude: Version 6.3-20190619
Copyright (c) 2000-2005 Brian Dean, http://www.bdmicro.com/
Copyright (c) 2007-2014 Joerg Wunsch
System wide configuration file is "/Applications/Arduino-3.app/Contents/Java/hardware/tools/avr/etc/avrdude.conf"
User configuration file is "/Users/USERNAME/.avrduderc"
User configuration file does not exist or is not a regular file, skipping
(中略)
Programmer Type : usbasp
Description : USBasp, http://www.fischl.de/usbasp/
avrdude: auto set sck period (because given equals null)
avrdude: error: program enable: target doesn't answer. 1
avrdude: initialization failed, rc=-1
Double check connections and try again, or use -F to override
となって、「avrdude: auto set sck period (because given equals null)」というメッセージが追加されています。SCKの周期を自動設定した後エラーが出ているように見えます。
エラーメッセージで検索
とりあえず「avrdude: error: program enable: target doesn’t answer. 1」で検索するとArduinoのフォーラムに
のような投稿がありました。これによると「それが未加工のチップであり、プログラムされていない場合、USBasp はおそらく遅い SCK を設定する必要があります。 通常はJP2を閉じることですが、機種によって異なります。」とあります。
そもそもこの投稿のUSBasp基板が同じものを使っているのかもわかりませんが、調べてみるとアマゾンの RASBEE 51 AVR Atmega プログラム USBaspという商品の説明に回路図があって、JP3がSlow SCKの選択ピンになっています。
さらに、Arduino IDEが出力した詳細のメッセージにあるUSBaspの公式サイトhttp://www.fischl.de/usbasp/に回路図がありました。
この回路図ではJP1がSlow SCKの選択ピンになっています。
Slow SCK設定で書き込み
ということで、どうもSCKの周期が関係していそうです。手持ちのUSBasp基板のJP3にピンヘッダーを半田付けしてショートピンを挿入して書き込みをしてみます。
すると、無事ブートローダーを書き込むことができるようになりました。
すでにプログラミングされたチップではJP3はオープンのままで書き込みができました。未書き込みチップではJP3をショートしてSlow SCKにしないと書き込めないという理由はわかりません。まぁ、そういうものだということでひとまず良しとしましょう。
書き込み時間
USBaspを使ってArduinoのスケッチの書き込みもできます。たまたまSlow SCK設定をしたままで、約20Kbytes程度のプログラムの書き込みをしたらやたらと時間がかかりました。そこで書き込み時間を見てみると
- Slow SCK : 170.81s(Writeing) + 99.74s(Reading) = 270.55s
- Normal SCK : 9.7s(Writing) + 5.51s(Reading) = 15.21s
となって約18倍の時間がかかってます。Slow SCKに設定するのは未書き込みチップへのブートローダーの書き込み時にのみ使うということですね。