「AVR」の版間の差分

提供: ArchWiki
ナビゲーションに移動 検索に移動
(en:AVR の翻訳の開始)
 
(全て訳出。 英語版 620348 と同期。)
1行目: 1行目:
 
[[カテゴリ:開発]]
 
[[カテゴリ:開発]]
 
[[en:AVR]]
 
[[en:AVR]]
[[Wikipedia:AVR_microcontrollers|AVR]] is a family of microcontrollers (MCUs) developed by Microchip Technology (former AVR). AVRs are especially common in hobbyist and educational embedded applications, popularized by [[Arduino]] project. This page deals with 8-bit series of these MCUs.
 
   
  +
[[Wikipedia:AVR_microcontrollers|AVR]] は Microchip Technology 社 (以前は Atmel 社でしたが買収されました)によって開発されているマイクロコントローラ (MCU) の一種です。 AVR は [[Arduino]] プロジェクトに代表される様に、とりわけホビーや教育用途で広まっています。このページでは、これらのMCUの8ビットシリーズを扱います。
== Toolchain ==
 
   
  +
== ツールチェイン ==
Install {{Pkg|avr-gcc}} to get toolchain and GNU compiler.
 
   
  +
ツールチェインと GNU コンパイラのために {{Pkg|avr-gcc}} を[[インストール]]して下さい。
== Programmers ==
 
To flash compiled firmware to the AVR chip you will need programmer and software to rule it. Most popular programmers are [https://www.fischl.de/usbasp USBasp], [https://www.microchip.com/DevelopmentTools/ProductDetails/PartNO/ATAVRISP2 AVRISP mkII], [https://www.microchip.com/DevelopmentTools/ProductDetails/ATATMEL-ICE Atmel-ICE] and [https://www.microchip.com/DevelopmentTools/ProductDetails/PartNO/ATSTK500 STK500]. [https://www.olimex.com/Products/AVR/Programmers/AVR-PG2B There is] also exists the simplest DIY-programmer which works with LPT port. {{Pkg|avrdude}} supports them all great.
 
   
  +
== プログラマー (書込器) ==
=== udev issues ===
 
  +
AVR チップへ作成したプログラムを書き込むためには、プログラマーと、それを行うソフトウェアが必要です。有名なプログラマーには [https://www.fischl.de/usbasp USBasp]や[https://www.microchip.com/DevelopmentTools/ProductDetails/PartNO/ATAVRISP2 AVRISP mkII]、[https://www.microchip.com/DevelopmentTools/ProductDetails/ATATMEL-ICE Atmel-ICE]、[https://www.microchip.com/DevelopmentTools/ProductDetails/PartNO/ATSTK500 STK500]があります。 LPT ポートで動く単純な DIY プログラマーである [https://www.olimex.com/Products/AVR/Programmers/AVR-PG2B AVR-PG2B] などもあります。 {{Pkg|avrdude}} は、これらも含めて多くのプログラマーをサポートします。
   
  +
=== udev の問題 ===
If you're using AVRISP mkII or USBasp programmers please consider installing {{AUR|avrisp-udev}} and/or {{AUR|usbasp-udev}} respectively to be able to run avrdude without superuser rights.
 
   
  +
AVRISP mkII や USBasp プログラマーを使う場合には、 {{AUR|avrisp-udev}} や {{AUR|usbasp-udev}} をインストールすることも考えて下さい。 avrdude を root 特権なしで動かすことが出来ます。
== Usage ==
 
   
  +
== 使い方 ==
To compile C program for AVR chip (let's consider ATmega8A running at 8 MHz as example) you can use {{ic|avr-gcc}} directly. You should only specify target MCU (full list of supported MCUs could be found in avr-gcc man page) and it's working frequency:
 
  +
  +
AVR チップのために C 言語のプログラムをコンパイルするには、 {{ic|avr-gcc}} が使えます。ここでは例として、 ATmega8A を 8 MHz で動かすことを考えます。目的の MCU と動作周波数を指定する必要があります:
   
 
$ avr-gcc -DF_CPU=8000000UL -mmcu=atmega8a -std=gnu99 main.c -o main.elf
 
$ avr-gcc -DF_CPU=8000000UL -mmcu=atmega8a -std=gnu99 main.c -o main.elf
   
  +
avrdude は、直接 ELF ファイルを読む事ができますが、 次の様に Intel HEX 形式に変換することもできます:
avrdude is smart enough to work with the resulting ELF file but you can convert it explicitly to Intel HEX:
 
   
 
$ avr-objcopy -O ihex -j .text -j .data main.elf main.hex
 
$ avr-objcopy -O ihex -j .text -j .data main.elf main.hex
   
  +
書き込むファイルが出来たら、 書き込み先の flash ROM を指定して、 avrdude を実行します。ここでは AVRISP mkII を例に取って、安全のため書き込み周波数を 125 kHz に小さくして書き込みます:
Then run avrdude and specify flash ROM as destination for formware burning (in this example AVRISP mkII is used and clock speed is lowered to the 125 kHz to be on safe side):
 
   
 
$ avrdude -p atmega8 -c avrispmkII -B 125kHz -U flash:w:main.hex
 
$ avrdude -p atmega8 -c avrispmkII -B 125kHz -U flash:w:main.hex
   
  +
これで完了です。 他には、 avrdude は EEPROM や fuse への書き込みもサポートします。例えば、low fuse と high fuse それぞれに 0x9F と 0xD1 を書き込むには、次のようにします:
That's all. Among other things avrdude can work with EEPROM memory, fuse and lock bits. For example, to set up low and high fuses to the 0x9F and 0xD1 respectively use the following incantation:
 
   
 
$ avrdude -p atmega8 -c avrispmkII -B 125kHz -U lfuse:w:0x9F:m -U hfuse:w:0xD1:m
 
$ avrdude -p atmega8 -c avrispmkII -B 125kHz -U lfuse:w:0x9F:m -U hfuse:w:0xD1:m
   
  +
ISP プログラミングの時には、 MCU の動作周波数の 1/8 を越えないように気を付けてください。多くの新しいチップでは 1 MHz の設定で販売されているので、 125 kHz の書き込み速度にするのがよいでしょう。
Just remember that ISP programming speed shouldn't exceed 1/8 of MCU's working frequency. A lot of new chips comes with 1 MHz speed settings so using 125 kHz as starting value should be fine enough.
 
   
  +
== ヒントとテクニック ==
== Tips and tricks ==
 
   
=== Optimization ===
+
=== 最適化 ===
   
Because AVRs come with tight flash ROM size and relatively weak CPUs you can consider some optimizations to improve space usage and overall performance of your device. It's common practice to enable GCC optimization level {{ic|-Os}} and turn on some extra features: {{ic|-funsigned-char -funsigned-bitfields -fpack-struct -fshort-enums}}. To exclude unnecessary library references perform garbage collection: {{ic|-ffunction-sections -fdata-sections -Wl,--gc-sections}}.
+
AVR は小さな flash ROM サイズと非力な CPU で構成されているので、 ROM サイズの縮小や性能の向上のために最適化も考慮すると良いでしょう。 GCC の最適化レベルの指定 {{ic|-Os}} や他の機能 {{ic|-funsigned-char -funsigned-bitfields -fpack-struct -fshort-enums}} を使う事がよく知られた方法です。必要のないライブラリへの参照を除くためやガベージコレクションを使うためには、 {{ic|-ffunction-sections -fdata-sections -Wl,--gc-sections}} があります。
   
=== Sample Makefile ===
+
=== Makefile のサンプル ===
   
Managing huge project could be tedious and Makefile workflow is the most efficient way to deal with it. Here are sample Makefile based on [https://www.avrfreaks.net/sites/default/files/Makefile.txt AVRfreaks] version:
+
大きなプロジェクトを管理することは面倒で、 Makefile による管理は非常に有効です。 [https://www.avrfreaks.net/sites/default/files/Makefile.txt AVRfreaks] を元にしたサンプルを、ここで紹介します。
   
 
CC = avr-gcc
 
CC = avr-gcc
133行目: 134行目:
 
$(REMOVE) $(TARGET).hex $(TARGET).elf $(OBJ) $(LST) *~
 
$(REMOVE) $(TARGET).hex $(TARGET).elf $(OBJ) $(LST) *~
   
  +
=== 制御レジスタ値の計算 ===
=== Calculating control register values ===
 
   
  +
プロジェクト開発速度の向上のために、 {{AUR|avrcalc}} ユーティリティが使えます。これはタイマーや周波数などの制御レジスタのパラメータの計算に役立ちます。
To speed up development of your projects you can use {{AUR|avrcalc}} utility which helps to calculate different parameters for control registers regarding timers, frequencies etc.
 
   
== See also ==
+
== 参照 ==
 
* [[Arduino]]
 
* [[Arduino]]
 
* https://www.microchip.com/design-centers/8-bit/avr-mcus
 
* https://www.microchip.com/design-centers/8-bit/avr-mcus

2020年6月16日 (火) 21:27時点における版


AVR は Microchip Technology 社 (以前は Atmel 社でしたが買収されました)によって開発されているマイクロコントローラ (MCU) の一種です。 AVR は Arduino プロジェクトに代表される様に、とりわけホビーや教育用途で広まっています。このページでは、これらのMCUの8ビットシリーズを扱います。

ツールチェイン

ツールチェインと GNU コンパイラのために avr-gccインストールして下さい。

プログラマー (書込器)

AVR チップへ作成したプログラムを書き込むためには、プログラマーと、それを行うソフトウェアが必要です。有名なプログラマーには USBaspAVRISP mkIIAtmel-ICESTK500があります。 LPT ポートで動く単純な DIY プログラマーである AVR-PG2B などもあります。 avrdude は、これらも含めて多くのプログラマーをサポートします。

udev の問題

AVRISP mkII や USBasp プログラマーを使う場合には、 avrisp-udevAURusbasp-udevAUR をインストールすることも考えて下さい。 avrdude を root 特権なしで動かすことが出来ます。

使い方

AVR チップのために C 言語のプログラムをコンパイルするには、 avr-gcc が使えます。ここでは例として、 ATmega8A を 8 MHz で動かすことを考えます。目的の MCU と動作周波数を指定する必要があります:

$ avr-gcc -DF_CPU=8000000UL -mmcu=atmega8a -std=gnu99 main.c -o main.elf

avrdude は、直接 ELF ファイルを読む事ができますが、 次の様に Intel HEX 形式に変換することもできます:

$ avr-objcopy -O ihex -j .text -j .data main.elf main.hex

書き込むファイルが出来たら、 書き込み先の flash ROM を指定して、 avrdude を実行します。ここでは AVRISP mkII を例に取って、安全のため書き込み周波数を 125 kHz に小さくして書き込みます:

$ avrdude -p atmega8 -c avrispmkII -B 125kHz -U flash:w:main.hex

これで完了です。 他には、 avrdude は EEPROM や fuse への書き込みもサポートします。例えば、low fuse と high fuse それぞれに 0x9F と 0xD1 を書き込むには、次のようにします:

$ avrdude -p atmega8 -c avrispmkII -B 125kHz -U lfuse:w:0x9F:m -U hfuse:w:0xD1:m

ISP プログラミングの時には、 MCU の動作周波数の 1/8 を越えないように気を付けてください。多くの新しいチップでは 1 MHz の設定で販売されているので、 125 kHz の書き込み速度にするのがよいでしょう。

ヒントとテクニック

最適化

AVR は小さな flash ROM サイズと非力な CPU で構成されているので、 ROM サイズの縮小や性能の向上のために最適化も考慮すると良いでしょう。 GCC の最適化レベルの指定 -Os や他の機能 -funsigned-char -funsigned-bitfields -fpack-struct -fshort-enums を使う事がよく知られた方法です。必要のないライブラリへの参照を除くためやガベージコレクションを使うためには、 -ffunction-sections -fdata-sections -Wl,--gc-sections があります。

Makefile のサンプル

大きなプロジェクトを管理することは面倒で、 Makefile による管理は非常に有効です。 AVRfreaks を元にしたサンプルを、ここで紹介します。

CC = avr-gcc
OBJCOPY = avr-objcopy
SIZE = avr-size
NM = avr-nm
AVRDUDE = avrdude
REMOVE = rm -f

MCU = atmega8a
F_CPU = 8000000

LFUSE = 0x9f
HFUSE = 0xd1

TARGET = firmware
SRC = main.c lcd.c twi.c
OBJ = $(SRC:.c=.o)
LST = $(SRC:.c=.lst)

FORMAT = ihex

OPTLEVEL = s

CDEFS = 

CFLAGS = -DF_CPU=$(F_CPU)UL
CFLAGS += $(CDEFS)
CFLAGS += -O$(OPTLEVEL)
CFLAGS += -mmcu=$(MCU)
CFLAGS += -std=gnu99
CFLAGS += -funsigned-char -funsigned-bitfields -fpack-struct -fshort-enums
CFLAGS += -ffunction-sections -fdata-sections
CFLAGS += -Wall -Wstrict-prototypes
CFLAGS += -Wa,-adhlns=$(<:.c=.lst)

LDFLAGS = -Wl,--gc-sections
LDFLAGS += -Wl,--print-gc-sections

AVRDUDE_MCU = atmega8
AVRDUDE_PROGRAMMER = avrispmkII
AVRDUDE_SPEED = -B 1MHz

AVRDUDE_FLAGS = -p $(AVRDUDE_MCU)
AVRDUDE_FLAGS += -c $(AVRDUDE_PROGRAMMER)
AVRDUDE_FLAGS += $(AVRDUDE_SPEED)

MSG_LINKING = Linking:
MSG_COMPILING = Compiling:
MSG_FLASH = Preparing HEX file:

all: gccversion $(TARGET).elf $(TARGET).hex size

.SECONDARY: $(TARGET).elf
.PRECIOUS: $(OBJ)

%.hex: %.elf
        @echo
        @echo $(MSG_FLASH) $@
        $(OBJCOPY) -O $(FORMAT) -j .text -j .data $< $@

%.elf: $(OBJ)
        @echo
        @echo $(MSG_LINKING) $@
        $(CC) -mmcu=$(MCU) $(LDFLAGS) $^ --output $(@F)

%.o : %.c
        @echo $(MSG_COMPILING) $<
        $(CC) $(CFLAGS) -c $< -o $(@F)

gccversion:
        @$(CC) --version

size: $(TARGET).elf
        @echo
        $(SIZE) -C --mcu=$(AVRDUDE_MCU) $(TARGET).elf

analyze: $(TARGET).elf
        $(NM) -S --size-sort -t decimal $(TARGET).elf

isp: $(TARGET).hex
        $(AVRDUDE) $(AVRDUDE_FLAGS) -U flash:w:$(TARGET).hex

fuses:
        $(AVRDUDE) $(AVRDUDE_FLAGS) -U lfuse:w:$(LFUSE):m -U hfuse:w:$(HFUSE):m

release: fuses isp

clean:
        $(REMOVE) $(TARGET).hex $(TARGET).elf $(OBJ) $(LST) *~

制御レジスタ値の計算

プロジェクト開発速度の向上のために、 avrcalcAUR ユーティリティが使えます。これはタイマーや周波数などの制御レジスタのパラメータの計算に役立ちます。

参照