2015年9月5日土曜日

AVR コンパイルメモ -makefile を使わない-

Xcode つかってて、なんかbuildとかがうまく行かないこととか出てきた。使い方が悪いんやけど。。。
正直あんまりmakefileの中身とか理解できてないし、fuse bitの書き換えで、AVR何個か死んだし。
これ以上死んでもらうと困る・・・

ということで、makefileが何してるのかとかもちょっとだけ触れてみようと、makefileを使わずに、というか、Xcodeも使わずに、その辺のエディタを使って編集、ターミナルでたたいてbuild的なことをすることにした。

AVR : ATmega168p
CPU : 8MHz(内蔵)
プログラマ : AVR ISP MK2

まず、main.cからオブジェクトファイルを生成。main.oが作られる。
avr-gcc -Os -Wall -DF_CPU=8000000 -mmcu=atmega168p -c main.c -o main.o

次に、オブジェクトファイルmain.oから実行ファイル形式のmain.elfを生成。
avr-gcc -Os -Wall -DF_CPU=8000000 -mmcu=atmega168p -o main.elf main.o

(次に、既にあれば、main.hex ファイルを削除)
rm -f main.hex

次に、main.elfファイルからmain.hexファイルを生成。
avr-objcopy -j .text -j .data -O ihex main.elf main.hex

これで、AVRに書き込むためのファイル(main.hex)を用意できる。
プログラムのサイズを確認する場合は、次のように書く。
avr-size --format=avr --mcu=atmega168p main.elf

ちなみに、CrossPackAVRのmakefileがやってるのと一緒。

次に、書き込み。
AVRとつないでー、なんかその辺は適当に。
つなぎ終わって、電源入れたら、次のように書く。
avrdude -c avrisp2 -P usb -p atmega168p -U flash:w:main.hex:i

これで書き込まれる。今回、内蔵発振子を使って8MHzで駆動させるから、fuse bitも変更しないと行けない。 AVR calculator でググって、サイトでfuse bitを求めて、次のように書く。
avrdude -c avrisp2 -P usb -p atmega168p -U lfuse:w:0xe2:m -U hfuse:w:0xdf:m -U efuse:w:0xf9:m

ちなみに、デフォルトでは、プリスケーラが1/8になってて、1MHz駆動になってるらしい。fuse bitの中にそれを解除する所があるから、変更が必要。

これで終了。
ターミナルつかってると、なんかやってる感じでるよね。