2015年8月19日水曜日

AVR開発環境設定 for Ubuntu 15.04 [ AVR ]

久々にAVRで電子工作をしたくなった・・・・
前はAVR Studioを使ってたけど、最近はWindowsよりUbuntuばっかり使ってるのでLinuxで環境設定するのだ。
で、世の中の人に聞いてみると・・・
Kenichiro MATOHARAさんが、スライドで紹介してくれていました。感謝!

必要な環境として
  • コンパイル環境
  • AVR書き込み環境
の2つを整える必要がある。

コンパイル環境

コンパイルするにはコンパイラとして gcc-avr、プログラミングツールに binutils-avr、ライブラリに avr-libcが必要なようだ。
コンパイル環境のインストール# apt-get install gcc-avr binutils-avr avr-libc

AVR書き込み環境

AVRに実際に書き込むためのプログラムには avrdudeを使いましょうって事ですね。
ここでは、書込み器には AVRISPmkIIを使うよ。
AVR書き込み環境のインストール# apt-get install avrdude

サンプル作成

ひとまず、そこらにあったATtiny2313で作ることにする。
hello.c/* LED点滅プログラム */

#include <util/delay.h>
#include <avr/io.h>

int main(void)
{
        DDRB = _BV(DDB0);

        for(;;){
                PINB = _BV(PINB0);
                _delay_ms(500);
        }

        return 0;
}

コンパイル & リンク

ATtiny2312用にコンパイル & リンク$ avr-gcc -g -O2 -mmcu=attiny2313 -DF_CPU=1000000UL hello.c

今回は ATtiny2313を使ったので、オプションの -mmcu に attiny2313 を指定する。
後は、delay.hを利用するので、 -Dオプションで、F_CPU を 1MHzに設定し、最適化は程々の-O2にする。ちなみに-gはデバッグ情報を付加するためのもの。
コンパイルが成功すると、a.out が出来上がるので、これを hex形式にする。
a.outをhex形式に変換$ avr-objcopy -j .text -j .data -O ihex a.out hello.hex

AVRへ書き込む

まずは、ヒューズビットを初期化する。こうすると、内蔵クロックは8MHzで8分周になる。つまり、1Mhzですな。
ヒューズビット初期化# avrdude -e -c avrisp2 -p t2313 -U lfuse:w:0x64:m -U hfuse:w:0xdf:m
オプション-eチップ消去-c書込み器の指定で今回は AVRISPmkII なので avrisp2を指定する。(-cオプションの後に適当な名前を入れれば、書込み器のリストが表示されるので参照の亊)
また、-pオプションで、デバイスを指定する。今回は ATtiny2313なので、t2313となる。(-cオプションで書込み器のみを指定すれば、デバイスの一覧が 表示されるので参照の亊)
最後に -Uオプションで書き込む内容を指定するが、ここではヒューズを書き換えるので、ヒューズ名(lfuse,hfuse)と書き込み指定(w)とその値(0x64,0xdf)、そして即値なのでimmediate mode (m)を指定している。

ここから、いよいよプログラムの書き込みになる。さっきの -Uオプションを使って書き込むのだ。
プログラム書き込み# avrdude -e -c avrisp2 -p t2313 -U flash:w:hello.hex
ま、Flashメモリ(flash)に書き込む(w)指定と、ファイル名(hello.hex)を記述すればよし。

最初は上手くいかなかった・・・

なんと、ターゲットに電源を供給してませんでした。。。。アホすぎ。
そして、つぎの壁が立ちはだかりました。
エラーメッセージavrdude: Device signature = 0x010305
avrdude: Expected signature for ATtiny2313 is 1E 91 0A
といった、エラーが出てしまった。シグネチャが違いすぎます。。。。
いろいろ調べてみたら、AVR FREAKSで、似たような案件について教えてくれている人たちを発見!!
なんか、スピードを遅くしろって言ってるね。
そういえば、ここで使ってる ATtiny2313は、前に何か書き込んでヒューズビットの設定も書き換えた覚えがあるな。。。。
ビットレート変更# avrdude -e -c avrisp2 -p t2313 -B 10
というわけで、-Bオプションで10くらいに設定したら、解決しました! めでたし、めでたし。
(案の定、クロックが4MHzになってたからかな。)

ふんどしの持ち主

2 件のコメント:

  1. 大変参考になりました。
    ところで、hello.c の4行目は avt/io.h ではなく avr/io.h ではありませんか?

    返信削除
    返信
    1. ははは。。。本当ですね。
      きちんと修正させていただきました。
      このページを見てくれる人がいるとは思ってなかったもので、適当に書き留めてました(笑)
      本当にありがとうございました★

      削除