標高+1m

Don't be rational.

ブートローダが書き込まれたATmega単体を内部クロックで使おうとする時に起きる問題とその対処

f:id:ympbyc:20170412002259j:plain

Arduino UNOに乗っているATmega328pをUNOから外して、内部クロック(8MHz)を使った最小構成で動かす実験がしたくて手こずってた。

Arduino - ArduinoToBreadboard これのMinimal Circuitってやつ。

  • プログラマ用のUNOにArduinoISPを書き込む
  • 上記ページからbreadboard-1-6-x.zipを拾ってきて展開してhardwareに入れる
  • ISPの6本線を配線する
  • BoardをATmega328p on a breadboard (8MHz)に設定する
  • ProgrammerをArduino as ISPにする
  • ブートローダを焼こうとするか、スケッチをUpload Using Programmerしようとする
  • エラー Yikes! Invalid device signature 0x000000

これ結構いろんな人が困ってるみたい。問題は、クロックソースはfuseビッツで設定するもので、UNOから外してきたATmegaにはUNOのブートローダが焼きこまれたタイミングで16Mhzの外部クロックを使うように設定されているということ。水晶なしではクロックがない状態になって書き込みができない。

というわけで、ATmegaを外してきたUNO(抜け殻)から水晶を借りることにする。

f:id:ympbyc:20170412002259j:plain

  • 抜け殻のソケットとATmegaの、9番と10番、あとGNDをそれぞれつないでやる
  • fusesを設定するために一回ATmega328p on a breadboardのブートローダを焼き込む
  • もう抜け殻は用済みなので外してOK
  • あとは普通にArduino as ISPでスケッチをアップロードすれば動く

今回はブートローダなしのAVRマイコンをそのまま使う予備実験のためにこんなまどろっこしいことしたけど、ブートローダが焼いてあるマイコンArduinoスケッチをアップロードしたいだけならこれの方が簡単: ArduinoでUSBシリアル変換してESP-WROOM-02に書き込む – Mechanic Note

焼き込み/書き込み/アップロード フィーリングで使い分けましたがFTDI使わないので全部同じ意味です。