ATtiny202でLチカ
2021 年 3 月 30 日
ATTiny202でLチカを
秋月電子で一個40円のATtiny202をArduino IDEからプログラムします。
先日作成した、jtag2updi経由で書き込みます。
megaTinyCore ではLED_BUILTINがPA3なので、回路図は次のようになります。
プログラムを小さくする方法
最初に普通のLチカ。Arduino IDEで、スケッチの例からblinkを選びます。
void setup() { pinMode(LED_BUILTIN, OUTPUT); } void loop() { digitalWrite(LED_BUILTIN, HIGH); delay(1000); digitalWrite(LED_BUILTIN, LOW); delay(1000); } // 636バイト(31%)
Lチカだけなのに3割もメモリーを使用してしまっています。次に、ピンのトグル機能を使って少し簡略化します。
以下の手法はtwitterで@i_juno さんに教えていただきました。
void setup() { pinMode(LED_BUILTIN, OUTPUT); } void loop() { digitalWrite(LED_BUILTIN, CHANGE); delay(1000); } // 598バイト(29%)
これだと少し小さくなりました。さらに、digitalWrite()を使わずに自分で展開します。
void setup() { pinMode(LED_BUILTIN, OUTPUT); } void loop() { PORT_t *port = digitalPinToPortStruct(LED_BUILTIN); uint8_t bit_mask = digitalPinToBitMask(LED_BUILTIN); port->OUTTGL = bit_mask; // toggle the bit delay(1000); } // 548バイト(26%)
Arduinoのdelay()の代わりに、AVRライブラリの_delay_ms()関数を呼ぶようにすれば、さらに減らせます。
#include <util/delay.h> void setup() { pinMode(LED_BUILTIN, OUTPUT); } void loop() { PORT_t *port = digitalPinToPortStruct(LED_BUILTIN); uint8_t bit_mask = digitalPinToBitMask(LED_BUILTIN); port->OUTTGL = bit_mask; // toggle the bit _delay_ms(1000); } // 368バイト(17%)
avr-libcだけで作成する
さらに節約するために、avr-libcだけを使って書いてみます。
#include <avr/io.h> #include <util/delay.h> int main() { _PROTECTED_WRITE(CLKCTRL_MCLKCTRLB, 0x00); PORTA.DIR = 1 << 3; // PA3 = OUTPUT for ( ; ; ) { PORTA.OUTTGL = 1 << 3; // toggle PA3 _delay_ms(1000); } } // 114バイト(5%)
5行めでは、CPUクロックのプリスケーラをオフにして、CPUを20MHzで動かすようにしています。
avr-libcだけを使ってプログラムを作成する場合、Arduinoのライブラリに含まれるハードウェアの初期化処理が実施されません。上記はCPUクロックスピードを設定するための最低限の設定のみです。この他、タイマーなどを使う場合にも自分で初期化する必要があります。
Arduino IDEから純粋なCのプログラム(例ではblink)を作成する場合には、ファイルを次のように配置します。
blink/blink.ino <-空のファイルで良い
blink/blink.c main()を含む上記ファイルを置く。
blink/blink.ino <-空のファイルで良い
blink/blink.c main()を含む上記ファイルを置く。
UPDIを使うこの設定ではブートローダは使用しません。ブートローダの書き込みは不要です。(Arduino IDEから「ブートローダを書き込む」を選択すると、ヒューズビットの設定だけが反映されます。)
閑話休題
ケチケチしてくると、だんだんArduino IDEを使う意味がなくなってきますね。最初からCで書いた方が、良いかもしれません。
ATTiny202は2KBメモリがあります。これまで使ってきたATTiny10とかに比べると倍ですがそれでも足りなくなることが考えられます。
- Arduinoライブラリを使わずにavr-libcだけでプログラムすることで、容量を節約できます。
- Arduinoライブラリを使わない場合にも、Ardino IDEを使うとGUIでコンパイルや書き込みの制御をできて便利です。
- 自分でハードウェアの初期化をしないと正しく動きません。
(了)