JJ1WKN Log

自作や移動運用関連のログです。

avrdudeを使用してArduino as ISPでブートローダー無しで書き込むテスト

2015-10-22 | Tanukino
K3NG Arduino CW KeyerをなんとかATmega168Pで動かそうと検討していましたが、keyer_features_and_options.hで機能を限定しても16KBの壁をクリアすることができませんでした。
スケッチを解析して使用しない機能を削れば実現できそうですが、複雑な内部構造のため断念していました。

一方arduino IDEの環境も年々進歩しており、arduino-0023、arduino-1.0、arduino-1.0.5-r2、arduino-1.6.3の4種類をライブラリなどの環境により使い分けています。
先日 Arduino IDE 1.6.3でK3NG Arduino CW Keyerの機能を限定してコンパイルエラーしてみたところ、下のように16KBの壁に肉薄していました。
--
スケッチが プログラムストレージ領域の 15,726バイト (51%) を使用しています。最大は 30,720バイト です
--

コンパイラも進歩しているようで、サイズもだいぶ小さくなってきました。
プロセッサをATMega168Pに変更してコンパイルしたところ、コンパイルサイズは変わりませんが、ATMega168Pに書き込むことができません。
--
スケッチが プログラムストレージ領域の 15,726バイト (109%) を使用しています。最大は 14,336バイト です
--

ブートローダー無しで書き込めば、ブートローダーの分だけ余裕ができるので、書き込めそうです。
そこで、ブートローダー無しで書き込みできる環境が整っている Arduino IDE arduino-1.0.5-r2でコンパイルしたところ、コンパイルサイズが少しオーバーして書き込めそうにありません。
--
コンパイル後のスケッチのサイズ:17,190バイト(最大容量32,768バイト)
--

Arduino IDE 1.6.3環境でArduino as ISPを使用してブートローダー無しで書き込む方法を探してみました。
tadfmacさんのサイトArduino 1.6でATTiny85やATTiny44を開発できるようにしてみるの記事を見つけて設定してみました。
ようやく、ATmega168P/Int.8MHzでコンパイルできるようになり、思惑通りサイズ内に収まっています。
--
スケッチが プログラムストレージ領域の 15,730バイト (96%) を使用しています。最大は 16,384バイト です。
--

あとはArduino as ISPで書き込むだけですが、upload.toolが見つからないとのエラーで書き込むことができません。
何か設定が足りないようで、Arduino IDE 1.6.3環境でArduino as ISPを使用してブートローダー無しで書き込む方法は断念しました。

とはいうもののArduino IDE 1.6.3環境でコンパイルできるようになったので、hexファイルができているハズなので、これをAVRライターで書き込めば良さそうです。
最近はAVRライターとしてはArduino as ISPしか使用していなので、コマンドラインからavrdude.exeを使用して書き込む方法を探してみました。

しなぷすさんのArduinoISPを汎用AVRライタとして使う(1)に詳細な手順が掲載されています。
avrdude.exeはWinAVRのものを使うようですが、実績のあるArduino IDE arduino-1.0.5-r2から入手しました。
試してみた結果、avrdude.conf、avrdude.exe、libusb0.dllの3つのファイルを任意のフォルダーにコピーすれば動作しました。
コマンドラインで動作するので、バッチファイルを作っておけば毎回同じ設定で動作するので、便利です。

さてArduino IDE 1.6.3環境で作成されたHexファイルですが、コンパイルの最後に一時ファイルの場所が表示されます。
--
F:\arduino-1.6.3\hardware\tools\avr/bin/avr-objcopy -O ihex -R .eeprom C:\Users\wkn\AppData\Local\Temp\build6802101246601032149.tmp/k3ng_keyer.cpp.elf C:\Users\wkn\AppData\Local\Temp\build6802101246601032149.tmp/k3ng_keyer.cpp.hex
--
ここのhexファイルをコピーして使用すればOKです。
Tempフォルダには大量の一時ファイルが残っていたので、消しておきました。
ちなみにArduino IDE 1.7以降は自動的に削除されるようです。

というわけで、ATmega168PでK3NG Arduino CW Keyerが動作するようになりました。
ベースは2.2.2015101801で、以下の機能のみを実装しました。
#define FEATURE_COMMAND_BUTTONS
#define OPTION_PROG_MEM_TRIM_TRAILING_SPACES
#define OPTION_DIT_PADDLE_NO_SEND_ON_MEM_RPT

まだ動作確認をしていませんが、FEATURE_SLEEPを追加してもギリギリ行けそうです。
--
スケッチが プログラムストレージ領域の 16,264バイト (99%) を使用しています。最大は 16,384バイト です
--

FEATURE_POTENTIOMETERの追加は98%でOKでしたが、FEATURE_SLEEPを追加したらオーバーしたので、どちらか一方しか追加できません。
--
スケッチが プログラムストレージ領域の 16,198バイト (98%) を使用しています。最大は 16,384バイト です。
--

最新の画像もっと見る

コメントを投稿