SSブログ

ATtiny13 で Arduino [Arduino]

以前にATtiny45/85にArduinoのスケッチを書き込む方法を紹介させていただきました。

ArduinoISPを使う
http://www.geocities.jp/arduino_diecimila/use/attiny.html
Areduino IDEで ATtiny/ATmega開発環境を作る
http://www.geocities.jp/arduino_diecimila/use/arduino_dev.html

しかし、ATtiny45/85 はちっちゃい割にそこそこ高価、、。
秋月さんには同じ8ピンで1個120円の、ATtiny13Aがあります。

AVRマイコン  ATTINY13A-PU
http://akizukidenshi.com/catalog/g/gI-02911/
attiny13a.jpg

何とかならないかなぁ、、と、いじっていたら何とかなりました。
あまりよく分かってやっているわけではないので、とりあえず動いた程度です。

「ArduinoISPを使う」がちゃんとインストールできた状態が前提です。

boards.txt に追加
############################################
avrtiny13.name=ATtiny13 / Int.9.6MHz
avrtiny13.upload.using=arduino:arduinoisp
avrtiny13.upload.maximum_size=1024

avrtiny13.bootloader.low_fuses=0x7A
avrtiny13.bootloader.high_fuses=0xFF
avrtiny13.bootloader.path=dummy
avrtiny13.bootloader.file=dummy.hex
avrtiny13.bootloader.unlock_bits=0x3F
avrtiny13.bootloader.lock_bits=0x3F

avrtiny13.build.mcu=attiny13
avrtiny13.build.f_cpu=9600000L
avrtiny13.build.core=attiny13

############################################

そして coresフォルダ内にattiny13 というフォルダをつくり cores\attiny45_85 のフォルダ内をすべてコピーします。
つづいて、attiny13 フォルダ内の下記の4つのファイルをテキストエディタで、指定行の部分だけ書き換えます。

pins_arduino.c
  89 |	TIMER0B,	// ★ 変更箇所:TIMER1 → TIMER0B

wiring.c
 189 |	sbi(TIMSK0, TOIE0);		// ★変更箇所:TIMSK → TIMSK0

 196 | //	sbi(TCCR1, CS11);	// ★変更箇所:コメントアウト
 197 | //	sbi(TCCR1, CS10);	// ★変更箇所:コメントアウト
 198 | //	sbi(TCCR1, PWM1A);	// ★変更箇所:コメントアウト

wiring_digital.c
  57 | 	//if (timer == TIMER1) cbi(TCCR1, COM1A1);	// ★変更箇所:コメントアウト
  58 |	//if (timer == TIMER1) cbi(TCCR1, COM1B1);	// ★変更箇所:コメントアウト

wiring_analog.c
  96 |  } else if (digitalPinToTimer(pin) == TIMER0B ) {	// ★変更箇所:TIMER1 → TIMER0B

 101 |	  sbi(TCCR0A, COM0B1);	  // ★変更箇所:TCCR1 → TCCR0A, COM1A1 → COM0B1

 103 |	  OCR0B = val;	// ★変更箇所:OCR1A → OCR0B

ATtiny13のFUSE BITを書き込みます。
 low=0x7A, high=0xFF

これで、ATtiny45 などと同じように使うことができます。
しかし、ATtiny13 はプログラムメモリ 1kByteなので、油断しているとすぐにオーバーしてしまいます。

先日の虹色イルミネーションもオーバーしてしまいました。
そこで対策としては、

digitalWriteなどのオーバーヘッドが多そうな関数を使わず、ポートを直接操作したり (890 bytes)
#define GET_RAINBOW(TONE,COLOR) (max( min( 510 - abs( ( (TONE) + 510 * (COLOR) ) % 1530 - 510 ), 255 ), 0 ))
    // TONE(色調) 0-1529, COLOR(RGBの選択) 0-2

void setup()   {
  DDRB |= B00000111;
}

void loop()                     
{
  int r, g, b, t, i, d;
  for( t = 0; t < 1530; t++ ) {
    r = GET_RAINBOW( t, 0 );
    g = GET_RAINBOW( t, 1 );
    b = GET_RAINBOW( t, 2 );
    for( d = 0; d < 10; d++ ) {    // 擬似PWMの繰り返し回数(delayに相当)
      // 擬似PWM   
     if( b )  PORTB |= B00000001;
     if( g )  PORTB |= B00000010;
     if( r )  PORTB |= B00000100;
     for(i = 1; i <= 255; i++ ) {
        if( i == b )  PORTB ^= B00000001;
        if( i == g )  PORTB ^= B00000010;
        if( i == r )  PORTB ^= B00000100;
       }
    }
  }
}

負の値をとらないように、intではなくunsigned intを使うようにスケッチを変更する (894 bytes)
#define GET_RAINBOW(TONE) (((TONE)<256) ? (TONE):((TONE)<768) ? 255:(((TONE)<1024) ? (1023-(TONE)):0))

void setup()   {
  pinMode(0, OUTPUT);
  pinMode(1, OUTPUT);
  pinMode(2, OUTPUT);
}

void loop()
{
  unsigned int r, g, b, t, i, d;
  for( t = 0; t < 1536; t++ ) {
    r = GET_RAINBOW(  t );
    g = GET_RAINBOW( (t +  512) % 1536 );
    b = GET_RAINBOW( (t + 1024) % 1536 );
    for( d = 0; d < 10; d++ ) {    // 擬似PWMの繰り返し回数(delayに相当)
     // 擬似PWM
     if( b )  digitalWrite(0, HIGH);
     if( g )  digitalWrite(1, HIGH);
     if( r )  digitalWrite(2, HIGH);
     for(i = 1; i <= 255; i++ ) {
        if( i == b )  digitalWrite(0, LOW);
        if( i == g )  digitalWrite(1, LOW);
        if( i == r )  digitalWrite(2, LOW);
       }
    }
  }
}

などで対応してみました。

rb_tn13.jpg
nice!(0)  コメント(3)  トラックバック(0) 

nice! 0

コメント 3

Shoo

Arduino1.0が公開されましたが、
上記の13A用のcores/attiny13aをZIPでまとめて頂けないでしょうか?
by Shoo (2012-01-23 16:36) 

kenkenpa

どうも、こんにちは。
ATtiny13用のものは、Arduino 0021でしか動作確認しておりません。
Arduino1.0も同じでいいのか、、確認してみます。
あと、このブログ、ファイルのアップロードができないみたいで、どうしたものかと、、。
by kenkenpa (2012-01-26 21:44) 

たかSan

ATtiny13を使って、初めて自作をしたいと思っているんですが
リンクが切れていてしまって見れないです。
出来れば必要な部品と物理構成図を教えて貰えないでしょうぁ
by たかSan (2015-04-27 13:52) 

コメントを書く

お名前:
URL:
コメント:
画像認証:
下の画像に表示されている文字を入力してください。

トラックバック 0

この広告は前回の更新から一定期間経過したブログに表示されています。更新すると自動で解除されます。