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)を使っています.
下の表にしたがって,ケーブルを作って下さい.
本当は抵抗などを入れた方が良いのでしょうが,面倒なので直結しています.
1 | STROBE | SCK |
2 | DATA0 | MOSI |
3 | DATA1 | VCC |
11 | BUSY | MISO |
16 | INIT | RESET |
19 | GND | GND |
また,dasa(Direct AVR Serial Access)も使うことがあります.
この場合は,そのままつなぐと電圧違いが問題になるので,レベルコンバートをする必要があります.
3 | TxD | MOSI |
4 | DTR | SCK |
5 | GND | GND |
7 | RTS | RESET |
8 | CTS | MISO |
| | VCC |
他のケーブルの情報は,/etc/avrdude.confにありますので,参考にして下さい.
AVR側は,フルピッチの2×3のピンヘッダを下の表のように配置して,ケーブルにはソケットをつけて,接続しています.
実際に書き込むには,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)