| # apt-get install gcc-avr # apt-get install binutils-avr # apt-get install avr-libc # apt-get install avrdude |
LED点滅プログラムについて
ATmega168/328マイコンボード回路図を見るとマイコンのPB5端子の先にLEDが接続されています。PB5にHを出力すればLEDが点灯します。このLEDを点滅するプログラムを書いてみます。
リスト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"に説明があります。
F_CPUについて
_delay_ms()を使うには事前にマクロ"F_CPU"を定義しておく必要があります。F_CPUにはCPUのクロック周波数を設定します。ソースコードの中に書いても良いのですが、ここではMakefileの中に定義しました。マイコンのクロック周波数は1MHzです。これは工場出荷時はクロックソースとしてマイコン内蔵オシレータ(8MHz)が選択されており、さらにCKDIV8オプションが設定されているため、1MHz(=8MHz÷8)になっているためです。したがってF_CPU=1000000を設定します。
リスト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"と入力すればマイコンにプログラムが書き込まれます。
0 件のコメント:
コメントを投稿