Ubuntu17.10でAVR開発環境の構築
ATtiny13AでLチカさせてみます. 次のブログを参考にさせていただきました.
こんな感じのやつを前に作業しました.
準備
つかうもの一覧
- ATtiny13A (DIP)
- AVRISP mk2 (ライタ)
- 3V電源
- Ubuntu17.10がインストールされたPC
- ブレットボートとかジャンパ線とか
環境構築(ハードウェア)
AVRISP mk2 のピン配置
ATtiny13A のピン配置
いざ配線
PB4の先にLEDをつけておく.ブレッドボード後ろの方に3Vの三端子レギュレータがあります.
環境構築(ソフトウェア)
avrdudeのインストール
これを使ってマイコンに書き込みを行う.
# apt-get install avrdude
ライタをPCに接続して次のように実行してみる.(avrdude
の実行には権限が必要だろう.)
# avrdude -c avrisp2 -p t13 avrdude: AVR device initialized and ready to accept instructions Reading | ################################################## | 100% 0.00s avrdude: Device signature = 0x1e9007 (probably t13) avrdude: safemode: Fuses OK (E:FF, H:FF, L:6A) avrdude done. Thank you.
うまく行けばライタが少し光って上のように表示されるはず.-c
でライタを指定(今回はAVRISP mk2なのでavrisp2
),-p
でマイコンの型番を指定(t13
しかなかった)(指定しないと型番一覧が表示される).
-v
オプションをつけると,より詳細な状態が表示されるようだ.
コンパイラ・ライブラリのインストール
コンパイラとライブラリをインストールする
# apt-get install gcc-avr binutils-avr avr-libc
これらのドキュメントは次を参照されたい https://www.nongnu.org/avr-libc/user-manual/index.html
Lチカさせてみる
プログラムの作成
$ cat led.c
#include <avr/io.h> #include <util/delay.h> int main() { DDRB = _BV(PB4); // PB4だけ出力 PORTB = ~_BV(PB4); // PB4以外内部プルアップ while(1) { PORTB ^= _BV(PB4); // 点滅 _delay_ms(1000); // 1秒待つ } return 0; }
マクロとかは次のサイトを参考にした. IOポート、Cのマクロ | 始めるAVR
コンパイル・転送
$ avr-gcc -mmcu=attiny13 -O -DF_CPU=1000000UL led.c -o led.out
ATtiny13は初期状態で内部クロックが1MHzであるらしいので,それをコンパイラに伝える(delayとかに必要).
そして転送する.
# avrdude -c avrisp2 -p t13 -U flash:w:led.out:e
これでATtiny13AのFlashメモリにプログラムが書き込まれたことになり,めでたくPB4に接続したLEDが点滅するはずです!
電源を入れ直しても点滅するよ.
動作周波数を変えてみる
今まで初期状態の1MHz(8MHzの8分周)内蔵オシレータを使っていたが,より省電力にするために128KHzにしてみる.
ヒューズlfuse
の値を変えることで周波数を変えることができる.
# avrdude -e -c avrisp2 -p t13 -U lfuse:w:0x7B:m
遅くした後はライタの周波数が相対的に速くなってしまいうまく書き込めないので,avrdude
は-B
オプションをつけて適切な速度になるように調整する. 128KHzだと-B 100
でうまく行った.大きい値にしすぎると転送に時間がかかってしまう.
ヒューズの値などの詳細は先の資料に詳しい.
おわりに
CLI前提で環境構築してみました.もっと強い環境もあると思うので,いろいろ調べていきたい.