1.きっかけ
- AVRマイコン ATTINY202-SSNR 価格:40円(税込)
2.購入
| 通販コード | 品名 | 単価 | 数量 | 小計 | 説明 |
|---|---|---|---|---|---|
| I-15731 | ATTINY202-SSNR | 40円 | 2 | 80円 | AVRマイコン ATTINY202-SSNR |
| P-05154 | AE-SOP8-DIP8 | 100円 | 1 | 100円 | SOP8(1.27㎜) DIP変換基板 金フラッシュ(9枚入) | C-04392 | PHA-1x4SG | 4円 | 10 | 40円 | 細ピンヘッダ 1x4 |
3.組み立て
| 通販コード | 品名 | 単価 | 数量 | 小計 | 説明 |
|---|---|---|---|---|---|
| I-15731 | ATTINY202-SSNR | 40円 | 2 | 80円 | AVRマイコン ATTINY202-SSNR |
| P-05154 | AE-SOP8-DIP8 | 100円 | 1 | 100円 | SOP8(1.27㎜) DIP変換基板 金フラッシュ(9枚入) | C-04392 | PHA-1x4SG | 4円 | 10 | 40円 | 細ピンヘッダ 1x4 |
どうやらavr-libcのバージョンが異なるのが原因のようです。
・binutils-2.31.tar.xz
https://www.gnu.org/software/binutils/
・gcc-8.2.0.tar.xz
https://gcc.gnu.org/
・avr-libc-2.0.0.tar.bz2
http://www.nongnu.org/avr-libc/
・avr-size用パッチ
https://gist.github.com/larsimmisch/4190960
$ mkdir $HOME/local $ export PREFIX=$HOME/local $ export PATH=$PREFIX/bin:$PATH
$ mkdir $HOME/src/avr-gcc $ cd $HOME/src/avr-gcc $ wget http://ftp.jaist.ac.jp/pub/GNU/binutils/binutils-2.31.tar.xz $ wget https://gist.github.com/larsimmisch/4190960/archive/16c6b9627f8451eeebd644a4b9a741edfdb0c45e.zip $ unzip 16c6b9627f8451eeebd644a4b9a741edfdb0c45e.zip $ tar xvf binutils-2.31.tar.xz $ cd binutils-2.31/binutils $ patch -u < ../../4190960-16c6b9627f8451eeebd644a4b9a741edfdb0c45e/avr-binutils-size.patch $ cd .. $ mkdir obj-avr $ cd obj-avr $ ../configure --prefix=$PREFIX --target=avr --disable-nls $ make -j4 $ make install
$ wget http://ftp.tsukuba.wide.ad.jp/software/gcc/releases/gcc-8.2.0/gcc-8.2.0.tar.xz $ tar xvf gcc-8.2.0.tar.xz $ cd gcc-8.2.0 $ ./contrib/download_prerequisites $ mkdir obj-avr $ cd obj-avr $ ../configure --prefix=$PREFIX --target=avr --enable-languages=c,c++ --disable-nls --disable-libssp --with-dwarf2 $ make -j4 $ make install
$ wget http://download.savannah.gnu.org/releases/avr-libc/avr-libc-2.0.0.tar.bz2 $ tar xvf avr-libc-2.0.0.tar.bz2 $ cd avr-libc-2.0.0/ $ ./configure --prefix=$PREFIX --build=`./config.guess` --host=avr $ make -j4 $ make install
# set PATH so it includes user's private bin if it exists
if [ -d "$HOME/local/bin" ] ; then
PATH="$HOME/local/bin:$PATH"
fi
どうやらavr-libcのバージョンが異なるのが原因のようです。
・binutils-2.29.1.tar.xz
https://www.gnu.org/software/binutils/
・gcc-7.2.0.tar.xz
https://gcc.gnu.org/
・gmp-6.1.2.tar.xz
https://gmplib.org/
・mpfr-3.1.6.tar.xz
http://www.mpfr.org/
・mpc-1.0.3.tar.gz
http://www.multiprecision.org/index.php?prog=mpc
・avr-libc-2.0.0.tar.bz2
http://www.nongnu.org/avr-libc/
・avr-size用パッチ
https://gist.github.com/larsimmisch/4190960
$ mkdir ~/local $ PREFIX=$HOME/local $ export PREFIX $ PATH=$PATH:$PREFIX/bin $ export PATH
$ cd ~/src/avr $ wget https://ftp.gnu.org/gnu/binutils/binutils-2.29.1.tar.xz $ tar xvf binutils-2.29.1.tar.xz $ wget https://gist.github.com/larsimmisch/4190960/archive/16c6b9627f8451eeebd644a4b9a741edfdb0c45e.zip $ unzip 16c6b9627f8451eeebd644a4b9a741edfdb0c45e.zip $ cd binutils-2.29.1/binutils $ patch -u < ../../4190960-16c6b9627f8451eeebd644a4b9a741edfdb0c45e/avr-binutils-size.patch $ cd .. $ mkdir obj-avr $ cd obj-avr/ $ ../configure --prefix=$PREFIX --target=avr --disable-nls $ make -j4 $ make install
$ cd ~/src/avr $ wget https://gmplib.org/download/gmp/gmp-6.1.2.tar.xz $ tar xvf gmp-6.1.2.tar.xz $ cd gmp-6.1.2/ $ ./configure --prefix=$PREFIX $ make -j4 $ make -j4 check $ make install
$ cd ~/src/avr $ wget http://www.mpfr.org/mpfr-current/mpfr-3.1.6.tar.xz $ tar xvf mpfr-3.1.6.tar.xz $ cd mpfr-3.1.6 $ ./configure --prefix=$PREFIX --with-gmp-build=../gmp-6.1.2 $ make -j4 $ make -j4 check $ make install
$ cd ~/src/avr $ wget ftp://ftp.gnu.org/gnu/mpc/mpc-1.0.3.tar.gz $ tar xvf mpc-1.0.3.tar.gz $ cd mpc-1.0.3 $ ./configure --prefix=$PREFIX --with-gmp=$PREFIX --with-mpfr=$PREFIX $ make -j4 $ make -j4 check $ make install
$ cd ~/src/avr $ wget http://ftp.tsukuba.wide.ad.jp/software/gcc/releases/gcc-7.2.0/gcc-7.2.0.tar.xz $ tar xvf gcc-7.2.0.tar.xz $ cd gcc-7.2.0/ $ mkdir obj-avr $ cd obj-avr $ ../configure --prefix=$PREFIX --target=avr --enable-languages=c,c++ --disable-nls --disable-libssp --with-dwarf2 --with-gmp=$PREFIX --with-mpfr=$PREFIX --with-mpc=$PREFIX $ make -j4 $ make install
$ cd ~/src/avr $ wget http://download.savannah.gnu.org/releases/avr-libc/avr-libc-2.0.0.tar.bz2 $ tar xvf avr-libc-2.0.0.tar.bz2 $ cd avr-libc-2.0.0/ $ ./configure --prefix=$PREFIX --build=`./config.guess` --host=avr $ make -j4 $ make install
■Raspberry Pi(Raspbian)でAVR開発環境を構築する手順
# apt update # apt upgrade # apt install gcc-avr binutils-avr avr-libc avrdudeRaspberry PiでAVR開発するメリットは、「ソース修正→ISP書き込み」が気軽にどこでもできるということに尽きます。Raspberry Piに移行する前はノートPCのAVR開発環境にAVRISPmkIIを接続してデバッグしていたのですが、この場合、開発対象とノートPCをAVRISPmkIIのケーブルが届く範囲に留める必要があり、結局のところ、開発対象の近くにノートPCを持っていくしかありませんでした。
1)電波が弱いため窓際でないと正しく受信できない。
2)PCが出すノイズに邪魔される。
PCの電源を落とすとだいぶ改善されるので2)の要因が大きいのだと思います。
PCなしではマイコンのデバッグができないので、電波時計モジュールのパルス出力を疑似出力する「JJYシミュレータ」なるツールをAVRマイコンで試作することにしました。
<<< JJY Simulator >>> Copyright (c) 2014 Being. Ver0.1 00M 2016/02/29 23:14 M00100101M001000011M000000110M000000110M_________M000000000M 2016/02/29 23:15 M00100110M001000011M000000110M000000110M000010110M001000000M 2016/02/29 23:16 M00100111M001000011M000000110M000000100M000010110M001000000M 2016/02/29 23:17 M00101000M001000011M000000110M000000100M000010110M001000000M 2016/02/29 23:18 M00101001M001000011M000000110M000000110M000010110M001000000M 2016/02/29 23:19 M01000000M001000011M000000110M000000110M000010110M001000000M 2016/02/29 23:20
24時間表記で時分を表示します。4桁LEDなので秒数は表示できません。 秒数は7seg LEDの小数点を点滅させることで表現します。 秒数により点滅する小数点の位置を変え、大まかな秒数が把握できるよう にします。 00-14秒:1桁目の小数点を点滅、2-4桁目は消灯 15-29秒:2桁目の小数点を点滅、1桁目は点灯、3-4桁目は消灯 30-44秒:3桁目の小数点を点滅、1-2桁目は点灯、4桁目は消灯 45-59秒:4桁目の小数点を点滅、1-3桁目は点灯
日付表示機能
Bボタンを押すと年(4桁)を表示します。 さらにBボタンを押すと月日を表示します。 さらにBボタンを押すと曜日を表示します。
日時修正機能
Aボタンを長押し(3秒)すると日時修正モードに入ります。 年→月→日→時→分→秒の順に入力します。 Bボタンを押すことにより各値がインクリメントされます。 秒修正時はBボタン押下で00秒に設定されます。 3秒間何も操作しないと時計表示モードに戻ります。(そこまでに 入力した値は反映されます) 曜日は入力しません。(年月日から自動計算されます) うるう年を認識します。(2/29はうるう年のみ入力を受け付けます)
オートディマー(減光機能)
夜間(23-06時)は減光モードになります。ボタンを押すと通常モードに なります。5秒間何も操作しないと減光モードに戻ります。
リスト1 TWI_Master.cの冒頭 修正ポイント:1~4行目、7行目を追加
リスト2 TWI_Master.cの割込みルーチン 修正ポイント:9~11行目、14行目を追加
なお、PD6端子とPB5端子がショートしないようにプログラム上でPB5端子をInputに設定しておきます。
リスト1 main.c
/*
* LED点滅プログラム(PWM制御)
*
* For AE-ATmega borad
*
* Ver0.1 2013/04/12
*/
/*
* AE-ATmega boardはPORTB bit5にLEDが接続されている。
* このLEDをPWM制御で点灯させるため、タイマ出力であるPORTD Bit6を
* LEDに接続する。(ショートしないようにPORTB bit5は入力モードに
* しておく)
*/
#include <avr/io.h>
#include <util/delay.h>
int main() {
unsigned char i = 0;
DDRB = 0x00; // PORTB bit5を入力モードにする
DDRD = _BV(DD6); // PORTD bit6を出力モードにする
/* Set 8-bit Timer Register */
TCCR0A = _BV(COM0A1) | _BV(WGM01) | _BV(WGM00);
TCCR0B = _BV(CS00);
/* タイマ設定
* clkI/O : 1MHz (= 内蔵OSC 8MHz + CLKDIV8)
* プリスケーラ: なし
* モード : Mode3 (高速PWM/0xFF)
* OC0A端子 : 非反転モードで使用
*/
while(1) {
while(i<0xFF) { // 2mSec間隔で輝度を上げていく
OCR0A = ++i;
_delay_ms(2);
}
_delay_ms(1000); // 最高輝度で1秒保持
while(i>0x00) { // 2mSec間隔で輝度を下げていく
OCR0A = --i;
_delay_ms(2);
}
_delay_ms(1000); // 最低輝度で1秒保持
}
}
動画1 点滅の様子
リスト1 main.c
/*
* LED点滅プログラム(タイマ割込み使用)
*
* For AE-ATmega board
*
* Ver. 1.0 2014/03/30
*/
#include <avr/io.h>
#include <avr/interrupt.h>
void init_timer1(void) {
/*
* タイマ設定
* 外部クロック : 20MHz (X'tal)
* CKDIV8=1 : 20MHz / 8 = 2.5MHz
* プリスケーラ : 2.5MHz / 64 = 39,062.5 Hz
* 比較レジスタ1A : 39,063 ( 39,063/ 39,062.5 = 1.000013 Hz)
* 比較レジスタ1B : 3,906
* 波形発生モード : CTC(OCR1A)
*/
/*
* 比較レジスタ1Aで1秒毎に割込みを発生させる。→LED ON
* 比較レジスタ1Bは1A割込み発生の0.1秒後に割込みが発生。→LED OFF
*/
TCCR1A = 0x00;
TCCR1B = _BV(WGM12) | _BV(CS11) | _BV(CS10);
TCCR1C = 0x00;
OCR1AH = 0x98; // 16bitレジスタなので上位バイトを先にライトする
OCR1AL = 0x97; // OCR1A=39,063=0x9897
OCR1BH = 0x0F; // OCR1B=3,906=-0x0F42
OCR1BL = 0x42;
TIMSK1 = ( _BV(OCIE1B) | _BV(OCIE1A) );
sei(); // Enable all interrupts
}
ISR(TIMER1_COMPA_vect) {
PORTB |= _BV(PB5); // LED ON
}
ISR(TIMER1_COMPB_vect) {
PORTB &= !(_BV(PB5)); // LED OFF
}
int main(void) {
DDRB = _BV(DDB5); // PORTB bit5を出力に設定
init_timer1(); // タイマ初期化
while(1); // 無限ループ(割込み待ち)
}
| # apt-get install gcc-avr # apt-get install binutils-avr # apt-get install avr-libc # apt-get install avrdude |
リスト1 blink_LED.c
/*
* LED 点滅プログラム
*
* K-04590 (ATMEGA168/328用マイコンボード)
*
*/
#include <avr/io.h>
#include <util/delay.h>
#define PB5_LED 5 // H: LED ON | L: LED OFF
int main(void) {
DDRB = _BV(PB5_LED); // Port B bit 5の方向を出力に設定
PORTB |= _BV(PB5_LED); // Port B bit 5にHを出力(LED点灯)
while (1) {
_delay_ms(500); // 0.5秒待つ
PORTB ^= _BV(PB5_LED); // Port B bit5を0/1反転
}
}
0.5秒毎にLED点灯、LED消灯を繰り返すプログラムです。_delay_ms()や_BV()はavr-libcで定義されています。詳細は"AVR Libc Home Page"に説明があります。
リスト2 Makefile
PROG=blink_LED
OBJS=${PROG}.o
MCU=atmega168p
F_CPU=1000000UL # internal 8MHz clock & CKDIV8 fuse bit enabled
#--------
ELF=$(PROG)
IHEX=$(PROG).ihex
CC=avr-gcc
CFLAGS=-g2 -O1 -mmcu=$(MCU) -DF_CPU=$(F_CPU) -Wall
LDFLAGS=-g2 -mmcu=$(MCU)
OBJCOPY=avr-objcopy
all: $(IHEX)
$(IHEX): $(ELF)
$(ELF): $(OBJS)
%.ihex: %
$(OBJCOPY) -j .text -j .data -O ihex $< $@
clean:
-$(RM) $(ELF) $(IHEX) $(OBJS)
flash:
sudo avrdude -c avrispmkII -P usb -p atmega168p -U flash:w:$(IHEX)
.PHONY: all clean
Makefileを書くのは正直苦手で適当に書いています。(すみません)
リスト3 コンパイル&マイコン書き込み
$ make
avr-gcc -g2 -O1 -mmcu=atmega168p -DF_CPU=1000000UL -Wall -c -o blink_LED.o blink_LED.c
avr-gcc -g2 -mmcu=atmega168p blink_LED.o -o blink_LED
avr-objcopy -j .text -j .data -O ihex blink_LED blink_LED.ihex
$ make flash
sudo avrdude -c avrispmkII -P usb -p atmega168p -U flash:w:blink_LED.ihex
avrdude: AVR device initialized and ready to accept instructions
Reading | ################################################## | 100% 0.01s
avrdude: Device signature = 0x1e940b
avrdude: NOTE: FLASH memory has been specified, an erase cycle will be performed
To disable this feature, specify the -D option.
avrdude: erasing chip
avrdude: reading input file "blink_LED.ihex"
avrdude: input file blink_LED.ihex auto detected as Intel Hex
avrdude: writing flash (166 bytes):
Writing | ################################################## | 100% 0.05s
avrdude: 166 bytes of flash written
avrdude: verifying flash memory against blink_LED.ihex:
avrdude: load data flash data from input file blink_LED.ihex:
avrdude: input file blink_LED.ihex auto detected as Intel Hex
avrdude: input file blink_LED.ihex contains 166 bytes
avrdude: reading on-chip flash data:
Reading | ################################################## | 100% 0.05s
avrdude: verifying ...
avrdude: 166 bytes of flash verified
avrdude: safemode: Fuses OK
avrdude done. Thank you.
$
debianマシンにAVRISPmkII経由でAVRマイコンボードを接続し、"make flash"と入力すればマイコンにプログラムが書き込まれます。