言語ゲーム

とあるエンジニアが嘘ばかり書く日記

Twitter: @propella

はじめての Mac で AVR プログラミング。小指サイズの ATtiny45 で LED チカチカ。

P1050522

今日は Ian さんの家に行って、彼の電子工作を見せてもらいました。彼のアパートの一室が電子工作に最適化されていて、小さいパーツ入れの箱が町工場のように天井まで詰み上がり、色んな色の電線がすぐに好みの長さに切れるようにズラッと並んでいました。そこで彼の作ったアンプやらフライトシミュレータやらの話を聞く事が出来ました。今まで電子工作をしている他人の部屋を生で見た事が無かったので大変刺激になりました。

さて本題ですが、先日届いた AVR マイコンを触る暇が出来たので、簡単に Mac でどのようにプログラムをするのかをメモります。課題は例によって LED チカチカです。Arduino で楽ちんプログラミングも良いですが、生のチップを使うのも味があって良いものです。書き込み器を接続する為の部品の関係で、今回は全部ブレッドボードというわけには行きませんでした。

ハードウェア編

  • 道具
    • プログラマ(書き込み器) ATAVRISP2-ND $34.00 (DigiKey)
      • 探せばもっと安いキットがあると思います。工作に自信が無いので純正品にしました。
    • 半田ゴテ 25W $8.79 (RadioShack)
      • 15W くらいでもっと高い奴の方が良いらしいです。半田付けが上手く行かないなーと思ったら、先を紙ヤスリでちょっと磨くと上手く付くようになりました。
    • 半田 Rosin Core Solder 60/40 0.032"径 $5.49 (RadioShack)
      • lead free と書いてある奴は難しいので辞めた方がいいらしい。
  • 部品
    • マイコン ATTINY45-20PU-ND $2.13 (DigiKey)
      • 省電力版が欲しかったけど在庫が無かったのでこれにしました。
    • ピンヘッダ(切ってプログラマ端子にする) A26528-10-ND $2.05 (DigiKey)
      • これは何か高い気がする。。。
    • 8ピンICソケット ED3108-ND $0.48 (DigiKey)
    • 万能基板 Round PCB Kit (5枚入り) $4.99 (RadioShack)
    • フックアップワイヤ 22AWG (三本入り) $6.59 (RadioShack)
    • 抵抗 7.5KΩ
    • ワニクリップ
    • 電池ボックス $2.00 (Fry's)

まず本を参考に設計図を描きます。マイコンとピンヘッダ以外の部品はリセット用の 7.5KΩ抵抗だけです。無くても動くらしいです。

P1050556

設計図を元に万能基板に部品を配置して、

P1050542

半田づけします。もうちょっと考えて作ればこんなに半田モリモリにならないと思います。

P1050549

ここで重要な事を忘れていました。電源を付ける部分が無かったです。仕方が無いので写真のようにワニクリップで乾電池二個(3V)と繋ぎました。書き込み器の赤い線が VCC の位置に、チップの丸いマークが RESET の位置に来るようにはめます。

P1050574

ソフトウェア編

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 をつなげればチカチカします。こんなに小さいのに私の言う事を聞くとは何で健気なのだ!