ATmega328 “P”の付いていない328にArduinoブートローダーを書き込む

ご注意:まだほとんどテストできていません。コレで「動かない」「マイコンおかしくなった」となる可能性もあります
ということで、ブートローダーというのはArduinoのためのものなのか、元々ATmegaで使っているモノなのかすら分からない状態でやっておりますが、とりあえず書き込み+exampleーBlinkまでできましたので。

1. Arduino ISPを編集する


avrdude: stk500_getparm(): (a) protocol error, expect=0x14, resp=0x14
avrdude: stk500_getparm(): (a) protocol error, expect=0x14, resp=0x01
avrdude: stk500_initialize(): (a) protocol error, expect=0x14, resp=0x10
avrdude: initialization failed, rc=-1
Double check connections and try again, or use -F to override
this check.
avrdude: stk500_disable(): unknown response=0x12

のようなエラーメッセージが出たので調べてみた所、あまりディスカッションになっていないこちらの最後の方に書いてありました。

bilibao@nbarizzi2:~/ELE/arduino-0022$ diff -u examples/ArduinoISP/ArduinoISP.pde /home/bilibao/sketchbook/fixed/fixed.pde
— examples/ArduinoISP/ArduinoISP.pde 2010-12-24 23:12:25.000000000 +0100
+++ /home/bilibao/sketchbook/fixed/fixed.pde 2011-01-12 01:10:41.373212997 +0100
@@ -54,7 +54,7 @@
pinMode(9, OUTPUT);
pulse(9, 2);
}

+int initSent=0;
int error=0;
int pmode=0;
// address for reading and writing, set by ‘U’ command
@@ -399,7 +399,8 @@
uint8_t ch = getch();
switch (ch) {
case ‘0’: // signon
– empty_reply();
+ if(! initSent) empty_reply();
+ initSent = 1;
break;
case ‘1’:
if (getch() == CRC_EOP) {

58行目あたりの「int error=0;」の上あたりに
int initSent=0;
を追加します(後で使う変数)。
次に402行目あたり、
switch (ch) {
case '0': // signon

の後の「empty_reply();」を消して

if(! initSent) empty_reply();
initSent = 1;

の2行を追加します。

2. シグネチャをちょっと変える

以上で最初のエラーは出なくなりましたが、「シグネチャ(シグニチャ?)が違うよ」というエラーメッセージが出ました。ATmega328とATmega328Pで違っていて当然です。
変えてしまってはいけない部分かと思いますが、とりあえず手元にあるのはPの無いATmega328なので、変更します。
こちらに書き込み時にチェックするシグネチャ関連の記述を発見。
MacOSXだと
/Applications/Arduino.app/Contents/Resources/Java/hardware/tools/avr/etc/arvdude.conf
に書かれている模様。
他のプログラムでATmega328のシグネチャを調べた所、「0x1e 0x95 0x14」でした。
ということで、上記ファイルの7081行目をコピー、コメントアウトしてPなし328のシグネチャにします。

#signature = 0x1e 0x95 0x0F;
signature = 0x1e 0x95 0x14;

3. 書き込む

通常通りの方法でBlankのATmegaに書き込みます。
「avrdude: stk500_getsync(): not in sync: resp=0x15」とか出ましたが、まあ、大丈夫かなぁ。LED光っているし。

4. シグネチャを戻す

とりあえずexampleのblinkを試そうとした所、また「シグネチャ違いますよ」と出ました。しかも(本来の)328Pのシグネチャが帰ってきていている模様。
IDE側が(書き換えられた)328のシグネチャと比較しているのでエラーとなっているようなので、本来の328Pのシグネチャに戻しました。

signature = 0x1e 0x95 0x0F;
#signature = 0x1e 0x95 0x14;

結論・備考

ATmega328なのにATmega328Pのシグネチャを提示してしまうのでバッタもんのようになってしまいましたが、とりあえず急場しのぎということで。
じゃあ、最初に出て来たシグネチャは誰が出したの?て気になってしまいます。
もともとブートローダーが書き込まれていた、ということであれば、Arduinoのソレは別に書き込まなくても良かったのでは、、なんて思ってしまいます(というあたりが初心者)。

追記
長時間運用はしておりませんが、イーサネットシールド+WebServer、Processing-USBシリアル-サーボモーター駆動、は動きました。