Linux上のPICのプログラム開発環境「piklab」を別記事で紹介しましたので、AVRのGUI開発環境(もちろんLinux上で使えるもの)についても簡単に紹介いたします。Linux上のAVR開発ツールは、クロスコンパイル環境としてGCC、ダウンローダとしてAVRDudeがあり、どちらも非常に多くのユーザーに支持されています。しかし、コマンドラインでの操作は私のような初心者にはとっつきにくく、また、GUI環境でのプログラミングという魅力ある要素を楽しむことが出来ません。
今回は、GUI開発環境の土台としてEclipseを使用して、AVR GCCのプログラミング環境をインストールしてみたいと思います。
ここでは、以下のソフトウェアをLinux(使用しているのはFedora12)にインストールして、AVRのソフトウェア開発環境を作っています。
AVR GCCは、GNU C CompilerによるAVRのクロス開発環境です。名称はCコンパイラですが、アセンブラのソースファイルを直接コンパイルすることもできます。内部的には、C言語のソースをアセンブリ言語(GNU Assembler)のソースに変換してアセンブルし、リンカにより結合させています。おおまかな、コンパイラ等ツールと入力ファイル、生成ファイルの関係図を下記に示します。
AVR GCC toolchainについては、
→ AVR GCC/AVR GCC Tool Collection (AVR Freaks)
AVR LIBCの詳細については、
→
AVR LIBC User's Manual (http://www.nongnu.org/avr-libc/user-manual/)
などを参照してください。
AVRDudeは、オープンソースのAVRマイコン用ダウンロード・ツールです。コマンドラインで動作しますが、GUI対応したものが色々とあるようです。今回は、EclipseからバイナリをターゲットのAVRにダウンロードするために使用します。
AVRDudeのホームページは → こちら: http://savannah.nongnu.org/projects/avrdude/
AVRDude以外にも様々な書き込みツールが存在しますが、AVR Eclipseで対応しているのは今のところAVRDudeだけのようです。
Eclipseのホームページはこちら:http://www.eclipse.org/
AVR Eclipse Pluginのホームページは こちら: The AVR Eclipse Plugin
AVR関連のGCCコンパイラ・ツール一式とダウンロード・ツールAVRDudeを、Linuxデスクトップから「ソフトウェアの追加」によりインストールします。今回導入したパッケージは下記の通り。
ちなみに、これだけ(+テキスト・エディタ)で、あとはビルド、ダウンロード用のスクリプトやmakefileを整えるだけで、コマンドラインからAVRの開発環境は出来上がってしまいます。
AVR GCCを用いて、C言語ソースが正しくコンパイルできることを確認します。簡単なソースを用意して(ここでは、ポートBに8ビットの出力をくり返すもの)、コンパイルしてみます。以下、動作例です。avr-gccでコンパイル、リンクしてELF形式のバイナリを生成し、avr-objcopyによりHEXファイルを作成、その後、確認のため、avr-objdumpで逆アセンブル出力をしているところです。 (AVRDudeの動作確認は、ターゲット準備のところで説明します。)
動作確認用ソースコード (avrgcctest.c)$ avr-gcc -O2 -Os -mmcu=attiny2313 -o avrgcctest.elf avrgcctest.c $ avr-objcopy -R .eeprom -O ihex avrgcctest.elf avrgcctest.hex $ cat avrgcctest.hex :1000000012C02AC029C028C027C026C025C024C0CD :1000100023C022C021C020C01FC01EC01DC01CC0E4 :100020001BC01AC019C011241FBECFEDCDBF10E0F8 :10003000A0E6B0E0EAE6F0E002C005900D92A0363E :10004000B107D9F710E0A0E6B0E001C01D92A036DC :10005000B107E1F702D007C0D3CF8FEF87BB80E0B5 :0A0060008F5F88BBFDCFF894FFCF3F :00000001FF $ avr-objdump -d avrgcctest.elf avrgcctest.elf: file format elf32-avr Disassembly of section .text: 00000000 <__vectors>: 0: 12 c0 rjmp .+36 ; 0x26 <__ctors_end> 2: 2a c0 rjmp .+84 ; 0x58 <__bad_interrupt> 4: 29 c0 rjmp .+82 ; 0x58 <__bad_interrupt> 6: 28 c0 rjmp .+80 ; 0x58 <__bad_interrupt> ----------------------------------------------------------- (以下略)
コマンドラインで開発を行う場合は、makefileを作成してmakeで管理するのが一般的です。しかし、makeのリファレンスをみてイチから勉強するよりも、今はとりあえずAVRマイコンを動かしたい、という(私のような)せっかちには、意外に大きなハードルだったりします。でも大丈夫。ここでは、makeの役割をEclipseにやってもらいましょう。
私が普段使用してるFedora 12では、リポジトリにあるEclipseパッケージを導入するだけで、Eclipseに関する基本的な設定(つまり、Java, C/C++のPC向け開発環境)は完了しました。他のディストリビューションでは状況が異なるかもしれませんが、Eclipse 本体とEclipse CDT(C/C++開発環境)があれば大丈夫と思います(執筆時点で未確認)。Javaも、デフォルト設定のOpenJDKのままで、Sun Javaには切り替えずに使っています。
EclipseやCDTについての詳細は、インストール方法をはじめ、多くの参考資料や文献が豊富にありますので、ここでは詳細を割愛させてください。
リポジトリから導入したEclipse本体は
Eclipseを起動して、workspaceを指定します。私は、workspaceというフォルダをすでに別用途でつくっていたので、eclipse_workspaceに変更しましたが、特に変更する必要はありません。
さて、ちょっと、Eclisep CDT の動作確認をしてみましょうか。開発環境をセットアップしたら、Hello, worldをビルドするのは、お約束というか、通過儀礼ですね。脱線のようですが、Eclipse + GCCが正しく動作していることを確認するのは重要です。Hello, worldの作成はプロジェクト作成ウィザードのみで簡単にできてしまいます。
下記の項目を入力、または選択します。
[Project Name]: | Hello |
---|---|
[Project type]: | [Executable] → [Hello World ANSI C Project] |
[Toolchains]: Linux GCC | Linux GCC |
以上は、ツールチェインとしてPC Linux用のGCCを使用したプログラミングです。この環境にツールチェインとしてAVR-GCCを追加するのが、AVR Eclipse Pluginです。
AVR Eclipse Plugin のホームページにあるインストール方法にしたがい、Eclipseの機能追加を利用してインストールします。以下、Eclipse 3.5 (Galileo)での操作になります。他バージョンでは、少々メニューやダイアログの名称が異なるかもしれません。
Eclipseのメニューから、[Help] → [Install New Software]で機能追加の[Install]ダイアログを開きます。
[Work with]の横にある[Add...]ボタンから、ダウンロードするサイトとしてAVR Eclipse Pluginのアップデート・サイトを追加します。
(注:執筆時点では、AVR Eclipse PluginのページにはGalileo (Eclipse 3.5系)での手順説明がありませんでした。が、Upadte siteとして、3.4, 3.3ともに同じURL( http://avr-eclipse.sourceforge.net/updatesite/ )を入力すると、自動的に認識してインストールできます。)
[CDT Optional Features]の下にある[AVR Eclipse Plugin]を選択して、画面指示にしたがいインストールします。完了後、Eclipseを再起動。
再起動後、パースペクティブをC/C++にすると、AVR関連のメニューアイテムやボタンが追加されています。
以上でインストールは完了。なお、インストールしたAVR Eclipse Pluginのバージョンは"2.3.4.20100807PRD"でした。では、以下、ターゲットを用意して、プロジェクトを作ってみます。
今回使用しているプログラマは、Olimex AVR-ISP500です。
参考ページ:
Olimex AVR-ISP500
(http://www.olimex.com/dev/avr-isp500.html)
ISP信号が2x5、および2x3のコネクタで利用できます。今回は2x3を使用。標準的なSPI信号、ターゲット電源、リセット端子を接続します。(ターゲット回路図参照)
ターゲットとして用意したものは、ATtiny2313とLEDをブレッドボードに配線したものです。
ATtiny2313の詳細やデータシートなどについては、こちら → Atmel ATtiny2313のページ (http://www.atmel.com/dyn/products/product_card.asp?part_id=3229)
ブレッドボードへのISP書き込み用に、簡単な変換コネクタを作成しています。
AVR Eclipse Pluginは、EclipseからAVRDudeを呼び出してターゲットと通信をします。 まず、コマンドライン上でAVRDudeをきちんと単体で使えるかどうか確認しておきましょう。
以下は、olimex AVR-ISP500での私の環境での確認例です。ターゲットの接続確認をした後、AVR GCCの確認で作成したHEXファイルを書き込んでいます。(お使いのプログラマ、PC環境にあわせて、各オプションを変更する必要があります。)
プログラマ (オプション -c) | "stk500v2" (STK500 version2互換) |
---|---|
ポート (オプション -P) | "/dev/ttyACM0" (ls /dev/ttyACM* で確認) |
ターゲット・デバイス (オプション -p) | "t2313" (ATtiny2313) |
$ ls -l /dev/ttyACM* crw-rw----. 1 root dialout 166, 0 2010-09-03 08:58 /dev/ttyACM0 $ avrdude -c stk500v2 -P /dev/ttyACM0 -p t2313 avrdude: AVR device initialized and ready to accept instructions Reading | ################################################## | 100% 0.03s avrdude: Device signature = 0x1e910a avrdude: safemode: Fuses OK avrdude done. Thank you. $ avr-gcc -O2 -Os -mmcu=attiny2313 -o avrgcctest.elf avrgcctest.c $ avr-objcopy -R .eeprom -O ihex avrgcctest.elf avrgcctest.hex $ avrdude -p t2313 -c stk500v2 -P /dev/ttyACM0 -U flash:w:avrgcctest.hex:a avrdude: AVR device initialized and ready to accept instructions Reading | ################################################## | 100% 0.03s avrdude: Device signature = 0x1e910a avrdude: NOTE: FLASH memory has been specified, an erase cycle will be performed To disable this feature, specify the -D option. avrdude: erasing chip avrdude: reading input file "avrgcctest.hex" avrdude: input file avrgcctest.hex auto detected as Intel Hex avrdude: writing flash (106 bytes): Writing | ################################################## | 100% 0.37s avrdude: 106 bytes of flash written avrdude: verifying flash memory against avrgcctest.hex: avrdude: load data flash data from input file avrgcctest.hex: avrdude: input file avrgcctest.hex auto detected as Intel Hex avrdude: input file avrgcctest.hex contains 106 bytes avrdude: reading on-chip flash data: Reading | ################################################## | 100% 0.31s avrdude: verifying ... avrdude: 106 bytes of flash verified avrdude: safemode: Fuses OK avrdude done. Thank you. $
なお、プログラマのオプション、デバイスのオプションに指定する文字列の一覧は、各オプションに適当な(ありえなさそうな)文字列を指定すると表示されます。(例:"avrdude -p hogehoge", "avrdude -p stk500v2 -c hogehoge")
注意:
AVRDudeからAVR-ISP500へは、USB CDCシリアルポート(/dev/ttyACM*)で接続するため、デバイス・ファイルへアクセスします。
AVR-ISP500ほか、USBシリアルポート経由で通信するプログラマでは、/dev/ttyACM*への書き込みアクセス権が必要になります。 必要に応じて、自分のアカウントにグループ(Fedora12の環境では、group = "dialout"でした)を追加してください。
さて、以上ですべての準備が整いました。いよいよEclipse上でプロジェクトを作成していきます。
Eclipse(C/C++ パースペクティブ)のメニューから、[File] → [New] → [C Project]で、プロジェクト作成ウィザードを起動します。
[Project type]のなかから、[AVR Cross Target Application] → [Empty Project]を選択します。[Toolchains]は、[AVR-GCC Toolchain]となります。
[Project name]に、作成するプロジェクト名を入力して、[Next]をクリック。コンフィギュレーションとして、DebugビルドとReleaseビルドが設定されます。確認して、[Next]をクリック。
つづいて、ターゲットのデバイスを選択します。
[MCU Type]に、チップ名を(ここでは、[ATtiny2313])、[MCU Frequency(Hz)]には、動作クロック周波数を(ここでは、[1000000] = 1MHz、出荷時設定:「内蔵RC発振器8MHzを8分周したもの」)選択します。[Finish]をクリックすると、プロジェクトが作成されます。
画面左の[Project Exploler]で、新規作成したプロジェクトを選択した状態にします。そして、メニューから、[File] → [New] → [Source File]を選択して、ソースファイルを追加します。なお、C言語ソースの場合は、拡張子を".c"に、アセンブラ・ソースの場合は"*.S"にしておく必要があります。
ソースファイルを開いて、コードを書いていきます。Eclipseの支援機能が使えるので、非常に快適です。ここでは、タイマー割込みを使用した簡単なLED点滅プログラムを作成しています。
Eclipseから、[Project] → [Properties] で設定ダイアログを開き、左側のResourceから、[AVR] → [AVRDude] → [Programmer]を選択します。最初は、プログラマが無い状態ですので、[New]ボタンにより設定を作成します。
olimex AVR-ISP500を、Eclipseで使用するプログラマとして設定するため、下記の内容を入力します。お使いの環境にあわせてください。
Configuration name: | プログラマの設定名称。後で区別できるように、わかりやすい名前をつける。 |
---|---|
Description: | 設定の説明。後で区別できるように簡潔なコメントをいれておく。 |
Programmer Hardware (-c): | 使用するプログラマを選択する |
Override default port (-P): | プログラマが接続されているポート:例:/dev/ttyACM0 |
一度、設定ファイルを作っておけば、次回から新規プロジェクトを作成する際に、選択できるようになります。複数のプログラマを使い分ける場合は、それぞれの設定ファイルを作っておきます。
DebugとReleaseのうちのどちらかをビルド対象として選択します。メニューから[Project] → [Build Configurations] → [Set Active]で[Debug]か[Release]を選択します。
このままビルドすると、Debugビルドの場合はデフォルト設定では最終生成ファイルがELFまでとなっているので、ダウンロード用のHEXファイルが出力されません。また、Releaseビルドでは、フラッシュメモリとEEPROMのHEXファイルを両方とも生成するようになっていますが、EEPROMへの書き込みが必要のないプロジェクトでは変更が必要です。
設定を変更するビルドを選択します(ここでは、Debugビルドの変更を例にあげていますが、Releaseビルドでも同様です)。メニューから、[Project] → [Properties]で設定ダイアログを開き、左側の[Resource]から[C/C++ Build] → [Settings]を選択します。右側の[Configuration]が"Debug [Active]"になっていることを確認して、[Tool settings]タブ内の[Additional Tools in Toolchain]を選択すると、HEXファイル生成の設定ができます。
必要なHEXファイルのみ出力するように変更します。
必要に応じて、コンパイラオプションを変更します。設定ダイアログの[Resource]内から[AVR Compiler]を選択すると、avr-gcc のコンパイル用オプションを設定することができます。ここでは、サイズを小さくするために最適化オプション(-O2 -Os)を変更しています。他のツール(アセンブラ、リンカ、avr-objcopyなど)のオプションも同様に変更できます。
ソースコードを保存したら、メニューから、[Project] → [Build Projecct]でビルドします。
エラーなくビルドが完了したら、ダウンロードボタン、またはメニューの[AVR] → [Upload Project to Target Device]でターゲットにHEXファイルをダウンロードします。
以上で、完了です。あとは、テスト、デバッグを繰り返して完成です。
AVRDudeでのヒューズビットの設定は、直接hex値をコマンドラインのオプションで指定しなければなりません。もし間違った設定をしてしまうとターゲット・デバイスが異常動作したり、最悪の場合、使用不能にしてしまう可能性があるため、非常に神経を使います。AVR Eclipse Pluginの機能を使うと、ヒューズビットの設定が非常に簡単に行うことができます。
ターゲットにビルドしたバイナリを書き込みできる状態にしておいて、[Project] → [Properties]のダイアログから、[AVR] → [AVRDude]を選択して、[Fuses]タブを開きます。[Upload Fuse Bytes]の[direct hex values]をONにします。
[Load from MCU]ボタンを押して、現在のFuseの設定値を読み出します。
[Start Editor]でFuseエディタを起動します。
読み出したFuse設定がエディタに表示されます。新しい設定にあわせて、必要なビットを変更します。うっかり設定を間違えると、ISPでプログラムできなくなったり、ターゲットを故障させたりする場合がありますので、慎重に行ってください。
ためしに、動作クロックを分周なしの8MHzに変更してみます。CKDIV8ヒューズ・ビットを"Yes" → "No"にします。
設定を完了したら、Fuseエディタ、および設定ダイアログを[OK]で閉じて、ダウンロードを行います。ダウンロードと同時にヒューズ・ビットが更新され、新しい設定が有効になります。ここでは、動作クロックを「8MHz、1/8に分周(= 1MHz)」から「8MHz、分周なし (= 8MHz)」に切り換えたので、LEDの点滅速度が早くなりました。
ヒューズビットの変更が終わったら、設定ダイアログで変更機能をOFFにしておきます。
AVR Eclipse pluginには、とても丁寧なヘルプファイルがついてきます。Eclipseのメニューから、[Help] → [Help Contents]でヘルプ画面を開くと、"AVR Plugin"という章が追加されているのが分かります。なかでも、"Getting Started"には、プロジェクト開始のために必要な設定方法などが簡潔にかかれているスグレモノです。
avr-gccを使って割込み処理を記述する場合のマニュアル(avr-libc)
→
Intrrupts (http://www.nongnu.org/avr-libc/user-manual/group__avr__interrupts.html)
GCCでタイマー0を使用した割込み処理を記述する際に、参考にさせていただきました。「タイマ・カウンタ0の使い方」にある「割込みで使う」例のソースの大枠を、ほぼそのまま使わせていただきました。タイマー、割込み以外にも、GCCでの割込みの記述の仕方やアセンブラでの書き方など、参考になる資料、ソースコードが多数あります。
→
Getting Started Notes - Timer0
Arduinoの登場以来、また少しずつAVRマイコンの人気が出てきたような気がします。私も、ArduinoでAVRマイコンをはじめたのですが、最近のオープンソースのツール類は非常にユーザー・フレンドリーにできていると思います。今回、AVR Eclipse Pluginを使用することで、生のAVRマイコン開発においても、Arduino IDE 並に、お手軽なプログラミング環境が出来上がったと思います。
AVR Eclipseのインストールと動作確認を長々と書いてきましたが、実際にやってみると、非常に簡単にできますので、GUI開発環境を使ってみたいAVRマイコン開発者にはおすすめです。 記事中では、デバッグ機能がないAVR-ISP500というプログラマを使用したため、Eclipse, GDBによるデバッグ支援機能については試すことができませんでした。機会があれば、デバッグについても試してみたいと思います。
いつもながら、無料のツールのみで素晴らしい環境を構築できるのは、優れた先輩諸氏の功績と、多数のユーザーに支援された、たゆまない改良の成果ですね。感謝の意を表して、今回の記事の終わりとしたいと思います。多謝。