今日は Ian さんの家に行って、彼の電子工作を見せてもらいました。彼のアパートの一室が電子工作に最適化されていて、小さいパーツ入れの箱が町工場のように天井まで詰み上がり、色んな色の電線がすぐに好みの長さに切れるようにズラッと並んでいました。そこで彼の作ったアンプやらフライトシミュレータやらの話を聞く事が出来ました。今まで電子工作をしている他人の部屋を生で見た事が無かったので大変刺激になりました。
さて本題ですが、先日届いた AVR マイコンを触る暇が出来たので、簡単に Mac でどのようにプログラムをするのかをメモります。課題は例によって LED チカチカです。Arduino で楽ちんプログラミングも良いですが、生のチップを使うのも味があって良いものです。書き込み器を接続する為の部品の関係で、今回は全部ブレッドボードというわけには行きませんでした。
ハードウェア編
- 道具
- 部品
まず本を参考に設計図を描きます。マイコンとピンヘッダ以外の部品はリセット用の 7.5KΩ抵抗だけです。無くても動くらしいです。
設計図を元に万能基板に部品を配置して、
半田づけします。もうちょっと考えて作ればこんなに半田モリモリにならないと思います。
ここで重要な事を忘れていました。電源を付ける部分が無かったです。仕方が無いので写真のようにワニクリップで乾電池二個(3V)と繋ぎました。書き込み器の赤い線が VCC の位置に、チップの丸いマークが RESET の位置に来るようにはめます。
ソフトウェア編
Cコンパイラ一式は http://www.obdev.at/products/avrmacpack/ からダウンロードしてインストールします。Arduino 開発環境にも同じ物が入っていますが、ドキュメントが足りないので本家のやつを入れました。
- /usr/local/AVRMacPack-日付 にインストールされる。
- インストーラが /etc/profile を書き換えるのでターミナルを開け直す(が、ダサイ事にこれだけでは screen から起動したシェルに反映されないので、自分で、PATH に /usr/local/AVRMacPack/bin を追加する)。
- アンインストールは sudo /usr/local/AVRMacPack/uninstall
早速プログラムを作っていきます。まず以下のコマンドで Makefile 等のテンプレートが生成されます。
$ avr-project chika $ cd chika/firmware
プログラムソースは次の物を使います。
/* main.c */ /* LED blink for ATtiny45 based on http://www.obdev.at/products/avrmacpack/index.html */ #include <avr/io.h> #include <util/delay.h> int main(void) { DDRB = 1 << PORTB3; /* TB3 を出力用に設定 */ while("forever"){ /* 無限ループ */ _delay_ms(100); /* 100 ms待つ */ PORTB ^= 1 << PORTB3; /* LED をトグル */ } return 0; }
次に、Makefile を書き換えます。書き換えるのは次の部分だけです。特にドライバのインストールは不要でした。
DEVICE = attiny45 # デバイス名 CLOCK = 1000000 # クロックスピード PROGRAMMER = -c avrisp2 -P usb # 書き込み器の名前と接続方法 OBJECTS = main.o FUSES = -U hfuse:w:0xdf:m -U lfuse:w:0x62:m # フューズビット
特に気をつけるのが FUSES の値です。フューズというのは AVR の基本設定で、プログラムから書き換える事が出来ません。モデルごとに設定が違っていて、しかも間違えると書き込みが出来なくなるそうです。上の設定は工場出荷時の設定そのままです。hfuse (上位フューズ) と lfuse (下位フューズ) の二つがあって、ATtiny45 の場合意味は次のようになります。1 が非設定、0 が設定と反対なので注意。詳しくはデータシートの 20.2 Fuse Bytes にあります。
- hfuse
- bit7 | 初期値 1 | RSTDISBL | 外部リセット無効
- bit6 | 初期値 1 | DWEN | DebugWIRE を有効
- bit5 | 初期値 0 使用 | SPIEN | プログラム書き換え有効
- bit4 | 初期値 1 | WDTON | Watchdog timer いつでも有効
- bit3 | 初期値 1 | EEPROM | EEPROM 消去
- bit2:0 | 初期値 111 | BODLEVEL2,1,0 | 電圧が低い時にリセットする方法
- lfuse
- bit7 | 初期値 0 する | CKDIV8 | クロックを八分の一にするか
- bit6 | 初期値 1 | CKOUT | クロックを出力
- bit5:4 | 初期値 00 一番遅い| SUT1,0 | 起動時間
- bit3:0 | 初期値 0010 内部クロック 8MHz| CKSEL3,2,1,0 | クロック選択
make install でコンパイルして書き込みが行われます。フューズ変更が不要の時は make flash で良いです。あとは LED をつなげればチカチカします。こんなに小さいのに私の言う事を聞くとは何で健気なのだ!
参考
- AVR Tutorial http://www.ladyada.net/library/avrdevtut/
- 道具の選び方 http://www.ladyada.net/make/drawdio/prep.html
- AVRISPmk2 http://www.atmel.com/dyn/products/tools_card.asp?tool_id=3808
- ATtiny45 データシート http://www.atmel.com/dyn/resources/prod_documents/doc2586.pdf
- 日本語データシート http://reef.path.ne.jp/~hero/hero.htm




