「AVR」の版間の差分
(en:AVR の翻訳の開始) |
細 (英語版に同期し翻訳ステータスを付与) |
||
(2人の利用者による、間の5版が非表示) | |||
1行目: | 1行目: | ||
[[カテゴリ:開発]] |
[[カテゴリ:開発]] |
||
[[en:AVR]] |
[[en:AVR]] |
||
+ | [[Wikipedia:AVR_microcontrollers|AVR]] は Microchip Technology 社 (以前は Atmel 社でしたが買収されました)によって開発されているマイクロコントローラ (MCU) の一種です。 AVR は [[Arduino]] プロジェクトに代表される様に、とりわけホビーや教育用途で広まっています。このページでは、これらのMCUの8ビットシリーズを扱います。 |
||
− | [[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. |
||
− | == |
+ | == ツールチェイン == |
+ | ツールチェインと GNU コンパイラのために {{Pkg|avr-gcc}} を[[インストール]]して下さい。 |
||
− | Install {{Pkg|avr-gcc}} to get toolchain and GNU compiler. |
||
+ | == プログラマー (書込器) == |
||
− | == Programmers == |
||
− | + | 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 |
+ | === udev ルール === |
+ | {{Pkg|avrdue}} を root 権限なしで動かすには次の様な [[Udev]] ルールを作ってください。この udev ルールによって、指定の USB デバイスを取り扱う権限を他のグループに移します ({{ic|uucp}} がこの手の処理によく使われます)。 |
||
− | 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. |
||
+ | {{hc|/etc/udev/rules.d/99-avrprogrammer.rules|2= |
||
− | == Usage == |
||
+ | # Set group for a programmer matching with vendor and product IDs |
||
+ | SUBSYSTEM=="usb", ATTRS{idVendor}=="''your Vendor ID''", ATTRS{idProduct}=="''your Product ID''", GROUP="uucp", MODE="0666" |
||
+ | }} |
||
+ | イタリック表記の部分は、使っているプログラマーのベンダーとプロダクト ID ({{Pkg|usbutils}} パッケージにある {{ic|lsusb}} コマンドを使って特定できます) に置き換えて、また、{{ic|uucp}} グループはあなたの補助グループに置き換えてください。 |
||
− | 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 (サポートされる MCU のリストは {{man|1=1|2=avr-gcc|3=mmcu=}} にあります) と動作周波数を指定する必要があります: |
||
$ 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 == |
||
− | === |
+ | === 最適化 === |
− | + | 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}} があります。 |
|
− | === |
+ | === Makefile のサンプル === |
− | + | 大きなプロジェクトを管理することは面倒で、 Makefile による管理は非常に有効です。 [https://www.avrfreaks.net/sites/default/files/Makefile.txt AVRfreaks] を元にしたサンプルを、ここで紹介します。 |
|
CC = avr-gcc |
CC = avr-gcc |
||
133行目: | 140行目: | ||
$(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. |
||
− | == |
+ | == 参照 == |
* [[Arduino]] |
* [[Arduino]] |
||
* https://www.microchip.com/design-centers/8-bit/avr-mcus |
* https://www.microchip.com/design-centers/8-bit/avr-mcus |
||
+ | |||
+ | {{TranslationStatus|AVR|2024-08-17|790657}} |
2024年8月17日 (土) 15:05時点における最新版
AVR は Microchip Technology 社 (以前は Atmel 社でしたが買収されました)によって開発されているマイクロコントローラ (MCU) の一種です。 AVR は Arduino プロジェクトに代表される様に、とりわけホビーや教育用途で広まっています。このページでは、これらのMCUの8ビットシリーズを扱います。
目次
ツールチェイン
ツールチェインと GNU コンパイラのために avr-gcc をインストールして下さい。
プログラマー (書込器)
AVR チップへ作成したプログラムを書き込むためには、プログラマーと、それを行うソフトウェアが必要です。有名なプログラマーには USBaspやAVRISP mkII、Atmel-ICE、STK500があります。 LPT ポートで動く単純な DIY プログラマーである AVR-PG2B などもあります。 avrdude は、これらも含めて多くのプログラマーをサポートします。
udev ルール
avrdue を root 権限なしで動かすには次の様な Udev ルールを作ってください。この udev ルールによって、指定の USB デバイスを取り扱う権限を他のグループに移します (uucp
がこの手の処理によく使われます)。
/etc/udev/rules.d/99-avrprogrammer.rules
# Set group for a programmer matching with vendor and product IDs SUBSYSTEM=="usb", ATTRS{idVendor}=="your Vendor ID", ATTRS{idProduct}=="your Product ID", GROUP="uucp", MODE="0666"
イタリック表記の部分は、使っているプログラマーのベンダーとプロダクト ID (usbutils パッケージにある lsusb
コマンドを使って特定できます) に置き換えて、また、uucp
グループはあなたの補助グループに置き換えてください。
使い方
AVR チップのために C 言語のプログラムをコンパイルするには、 avr-gcc
が使えます。ここでは例として、 ATmega8A を 8 MHz で動かすことを考えます。目的の MCU (サポートされる MCU のリストは avr-gcc(1) § mmcu= にあります) と動作周波数を指定する必要があります:
$ 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 ユーティリティが使えます。これはタイマーや周波数などの制御レジスタのパラメータの計算に役立ちます。