Atmel studioがクソ重い。
Eclipseは使い物にならない。
それにプログラミング作業は慣れた*nix系でやりたい。
仕事場から暇を見つけてはsshを家に張ってマイコン開発に勤しみたい。
もちろん可能だ。
スムーズにいけば10秒で導入できる。
必要なパッケージを導入
binutils-avr gcc-avr avr-libc avrdude
binutils=avr、gcc-avr、avr-libcは名前の通りavrマイコン向けのプログラミングに必要。
avrdudeはライターを制御する。
だいたいのディストリでapt-get
できる。
sudo apt-get install binutils-avr gcc-avr avr-libc avrdude
avrdudeを試す
今回は、Atmel AVR ISP mkIIとAtmel ATmega328Pを使用する。
マイコンにmkIIを繋ぎ、usbポートにmkIIを繋ぐ。
mkIIはVccを供給しないので、別途電源を確保する事。
次のコマンドを入力する。
sudo avrdude -c avrisp2 -P usb -p m328p -v
詳細はman
で確認する事。
正しくmkIIが動いていれば、メモリ領域の統計情報等が表示される。
ubuntu等では、デフォルトではusbデバイスへのアクセスにroot権限が必要。
この設定の変更については次の節を参考。
usbデバイスの権限を変更する
sudo
する手間を惜しまなければこの節は必要ない。
権限を変更するためには、udevを利用する。
udevはLinuxにおけるデバイス管理ツール。
udevはハードウェアの追加や削除を検知してイベントを発行し、ユーザーは各イベントに対する動作を設定できる。
今回の場合は、mkIIが追加された時に権限を変更すれば良い。
そのために次のudevルールを追加する。
sudo vim /etc/udev/rules.d/60-avr.rules
内容は以下の通り
SUBSYSTEM!="usb", ACTION!="add", GOTO="avrend"
ATTR{idVendor}=="03eb", ATTR{idProduct}=="2104", MODE="0666"
LABEL="avrend"
意味は「usbデバイスが追加された時に、追加されたデバイスのベンダーIDが"o3eb"(Atmelに対応)かつ、プロダクトIDが"2104"(mkIIに対応)ならば、権限を"0666"に設定」
mkII以外のライタを扱いたい時は、udevinfo
やudevadm
によってidProduct
を確認する事。
usbデバイスの場合は/sys/bus/usb/devices/の中にデバイスファイルがある。
権限をより細かく設定したい場合は、udevルールについて調べる事。
Cプログラムをコンパイルする
avr-gcc -mmcu=atmega328p ./test.c -o ./test.out
プログラムを書き込む
avrdude -c avrisp2 -P usb -p m328p -U flash:w:test.out:e -v
意味は、「flashメモリにelfフォーマット(e)のtest.outファイルを書き込む(w)」。
昔はhexファイルしか書けなかったけど、今はelfを与えるだけで内部的に変換してくれる。
ボーレートの細かい設定等をしたい人はmanを参照。
その他
サポートされている部品のリストを表示するには
avrdude -p ?
サポートされているライタのリストを表示するには
avrdude -c ?
困ったらとにかくman
番外: clang_completeで補完する
通常のc/c++プログラムを補完する際との違いは2点ある。
1.clang_completeにgcc-avrが参照しているインクルードパスを教える。
2.マイコンの種類を教えるマクロをdefineする。
例えば、次の様なコマンドを.vimrcに食わせれば良い。
let g:clang_user_option = "-I/usr/lib/avr/include/ -D__AVR_ATmega328P__"
let g:clang_complete_macros = 1
avr/includeの場所はシステムによっては異なるので、avr-gcc -v等で確認する。
自分の使いたいマイコンに対応したマクロを調べるには、avr/io.h等を見ればわかる。