AVRマイコン開発メモ1(開発環境準備)

AVRマイコン開発メモ2(AVRプログラマ Pickit4編)
AVRマイコン開発メモ3(AVRプログラマ UPDI編)
AVRマイコン開発メモ4(Transistor Testerを作成)

電子工作している過程で、AVRマイコンにプログラムを書き込みしないといけなくなったが、全く何もわからない状態だったので試行錯誤の記録を残していく。

AVRに限った話ではないが、どのマイコン開発も以下の流れになる。

  1. コーディング
  2. コンパイル
  3. 書き込み

順番にメモっていく

開発環境の準備と流れ


AVRマイコンの開発ワークフローとしては以下の3種類じゃないかと。

Arduino IDEだとお手軽かもしれないが、情報量としては普通にCでコーディングしてavr-gccでビルドする流れが主流かと思われる。

  1. Microchip社製のツール(MPLABX, Microchip Studio)のどちらかを使って実装うして、Pickit4で書き込む

  2. LinuxまたはWindowsにGCC系のツールをインストールしてビルド、安価なプログラマを使って、ICSPまたはUPDIインタフェースで書き込む。

  3. Arduino IDEでAVR系のアドオンを入れてスケッチ上で実装から書き込みまでやる。

MicrochipのIDEを使うのが一番手間はないが、高価なPickkit4がないと開発ができないのがネック(持っているけど)。

オープンソースを拝借して書き込んだりする場合、大抵は2で作成されているものが多いので、まずは遠回りかもしれないが2でやってみることにする。(Microchip社のIDEやSDKが使いづらい。。)

GCC系ツールを使った開発(gcc-avr, avrdude)


AVR用コンパイラの準備(Win10+WSL2)

以下リポジトリではWin、Linux、Mac版を管理しているのでここから入手してパスを通す。

https://github.com/ZakKemble/avr-gcc-build

Win10版の場合、binフォルダまでのパスを環境変数PATHに追加する。

avr-gcc-12.1.0-x64-windows\bin

Linuxの場合は上記にあるスクリプトでビルドできる

> git clone https://github.com/ZakKemble/avr-gcc-build.git
> cd avr-gcc-build
> sudo chmod +x avr-gcc-build.sh
> sudo ./avr-gcc-build.sh

コマンドプロンプトからコンパイラを実行して動作するか確認しておく

> avr-gcc -v

Using built-in specs.
Reading specs from c:/users/chihiro/_workspace_/work/avr-gcc-12.1.0-x64-windows/bin/../lib/gcc/avr/12.1.0/device-specs/specs-avr2
COLLECT_GCC=avr-gcc
COLLECT_LTO_WRAPPER=c:/users/chihiro/_workspace_/work/avr-gcc-12.1.0-x64-windows/bin/../libexec/gcc/avr/12.1.0/lto-wrapper.exe
Target: avr
Configured with: ../configure --prefix=/omgwtfbbq/avr-gcc-12.1.0-x64-windows --target=avr --enable-languages=c,c++ --disable-nls --disable-libssp --disable-libada --with-dwarf2 --disable-shared --enable-static --enable-mingw-wildcard --enable-plugin --with-gnu-as --host=x86_64-w64-mingw32 --build=x86_64-pc-linux-gnu
Thread model: single
Supported LTO compression algorithms: zlib
gcc version 12.1.0 (GCC)

サンプルプログラムをビルドしてみる

// blink.c
#ifndef F_CPU
#define F_CPU 16000000UL // or whatever may be your frequency
#endif
 
#include <avr/io.h>
#include <util/delay.h>  // for _delay_ms()
 
int main(void)
{
  DDRC = 0x01;  // initialize port C
  while(1)
  {
    // LED on
    PORTC = 0b00000001;  // PC0 = High = Vcc
    _delay_ms(500);      // wait 500 milliseconds

    //LED off
    PORTC = 0b00000000;  // PC0 = Low = 0v
    _delay_ms(500);      // wait 500 milliseconds
  }
}

ソースを用意したら以下このコマンドを順番に実行して最終的に.hex作成されれば、コンパイルできる環境は整う。

ふつうはMakefileを作成してmakeコマンド一発がセオリーである。

> avr-gcc -Os -DF_CPU=16000000 -mmcu=atmega328p -o blink.elf blink.c
> avr-objcopy -O ihex blink.elf blink.hex

> ls
blink.c  blink.elf  blink.hex

とりあえずここまでできればビルド環境としてはOK。

AVRDUDEのインストール

書き込みに関してはavrdudeを使う。プログラマについては、最新のavrdudeではPickit4を使ったICSPインターフェス書き込みにも対応しており、従来方式だとUSBaspプログラマを購入、Arduino Nanoを改造したUPDIが良さそう。(これについては次回)

注意点としては、最新のAVR ATtiny202などはUPDIしかサポートしていない。上記の3種ICSP, USBasp, UPDIは抑えておく必要がある。

筆者はavrdudeで迷走しました。このツールで上記のhexファイルとかEEPROM(.eep)を書き込む。

当初、Microchip MPLABX IPE(IDEツールインストール時にオプションでインストール)でもhexファイルをPickit4で簡単に書き込むことを確認したが、EEPROM書き込みができない為、結局avrdudeに戻ってきた経緯がある。

このツールはavrdudeavrdude.confの2つで構成されている。confに定義を追加はできるが、当然ビルドしたときの機能しか動作しない。自前でビルドするとモジュールに合わせてconfファイルも生成される。

当初ICSPインタフェースで書き込みできるプログラマはPickit4しか保持しておらず、EEPROMファイルの書き込みしたかったのでavrdude+pickit4という組み合わせを模索することにした。

最初に少し古いavrdudeで試していたのが迷走の始まりで、断片的な情報をミックスして試行してうまくいかなかった。

  • 最新のavrdude-7.0でPickit4の書き込みフルサポート(ICSP,UPDI)
  • 自前でwin版をビルドしてみたが、USBライブラリ周りでビルドできず(デフォルトビルドだとusb通信方式でエラーになっていた)
  • githubから最新版のモジュールをダウンロードするのが一番確実

AVRDUDE v7.0 https://github.com/avrdudes/avrdude/releases/tag/v7.0

というしょうもないところで時間を食ってしまった。(いろいろ勉強にはなった)

具体的に書き込み行った内容については次回以降。

> avrdude
:
avrdude version 7.0, URL: <https://github.com/avrdudes/avrdude>
-->