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/
何とかならないかなぁ、、と、いじっていたら何とかなりました。
あまりよく分かってやっているわけではないので、とりあえず動いた程度です。
「ArduinoISPを使う」がちゃんとインストールできた状態が前提です。
boards.txt に追加
そして coresフォルダ内にattiny13 というフォルダをつくり cores\attiny45_85 のフォルダ内をすべてコピーします。
つづいて、attiny13 フォルダ内の下記の4つのファイルをテキストエディタで、指定行の部分だけ書き換えます。
pins_arduino.c
wiring.c
wiring_digital.c
wiring_analog.c
ATtiny13のFUSE BITを書き込みます。
low=0x7A, high=0xFF
これで、ATtiny45 などと同じように使うことができます。
しかし、ATtiny13 はプログラムメモリ 1kByteなので、油断しているとすぐにオーバーしてしまいます。
先日の虹色イルミネーションもオーバーしてしまいました。
そこで対策としては、
digitalWriteなどのオーバーヘッドが多そうな関数を使わず、ポートを直接操作したり (890 bytes)
負の値をとらないように、intではなくunsigned intを使うようにスケッチを変更する (894 bytes)
などで対応してみました。
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/
何とかならないかなぁ、、と、いじっていたら何とかなりました。
あまりよく分かってやっているわけではないので、とりあえず動いた程度です。
「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); } } } }
などで対応してみました。
2011-11-17 01:18
nice!(0)
コメント(3)
トラックバック(0)
Arduino1.0が公開されましたが、
上記の13A用のcores/attiny13aをZIPでまとめて頂けないでしょうか?
by Shoo (2012-01-23 16:36)
どうも、こんにちは。
ATtiny13用のものは、Arduino 0021でしか動作確認しておりません。
Arduino1.0も同じでいいのか、、確認してみます。
あと、このブログ、ファイルのアップロードができないみたいで、どうしたものかと、、。
by kenkenpa (2012-01-26 21:44)
ATtiny13を使って、初めて自作をしたいと思っているんですが
リンクが切れていてしまって見れないです。
出来れば必要な部品と物理構成図を教えて貰えないでしょうぁ
by たかSan (2015-04-27 13:52)