Ubuntu 14.04.3 LTSでAVRマイコン開発

  • 13
    Like
  • 0
    Comment
More than 1 year has passed since last update.

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以外のライタを扱いたい時は、udevinfoudevadmによって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等を見ればわかる。