AVRマイコンの内部情報を知る
<!-- markdown-mode-on -->
# **概要**
1. SPI端子を使ってATmega328の内部情報(ヒューズビットやフラッシュ、EEPROMなど)へアクセスするための`avrdude`コマンドについて、使い方をまとめておきます。<br>`avrdude`は、AVRマイコンにプログラムや設定(ヒューズビットなど)を書き込んだり、読み出したりするために広く使われている**コマンドラインツール**です。
2. `avrdude`コマンドをGUIで使う**AVRDUDESS**について紹介しまう。
3. また、同様の機能のツール`ser_prog.ino`が下記の引用元で紹介されています。覚えとして使い方を書いておきます。
<figure class="blogcard b-link"><a aria-label="記事詳細へ(別窓で開く)" href="https://hello.world.coocan.jp/ARDUINO9/arduino9_4.html" rel="noopener noreferrer" target="_blank"><div class="blogcard-content"><div class="blogcard-image bi-link"><div class="blogcard-image-wrapper biw-link"><img alt="Electronic DIY with Arduino" height="100" loading="lazy" src="https://capture.heartrails.com/382x200?https://hello.world.coocan.jp/ARDUINO9/arduino9_4.html" width="100"></div></div><div class="blogcard-text"><p class="blogcard-title bt-link">Electronic DIY with Arduino</p><p class="blogcard-description bd-link"></p></div></div><div class="blogcard-footer bf-link"> <img alt="ファビコン" height="16" loading="lazy" src="https://www.google.com/s2/favicons?domain=https://hello.world.coocan.jp/ARDUINO9/arduino9_4.html" width="16">hello.world.coocan.jp</div></a></figure>
<a name="more"></a>
# **本文**
## `avrdude`
`avrdude`は、AVRマイコンにプログラムや設定(ヒューズビットなど)を書き込んだり、読み出したりするために広く使われている**コマンドラインツール**です。Arduino IDEも内部でこのツールを使用しています。
以下に、`avrdude`コマンドの基本的な使い方と重要なオプションについて説明します。
-----
### 💻 Avrdudeの基本構文
`avrdude`コマンドは、主に以下の基本構文で構成されます。
```bash
avrdude -c <プログラマID> -p <マイコンID> [その他のオプション...]
```
### 必須オプション
| オプション | 説明 | 例 |
| :--- | :--- | :--- |
| **`-c <プログラマID>`** | <b>使用する書き込み装置(プログラマ)</b>を指定します。 | `-c arduino` (Arduino as ISPの場合) |
| **`-p <マイコンID>`** | **ターゲットとなるAVRマイコンの種類**を指定します。 | `-p atmega328p` (Arduino Unoの場合) |
### よく使われるプログラマID(`-c`)の例
| ID | 意味 |
| :--- | :--- |
| `arduino` | Arduino Uno/Megaなどに`ArduinoISP`スケッチを書き込んだもの |
| `avrisp` | Atmel AVR ISP (シリアルポート接続の古いプログラマ) |
| `usbasp` | USBaspなどのUSB接続のプログラマ |
### よく使われるマイコンID(`-p`)の例
| ID | 意味 |
| :--- | :--- |
| `atmega328p` | ATmega328P (Arduino Uno/Nano) |
| `atmega2560` | ATmega2560 (Arduino Mega) |
| `attiny85` | ATtiny85 |
-----
### 💾 書き込み/読み出しの操作オプション (`-U`)
プログラム(ファームウェア)、ヒューズビット、EEPROMなどの操作は、<b>`-U`</b>オプションを使用して実行します。
#### `-U`オプションの書式
```bash
-U <メモリの種類>:<操作>:<ファイル名>[:<データ形式>]
```
| 部分 | 説明 | 例 |
| :--- | :--- | :--- |
| **`<メモリの種類>`** | 操作対象のメモリを指定します。 | `flash` (プログラムメモリ), `eeprom`, `lfuse` (ローヒューズ), `hfuse` (ハイヒューズ), `efuse` (拡張ヒューズ), `lock` (ロックビット) |
| **`<操作>`** | 実行する操作を指定します。 | `w` (書き込み: **W**rite), `r` (読み出し: **R**ead) |
| **`<ファイル名>`** | 書き込み/読み出しに使用するファイル、または値(ヒューズの場合)を指定します。 | `my_program.hex`, `0xFF` |
| **`<データ形式>`** | ファイルの形式を指定します。ヒューズの場合は`m`(即値)を使います。 | `i` (Intel Hex), `s` (Motorola S-Record), `m` (即値/ヒューズ値) |
-----
### 💡 よく使われるコマンド例
#### 1\. プログラム(Flash)の書き込み
`my_program.hex`というファイルをATmega328Pに書き込みます。
```bash
avrdude -c arduino -p atmega328p -P <COMポート> -U flash:w:my_program.hex:i
```
* **`-P <COMポート>`**: シリアル接続のプログラマの場合、接続されている**COMポート**(Windowsでは`COM3`、Mac/Linuxでは`/dev/ttyACM0`など)を指定します。
* **`:i`**: ファイル形式が**Intel Hex**であることを示します。
#### 2\. ヒューズバイトの読み出し
ATmega328Pのヒューズバイト(ロー、ハイ、拡張)を読み出し、画面に表示します。
```bash
avrdude -c usbasp -p atmega328p -U lfuse:r:-:h -U hfuse:r:-:h -U efuse:r:-:h
```
* **`:r`**: 読み出し(Read)操作。
* **`:-`**: 出力先がファイルではなく<b>標準出力(画面)</b>であることを示します。
* **`:h`**: 読み出し結果を**16進数**で表示します。
#### 3\. ヒューズバイトの書き込み
ATmega328Pのローヒューズバイトを`0xFF`に、ハイヒューズバイトを`0xDE`に設定します。
```bash
avrdude -c usbasp -p atmega328p -U lfuse:w:0xFF:m -U hfuse:w:0xDE:m
```
* **`:w`**: 書き込み(Write)操作。
* **`:m`**: 指定した値が<b>即値(Hex値)</b>であることを示します。
#### 4\. チップ全体(Flash, EEPROM)の消去
チップイレーズ(マイコン全体を消去)を実行します。
```bash
avrdude -c usbasp -p atmega328p -e
```
* **`-e`**: <b>チップ消去(Erase)</b>オプション。
-----
### ⚠️ その他の重要なオプション
| オプション | 説明 |
| :--- | :--- |
| **`-P <ポート>`** | プログラマが接続されているポート(COMポートやUSBデバイス名)を指定します。USBaspなどのUSBプログラマでは通常不要です。 |
| **`-F`** | **マイコン署名(Signature)の不一致を無視**して実行します。非推奨ですが、一部のクローンボードなどで必要になる場合があります。 |
| **`-B <遅延>`** | プログラミング速度を調整します。数値が大きいほど**速度が遅く**なります(ワイヤーが長い場合や低速クロックのマイコンに有効)。単位はマイクロ秒です。 |
|**`-v <詳細>`**|通常の実行では最低限の情報しか表示されませんが、-v を付けると プログラマとの通信ログや設定内容が表示されます。<br>複数回指定可能で、 -v -v のように繰り返すと出力がどんどん詳細になります。|
## AVRDUDESS
<object data="https://gh-card.dev/repos/ZakKemble/AVRDUDESS.svg?link_target=_blank" type="image/svg+xml"></object>
## `ser_prog.ino`
このツール(スケッチ)を使用する際の、書き込み装置(ホストArduino)とターゲットマイコン(書き込まれる側)の設定およびArduino IDE側の設定は以下の通りです。
---
### 1. 📝 書き込み装置(ホストArduino)の設定
書き込み装置となるArduinoボード(例: Arduino Uno, Megaなど)には、この`ser_prog.ino`スケッチを**そのまま書き込んでください**。
このスケッチを書き込むことで、書き込み装置は、PCからのシリアルコマンド(`dmpb`、`wrfl`など)を受け取り、それに応じて**ターゲットマイコンへSPI通信(ICSP)でコマンドを送信する**シリアルプログラマーとして機能するようになります。
---
### 2. 🔌 配線(接続)の設定
書き込み装置とターゲットマイコンは、<b>ICSP(In-Circuit Serial Programming)</b>と呼ばれる標準的な配線で接続する必要があります。
| ホスト (書き込み装置) のピン | ターゲットマイコンのピン | 略称 | 役割 |
| :--- | :--- | :--- | :--- |
| **D13** (SCK) | **SCK** | Serial Clock | クロック信号 |
| **D12** (MISO) | **MISO** | Master In, Slave Out | ターゲットからのデータ |
| **D11** (MOSI) | **MOSI** | Master Out, Slave In | ホストからのデータ |
| **D10** (RESO) | **RESET** | Reset | ターゲットのリセット制御 |
| **GND** | **GND** | Ground | 接地 |
| **5V** | **VCC / VDD** | 電源 | ターゲットへの電源供給(※)|
> ※ **電源に関する注意**: ターゲットへの電源供給(5V)は、ホストの5Vピンから供給できますが、ターゲットの消費電流に注意してください。ターゲットが安定して動作するよう、適切な電源を確保してください。
---
### 3. 🖥️ Arduino IDE側の設定
このツールを使用する場合、Arduino IDEは**単なるシリアルターミナル**として使用します。通常のマイコンへのプログラム書き込み手順とは異なります。
#### ① ボード、書き込み装置の設定
このスケッチは、ホストArduinoが**自律的なシリアルプログラマー**として動作するため、IDE側のツールメニューにある以下の設定は**無視**して構いません。
* **ボード**: **ホストArduinoのボード名**を設定したままにします。(例: Arduino Uno)
* **書き込み装置**: **何を設定しても使用しません**。
* **Arduino as ISP**などの書き込み装置の設定は、IDEがAVRdudeを介してプログラムを書き込む際に使用されますが、このツールではIDEを書き込み装置として使用しないため、**関係ありません**。
#### ② 操作手順
1. **ホストArduinoに`ser_prog.ino`を書き込む**。
2. **ターゲットマイコンをホストに接続する**(上記の配線図を参照)。
3. Arduino IDEの**シリアルモニタ**を開く。
* **ボーレート**をスケッチの初期設定に合わせて**9600 bps**に設定してください。
4. シリアルモニタの入力欄に、このスケッチで定義されているコマンド(例: `entr`、`dmpb`、`chiperase`など)を入力して実行します。
| コマンド | 役割 |
| :--- | :--- |
| `entr` | シリアルプログラミングモードに入る |
| `dmpb` | ヒューズ、ロック、署名などのバイトをダンプ(表示)する |
| `chiperase` | ターゲットマイコンのフラッシュを消去する |
| `wrfl,XX` | ローヒューズバイトを`XX`に書き込む |
| `help` | 利用可能なコマンド一覧を表示する |
この方法により、Arduino IDEのシリアルモニタを通じて、直接ターゲットマイコンの**ヒューズビットの確認や設定**、**チップ全体の消去**などを行うことができます。
## 関連リンク