AVRのページ

AVRは,ATMEL社が発売しているマイクロコンピューターです. マイコンとしては,PICが有名ですが,PICよりも癖が無いので,初心者でも楽に使うことができます. そのほとんどのICで,C言語が使えるので,CPUのことをほとんど知らなくても使うことができるというのも,非常に大きな魅力です. 少し前までは,74シリーズなどの論理ICも使っていましたが,これらはすべてAVRに置き換えることが可能ですので,今後は使うことは無くなると思います.
ここでは,Debian LinuxでAVRを使う際に参考になる事柄を書きたいと思います.

種類

多くの種類が存在します. 大きく分けて90Sシリーズ,Tinyシリーズ,Megaシリーズがあります. 90Sは旧製品で,Tiny,Megaの後継に置き換えられています. Tinyは小型,Megaは高機能といった感じです.
汎用のI/Oポート,Flash,SRAMを持ち,これらの数とサイズが種類によって異なり,要請に合ったものを選びます. クロックの生成には,外部クロックの他に内部発振器を利用可能なものもあります. また, ADC(Analog to Digital Convertor) 内蔵のものや, シリアルインターフェースとして, UART(Universal Asynchronous serial Receiver and Transmitter), USART(Universal Synchronous and Asynchronous serial Receiver and Transmitter), USI(Universal Serial Interface) などの機能を持つものがあります. 他にもタイマーやアナログ比較器などを持つものもあります.
これまで使ったことのあるものや,今後使う予定のあるものの仕様を以下の表にまとめておきます. 個人的にはDIPしか使っていないので,かなり偏っています.
typespin(DIP)I/OFlash(byte)SRAM(byte) ADCserialInternal Oscilator
AT90S2313 20152k128 0UARTno
ATtiny231320182k128 0USART,USIyes
ATtiny26 20162k128 11USIyes
ATtiny261 20162k128 11USIyes
ATtiny461 20164k256 11USIyes
ATtiny861 20168k512 11USIyes

ATtiny2313

AT90S2313の後継にあたるもので,I/Oが三つ増えてVccとGND以外の全てのピン(18本)をI/Oとして使えます. しかし,その一つはRESET端子も兼ねていて,これはプログラムを書き込むときによく使うので,普段は使わない方が良いでしょう. また,残りの二端子を使うためには,内部発振器を使う必要があり,最大のクロックで動作させることができなくなります. 内部発振器で最大8MHzまで使えるので,I/OをRESET以外の17本として使うのが無難でしょう. USARTもあるし,汎用のdigital処理用としては,非常に使い易いと思います. 価格も非常に安価で,例えば秋月では一つ100円(2008/1現在)で売られています. ただ,AT90S1200とpin互換を保つために,pinの配置は少し不規則になってしまっています.

ATtiny261/461/861

ATtiny26の後継にあたり,メモリの容量が異なる以外は三つとも変わりません. ADCをもっているので,analogも扱えますが,AVcc,AGNDが必要なために,I/Oがその分減ってしまっています. pinの配置もスマートになっています. UARTがないので,外部との通信に苦労しますが,USIを用いてUARTもどきを実現できます.

コンパイル

Debianでは,以下のものをインストールしておきます.
aptitude install gcc-avr binutils-avr avr-libc
コンパイルのときは,デバイスの種類とoptimize sizeオプションをつけて次のようにします.
avr-gcc test.c -o out.elf -mmcu=attiny2313 -Os
その後,次のようにして書き込む数値に変換します.
avr-objcopy -O ihex out.elf out.hex

書き込み

AVRにプログラムを書き込む方法はいくつかありますが, ISP(In-System Programming)を使うのが最も簡単だと思いますので,以下ではこの方法を紹介いたします. 但し,ISPはRESETを使うので,このpinが有効になっていないと使えません. RESETが有効でない場合には,パラレル書き込みをするらしいのですが,これは試していません. 書き込み用のプログラムのインストールは次のようにします.
apt-get install uisp avrdude
そして,パラレルポートを使う場合には,rubyのページにあるように,パラレルポートを使えるように設定して下さい. 書き込み用のケーブルは,いろいろな種類があるのですが,私は dapa(Direct AVR Parallel Access)を使っています. 下の表にしたがって,ケーブルを作って下さい. 本当は抵抗などを入れた方が良いのでしょうが,面倒なので直結しています.
1STROBESCK
2DATA0 MOSI
3DATA1 VCC
11BUSY MISO
16INIT RESET
19GND GND
また,dasa(Direct AVR Serial Access)も使うことがあります. この場合は,そのままつなぐと電圧違いが問題になるので,レベルコンバートをする必要があります.
3TxD MOSI
4DTR SCK
5GND GND
7RTS RESET
8CTS MISO
VCC
他のケーブルの情報は,/etc/avrdude.confにありますので,参考にして下さい.
AVR側は,フルピッチの2×3のピンヘッダを下の表のように配置して,ケーブルにはソケットをつけて,接続しています.
RESETSCKMISO
GNDMOSIVCC
実際に書き込むには,uispまたはavrdudeを使います. sargeではavrdudeがないので,uispを使うしかありません.
 uisp -dprog=dapa --erase --upload --verify if=out.hex 
しかし,例えばTiny2313では,うまくいかず,avrdudeを使ったらあっさりできたことがありました. etchではavrdudeを使った方がよいでしょう.
 avrdude -p t2313 -c dapa -U flash:w:out.hex 
fuseビットを書き換えるときには,それぞれ次のようにします.
uisp -dprog=dapa --wr_fuse_l=0x64 # default
avrdude -p t2313 -c dapa -u -U hfuse:w:0xde:m # disable reset

プログラム

もちろん機械語でプログラムを書くこともできますが,C言語で書くことができます. 何もしないプログラムはこんな感じです.
#include <avr/io.h>
#include <avr/interrupt.h>
int main(void)
{
  for(;;){}
}

I/Oの使用

AVRには,種類によりますがI/Oとして使うことにできるピンがいくつかあります. DDRxで入力(0)か出力(1)かを設定して,入力ならPINxから値を読み込んだり,出力ならPORTxに値を入れることによって,high(1)とlow(0)を指定したりできます. 各ポートのビットがそれぞれピンに対応しています. 一つにピンをhigh/lowで切替えるプログラムは次のような感じです.
#include <avr/io.h>
#include <avr/interrupt.h>
int main(void)
{
  DDRB=0x01;
  for(;;){
    PORTB=0x01;
    PORTB=0x00;
  }
}
これらのI/Oピンは,10mA程度の電流を流すことができるので,直接LED等を駆動することができます. ただし,resetピンには12Vを印加する場合があるからか,駆動能力には違いがあるようですので,注意が必要です. また,指定によっては,Hi-Z状態にしたり,pull-upしたりもできます.

タイマー

割り込み

RS232C(UART)