Program Resource

開発者向け各種コード、アルゴリズム、リソース情報ライブラリ もしくはねふぁの覚え書き

※2020/7/4 スケッチ更新 v2.1(書き込み開始時のFuse設定判定スキップ)

以前aitendoで発売されているATMEGA328P-AUのチップにbootloaderを書き込む事が出来る QFPでいいの の紹介記事を書いた。

しかし、最近購入したATMEGA328P-AUにbootloaderを書き込んでもその後スケッチの書き込みが出来ない。

見ていると、bootloader書き込み後ゆっくり青色LEDが3回点滅している。何かが上手く行っていない様だ。

Arduino NanoをArduino as ISPとして設定し、PCからArduino Nano経由でQFPでいいの に設置したATMEGA328P-AUにbootloaderに書き込んだ所正常動作した。

色々調べた結果、チップのfuse設定が上手くできていない事が分かった。以前は問題なかったのに最近上手く行かなくなったのは恐らく出荷時のチップのfuse設定が変わったからではないかと思われる。

QFPでいいの を使ってbootloaderを書き込むのにoptifixのスケッチを利用しており、一応スケッチの target_normfuses 関数でfuseの設定はしているが、上手く動作していなかった。この中でlock、low fuse、high fuse、extended fuseの設定をしているが、lock以外設定が出来ていなかったのでfuseの設定毎にとりあえず10msのdelayを入れる事で正常に動作する様になった。

前の記事のOLED表示対応のスケッチに、下記改良を加えている。

  • fuseの書き込み改良(delay追加)。
  • fuse設定後に値を読み取り比較チェック。
  • fuse設定とbootloaderのデータをArduino IDE 1.8.12付属のデータに更新。

ファイルはこちら。

Arduino IDEからArduino as ISP等を使ったbootloaderを書き込む際に使われる情報は、Windowsであれば

C:\Program Files (x86)\Arduino\hardware\arduino\avr

のboards.txtに情報が書かれている。Arduino UNOであれば下記行にfuseやbootloaderのバイナリのファイルが書かれている。

uno.bootloader.tool=avrdude
uno.bootloader.low_fuses=0xFF
uno.bootloader.high_fuses=0xDE
uno.bootloader.extended_fuses=0xFD
uno.bootloader.unlock_bits=0x3F
uno.bootloader.lock_bits=0x0F
uno.bootloader.file=optiboot/optiboot_atmega328.hex

チップに書き込まれているbootloaderやfuseの情報はArduino as ISP等を使って、avrdudeコマンドで読み取る事が出来る。avrdudeコマンドは

C:\Program Files (x86)\Arduino\hardware\tools\avr\bin

のフォルダーにある。bootloaderを読み出す場合、

avrdude -C "..\etc\avrdude.conf" -v -v -p atmega328p -c avrisp -b 19200 -U flash:r:"c:\temp\arduino.bin":r -P COM8

の様にファイルにフラッシュイメージを取り出し、バイナリエディタで最後の方にbootloaderが書かれている事を確認できる。fuseは

avrdude -C "..\etc\avrdude.conf" -v -v -p atmega328p -c avrisp -b 19200 -D -u -U lfuse:r:con:h -P COM8
avrdude -C "..\etc\avrdude.conf" -v -v -p atmega328p -c avrisp -b 19200 -D -u -U hfuse:r:con:h -P COM8
avrdude -C "..\etc\avrdude.conf" -v -v -p atmega328p -c avrisp -b 19200 -D -u -U efuse:r:con:h -P COM8

で読み出せる。

Print Friendly, PDF & Email

コメントを残す

メールアドレスが公開されることはありません。 が付いている欄は必須項目です


*

CAPTCHA