しなぷすのハード製作記

ArduinoISPを汎用AVRライタとして使う(2)

ツイート
シェア
このエントリーをはてなブックマークに追加
フォロー
目次へ  前のページへ (1) (2) (3) 次のページへ
2014年11月25日 公開。
2015年11月28日 キット版のArduino Uno用ブートローダライタシールドに関する記述を追加。

6-3.avrdudeのコマンドラインでの使い方

コマンドライン(コマンドプロンプト窓内)でのavrdudeの使い方を説明します。

6-3-1.avrdudeのコマンドラインオプション

もう一度、スタート→すべてのプログラム→アクセサリ→コマンド プロンプトを選んで、コマンド プロンプトを起動し、avrdudeと打ち込んだ後にエンターキーを押して、avrdudeを起動してください。コマンドラインオプションの一覧が表示されます。

図15、コマンドラインオプションの書式の表示
図15、コマンドラインオプションの書式の表示

avrdudeの後に、スペースと-(ハイフン)そしてアルファベット1文字を指定する事で、avrdudeに色々なコマンドラインオプション(起動オプション)を付ける事ができます。コマンドラインオプションのアルファベットは、大文字と小文字を区別します。(例:avrdude -pとavrdude -Pは異なる意味に解釈される)

コマンドラインオプションの種類によっては、アルファベットの後にさらにスペースを入力し、その後に文字列を入力します。(例:avrdude -c avrisp)

また、複数のコマンドラインオプションを同時に指定する事もできますが、その場合は、コマンドラインオプション間をスペースで区切ります。(例:avrdude -c avrisp -p COM4)

以下に、主なコマンドラインオプションの説明をします。なお、avrdudeの説明は本家avrdudeのサイトの、Documentationのページ(英文)で読めますので、詳しい情報はそちらを参照してください。

図16、avrdudeの説明書の読み方
図16、avrdudeの説明書の読み方

6-3-2.-pオプション(マイコンの型番の指定)

-pオプションは、マイコンの型番の指定を行います。-pの後に、スペースに続けて、マイコンの種類を表わす文字列を指定します。例えば、ATmega328Pのプログラムの書き込みをしたいなら、ATmega328Pを表わす文字列はm328pですので、オプションは-p m328pとなります。

表1に、主なAVRマイコンの文字列を示します。

表1、-pオプションで使う文字列
文字列 マイコンの型番
m168 ATmega168
m168p ATmega168P
m328P ATmega328P
m8 ATmega8
t44 ATtiny44
t45 ATtiny45
t84 ATtiny84
t85 ATtiny85

6-3-3.-cオプション(ライタの指定)

-cオプションは、プログラムの書き込みに使うライタ(プログラマ)の指定に使います。スペースに続けて、ライタの種類を表わす文字列を指定します。表2に、主なライタの文字列を示します。

表2、-cオプションで使う文字列
文字列 ライタの種類
avrisp Atmel AVR ISP・ArduinoISP
avrisp2 Atmel AVR ISP mkII

ArduinoISPは、AVR ISP互換ですので、-c avrispと指定しなければいけないことに注意してください。

6-3-4.-Pオプション(ポート番号の指定)

-Pオプションは、ライタを、パソコンのどのポートに接続しているか指定します。ArduinoISPの様に、仮想シリアルポートを使うライタをWindows環境で使う場合は、COM番号を指定します。例えばCOM4にライタがつながっている場合は-P COM4となります。

6-3-5.-bオプション(ボーレートの指定)

パソコンとライタが通信する時のボーレート(通信速度)を指定します。ArduinoISP(およびAVR ISP)は19200bpsで通信しますので、-b 19200と指定します。

6-3-6.-Uオプション(読み書きの実行)

-Uオプションは、AVRマイコンの内部メモリに対して、読み書きなどを実行するオプションで、書式は次のようになっています。

-U memtype:op:filename[:format]

memtypeは、操作の対象のメモリの種類を指定する部分です。表3に、主なmemtypeの文字列を示します。

表3、memtype文字列とメモリの種類
文字列 メモリの種類
eeprom EEPROM(電源を切断しても残したいデータを記憶するメモリ)
flash フラッシュメモリ(プログラムを書き込むメモリ)
fuse ヒューズバイト(ヒューズバイトが1バイトのみのマイコン用)
hfuse 上位ヒューズバイト(fuse high byte)
lfuse 下位ヒューズバイト(fuse low byte)
efuse 拡張ヒューズバイト(extended fuse byte)
lock ロックビットバイト
signature デバイスID

opは、操作の種類を表わします。表4に、opの文字列の一覧を示します。

表4、op文字列と操作の種類
文字列 操作の種類
r 指定されたメモリを読み、その内容を指定されたファイルに書き込む。
w 指定されたファイルを読み、その内容を指定されたメモリに書き込む。
v 指定されたファイルと、指定されたメモリを読み、ベリファイ(内容が一致している事の確認)を行う。

filenameはファイルの名前(パスを含めることも可)を指定する部分です。

formatはファイルの形式(フォーマット)を指定する部分で、省略する事ができます。表5に、主なformatの文字列と、その意味の一覧表を示します。

表5、format文字列とファイルのフォーマット
文字列 ファイルのフォーマット
i IntelのHex形式
s モトローラのsレコード形式
r 生バイナリーフォーマット。フラッシュメモリの場合はリトルエンディアン。
e ELF(リンカの出力ファイル形式)。入力ファイルとしてのみ指定できる。
m イミディエート(即値)モード。-Uオプションのfilenameフィールドにバイト値をコンマかスペースで指定する。値が0xで始まると16進数、0で始まると8進数、それ以外なら10進数と解釈される。このモードは、ヒューズバイトの指定の際に使うと、たった1バイトのために、わざわざファイルを作らなくて済むので、便利。
a フォーマットを自動検出する。ファイルを入力として使うときのみ指定できる。

formatを指定しないと、入力ファイルに関しては、フォーマットを自動検出します。出力ファイルに関しては、生バイナリフォーマットが選択されます。

-Uオプションの例として、フラッシュメモリの内容を読み出し、"test.hex"というファイルにIntelのHex形式で書き込む場合は、-U flash:r:test.hex:iとします。

広告

6-4.コマンドラインからavrdudeを呼び出して、ArduinoISPを使う

それでは、avrdudeをコマンドラインから呼び出して、ArduinoISPを使ってみましょう。まず、必要な機材を用意します。

6-4-1.機材の準備(Arduino Uno用ブートローダライタシールド)を使う場合

Arduino Uno用ブートローダライタシールドを使う場合は、以下の機材を用意してください。

Arduino Uno用ブートローダスケッチライタシールドキット 商品名 Arduino Uno用ブートローダスケッチライタシールドキット
税抜き小売価格 1200円
販売店 スイッチサイエンス
サポートページ

ユニバーサル基板にArduino Uno用ブートローダライタシールドを組んだ場合は、ブートローダライタシールドの使い方の手順1~手順7を実行して、Arduino UnoにArduinoISPのファームウェア(スケッチ)を書き込んでください。その後、Arduino IDEを終了してください。

Arduino Uno用ブートローダライタシールドのキット購入して組み立てた場合は、ATmega328PにArduino Unoのブートローダを書き込む方法の手順1~手順7を実行して、Arduino UnoにArduinoISPのファームウェア(スケッチ)を書き込んでください。その後、Arduino IDEを終了してください。

6-4-2.機材の準備(Arduino用ブートローダ/スケッチライタを使う場合)

Arduino用ブートローダ/スケッチライタを使う場合は、以下の機材を用意してください。

Arduino用ブートローダ/スケッチライタキット 商品名 Arduino用ブートローダ/スケッチライタキット
税抜き小売価格 2200円
販売店 スイッチサイエンス 妙楽堂
サポートページ

以下の手順で準備作業を行ってください。

【手順1】 CN1にUSBシリアル変換器が接続されていないことと、CN2にジャンパピンが付いていないことを確認する
写真1、CN1とCN2に何もつながっていないことを確認
↑ 画像をクリックすると拡大
写真1、CN1とCN2に何もつながっていないことを確認
【手順2】 SW1をArduinoISP側に切り替える
写真2、SW1をArduinoISP側に切り替える
↑ 画像をクリックすると拡大
写真2、SW1をArduinoISP側に切り替える
【手順3】 CN5~7のジャンパピンの設定を、使うAVRマイコンの種類に合わせる
写真3、ATmega168/328Pの場合
↑ 画像をクリックすると拡大
写真3、ATmega168/328Pの場合
写真4、ATtiny44/84の場合
↑ 画像をクリックすると拡大
写真4、ATtiny44/84の場合
写真5、ATtiny45/85の場合
↑ 画像をクリックすると拡大
写真5、ATtiny45/85の場合
【手順4】 USBシリアル変換器をCN1に接続し、さらにUSBケーブルでパソコンに接続する
写真6、USBシリアル変換器とUSBケーブルの接続
↑ 画像をクリックすると拡大
写真6、USBシリアル変換器とUSBケーブルの接続

6-4-3.デバイスIDを確認する

それでは、ここからは、実際にArduinoISPとavrdudeを使って、AVRマイコンに読み書きしてみましょう。ここからは、ATmega328Pを使って操作法を説明します。

まず、Arduino Uno用ブートローダライタシールドまたは、Arduino用ブートローダ/スケッチライタのZIFソケットにATmega 328Pを装着します。

写真7、Arduino Uno用ブートローダライタシールドの場合
↑ 画像をクリックすると拡大
写真7、Arduino Uno用ブートローダライタシールドの場合
写真8、Arduino用ブートローダ/スケッチライタの場合
↑ 画像をクリックすると拡大
写真8、Arduino用ブートローダ/スケッチライタの場合

次にコマンドラインから次の様に入力して、エンターキーを押してください。コマンドラインオプションは大文字と小文字で別の意味になるので、注意してください。

avrdude -c avrisp -P COM7 -b 19200 -p m328p

ただし、COM7の部分は、ArduinoISPを用いたライタが接続されているCOM番号です。私の環境ではCOM7にライタが接続されていますが、ご自分の環境に合わせて書き換えてください。これ以降の説明では、-Pオプションの部分は、全てご自分の環境に合わせて打ち換えてください。

なお、各オプションは、次の様な意味になっています。

・-c avrisp

ライタとしてArduinoISP(またはAVR ISP)を指定している。

・-P COM7

ライタが接続されているCOMポートを指定している。先ほど説明したように、COM7の部分は自分の環境に合わせて書き換える必要がある。

・-b 19200

ライタとの通信速度を19200bpsに指定している。(ArduinoISPは19200bpsで動作するように作られているため)

・-p m328p

AVRマイコンの種類をATmega328Pと指定している。

機器の接続が正常で、コマンドラインオプションの指定も間違っていなければ、次の様にDevice signature(デバイスID)が読み出されます。

図17、デバイスIDの読み出し
図17、デバイスIDの読み出し

デバイスIDとは、ライタ(とavrdudeなどのライティングソフト)が、マイコンの型番を知るための識別番号で、それぞれのマイコンに書き込まれています。このデバイスIDは、フラッシュメモリやEEPROMとは独立したメモリ空間に書き込まれています。avrdudeは、デバイスIDを確認する事で、誤って間違った型番のマイコンを挿入した場合に、プログラムの書き込みをしない仕組みになっています。

表6に、主なAVRマイコンのデバイスIDの一覧表を示します。

表6、主なAVRマイコンのデバイスID
AVRマイコンの型番 デバイスID(16進数)
ATmega168 1E9406
ATmega168P 1E940B
ATmega328P 1E950F
ATmega8 1E9307
ATtiny44 1E9207
ATtiny45 1E9206
ATtiny84 1E930C
ATtiny85 1E930B

6-4-4.ヒューズビット(ヒューズバイト)を読み出す

次にヒューズビットを読んでみます。ヒューズビットとは、例えば「外部発振器を使うか、内臓CR発振器を使うか」とか「リセットピンの機能を有効にするか、GPIOピンとして使うか」など、AVRマイコンの動作の設定を書き込む不揮発性メモリで、フラッシュメモリやEEPROMとは別のメモリ空間にあります。AVRマイコンの種類ごとに、ヒューズビットで設定する項目の内容や数が異なります。

ここで、ATmega328Pのヒューズビットについて説明します。ATmega328Pには、19のヒューズビットがあります。ヒューズビットは、8ビットずつセットで読み書きする仕組みになっていますので、3つのグループに分けてアクセスする事になります。(8ビット×3グループだと24ビットのヒューズビットが存在する事になるが、そのうち5ビットは無効ビット) これらの8ビットのヒューズビットのグループをヒューズバイトと呼びます。

3つのヒューズバイトは、下位ヒューズバイト(fuse low byte)、上位ヒューズバイト(fuse low byte)、拡張ヒューズバイト(extended fuse byte)と名づけられています。それぞれのヒューズバイトの、各ビットの意味を、表7~9に示します。

表7、ATmega328Pの下位ヒューズバイト
ヒューズビットの名称 ビット番号 説明 工場出荷時の値
CKDIV8 7 (MSB) Divide clock by8 0
CKOUT 6 Clock output 1
SUT1 5 Select start-up time 1
SUT0 4 Select start-up time 0
CKSEL3 3 Select Clock source 0
CKSEL2 2 Select Clock source 0
CKSEL1 1 Select Clock source 1
CKSEL0 0 (LSB) Select Clock source 0
表8、ATmega328Pの上位ヒューズバイト
ヒューズビットの名称 ビット番号 説明 工場出荷時の値
RSTDISBL 7 (MSB) External Reset Disable 1
DWEN 6 debugWIRE Enable 1
SPIEN 5 Enable Serial Program and
Data Downloading
0
WDTON 4 Watchdog Timer Always On 1
EESAVE 3 EEPROM memory is preserved
through the Chip Erase
1
BOOTSZ1 2 Select Boot Size 0
BOOTSZ0 1 Select Boot Size 0
BOOTRST 0 (LSB) Select Reset Vector 1
表9、ATmega328Pの拡張ヒューズバイト
ヒューズビットの名称 ビット番号 説明 工場出荷時の値
- 7 (MSB) - -
- 6 - -
- 5 - -
- 4 - -
- 3 - -
BODLEVEL2 2 Brown-out Detector trigger level 1
BODLEVEL1 1 Brown-out Detector trigger level 1
BODLEVEL0 0 (LSB) Brown-out Detector trigger level 1

これら3つのヒューズバイトの詳しい説明は、別の機会に譲りますが、後で説明するようにヒューズビットをむやみに書き換えると、プログラムやヒューズビットなどの書き換えができなくなる可能性がある事に注意してください。

これらのヒューズビットを読んでみましょう。まず、下位ヒューズバイトを読むには、コマンドラインで次の様に打ち込んでエンターキーを押します。(例によって、COM7の部分は環境により異なります)

avrdude -c avrisp -P COM7 -b 19200 -p m328p -U lfuse:r:con:h

ここで、-Uオプションは、対象メモリとして下位ヒューズバイト(lfuse)を、操作の種類として読み出し(r)を、ファイルとして標準入出力(con)を、ファイルフォーマットとして16進表記(h)を指定します。つまり、下位ヒューズバイトを読んで、その内容をコンソール画面に16進数で表示するという意味です。

標準入出力についてなじみのない方に補足しておきますが、Windows(あるいはMSDOS)環境において、拡張子なしの"con"(または"CON")というファイル名は、特別のファイルで、通常入力はキーボード、出力はコンソール画面(コマンド プロンプト窓内の画面)に割り当てられています。先ほどの-Uオプションでは、下位ヒューズバイトの値の出力先にconを選んだので、単に画面に表示します。なお、-U lfuse:r:don:hなどとタイプミスすると、"don"というファイル名のファイルができて、その中に下位ヒューズバイトの値が書き込まれます。

新品のATmega328Pをライタに装着し、先ほどのコマンドで下位ヒューズバイトを読むと、次の様になるはずです。

図18、下位ヒューズバイトの読み出し
図18、下位ヒューズバイトの読み出し

上の画面では、新品のATmega328Pの下位ヒューズバイトを読んだので、工場出荷時の値の62Hが読み出せています。(表7から、工場出荷時の値は01100010B、すなわち62Hと分かる) ブートローダやプログラムなどを書き込んだATmega328Pの下位ヒューズバイトを読んだ場合は、62H以外の値が読み出される可能性があります。

同様にして、上位ヒューズバイトや拡張ヒューズバイトも読み出せます。

上位ヒューズバイトを読むには次の様にしてください。

avrdude -c avrisp -P COM7 -b 19200 -p m328p -U hfuse:r:con:h

また、拡張ヒューズバイトを読むには次の様にしてください。

avrdude -c avrisp -P COM7 -b 19200 -p m328p -U efuse:r:con:h

新品のATmega328Pの場合は、上位ヒューズバイトがD9H、拡張ヒューズバイトが07Hになっているはずです。

また、次の様にすれば、3つのヒューズバイトを一気に読む事ができます。

avrdude -c avrisp -P COM7 -b 19200 -p m328p -U lfuse:r:con:h -U hfuse:r:con:h -U efuse:r:con:h
図19、3つのヒューズバイトの取得
図19、3つのヒューズバイトの取得

6-4-5.ロックビット(ロックビットバイト)を読み込む

AVRマイコンにはロックビットという記憶領域があります。これは、フラッシュメモリの内容や、ヒューズバイトの内容を、間違って書き換えないように、ロックするための設定を書き込む領域です。ATmega328Pの場合、ロックビットは全部で6ビットあり、これらをバイト単位(うち2ビットは無効ビット)でアクセスするため、全てのロックビットをまとめてロックビットバイトと呼びます。ロックビットバイトの各ビットの意味を、表10に示します。

表10、ATmega328Pのロックビットバイト
ロックビットの名称 ビット番号 説明 工場出荷時の値
- 7 (MSB) - -
- 6 - -
BLB12 5 Boot Lock bit 1
BLB11 4 Boot Lock bit 1
BLB02 3 Boot Lock bit 1
BLB01 2 Boot Lock bit 1
LB2 1 Lock bit 1
LB1 0 (LSB) Lock bit 1

ロックビットの働きの詳しい説明は、別の機会にします。

ロックビットを読むには、次のコマンドを実行してください。新品のATmega328Pの場合は3FHが読めるはずです。

avrdude -c avrisp -P COM7 -b 19200 -p m328p -U lock:r:con:h
図20、ロックビットの読み出し
図20、ロックビットの読み出し

6-4-6.フラッシュメモリにプログラムを書き込む

今までは、マイコンに書き込んである情報を読むばかりでしたが、いよいよフラッシュメモリに情報を書き込んでみましょう。本来は、簡単なプログラムを作成して、それを書き込む方が良かったのかも知れませんが、話が長くなりそうなので、Arduino Unoのブートローダをavrdudeを用いてATmega328Pに書き込むことにします。(ブートローダもプログラムの一種)

AVRのプログラムは、通常、拡張子が.hexのファイルに保存します。IntelのHEXフォーマットといって、かなり昔から、ROMの内容をファイル化するのに使われてきた形式のファイルです。HEXフォーマットのファイルには、ROMのアドレスや、データ本体、チェックサムなどの情報が、テキストファイルとして書き込まれています。

ブートローダを書き込むには、ブートローダの.hexファイルを入手する必要があります。例えばArduino IDEの1.0.5を、C:\arduino-1.0.5にインストールしていれば、C:\arduino-1.0.5\hardware\arduino\bootloaders\optiboot\optiboot_atmega328.hexがArduino Unoのブートローダの.hexファイルとなります。

図21、optibootの場所
図21、optibootの場所

このファイルから、そのままATmega328Pに書き込んでもいいのですが、念のため、別のフォルダにコピーしておきます。(-Uオプションを入力し間違えると、ファイルの上書きをしてしまうため) optiboot_atmega328.hexを適当な作業用フォルダにコピーしてください。私はいつもC:\tempというフォルダを作業用に使っていますので、そのフォルダを使う事を前提に話を進めます。

図22、optibootのコピー
図22、optibootのコピー

念のため、コマンド プロンプト内で、カレントフォルダ(現在のフォルダ)を作業用のC:\tempに移します。(書き込むファイルをフルパスで指定するなら、カレントフォルダを移動する必要はありませんが、コマンドラインを打ち間違えて、不用意にファイルを作成してしまうリスクを考えると、作業用フォルダにカレントフォルダを移動しておく方が無難)

図23、カレントフォルダの移動
図23、カレントフォルダの移動

なお、cdは、Change Directoryの略です。ディレクトリ(directory)はフォルダと同じ意味です。

次に、以下のコマンドを実行して、ブートローダをフラッシュメモリに書き込みます。

avrdude -c avrisp -P COM7 -b 19200 -p m328p -U flash:w:optiboot_atmega328.hex
図24、optibootの書き込み
図24、optibootの書き込み

これで.hexファイルがフラッシュメモリに書き込めました。ただし、この状態では、まだブートローダとしては機能しません。ヒューズビットとロックビットの設定が残っています。

6-4-7.ヒューズビット(ヒューズバイト)を書き込む

書き込んだプログラムを、Arduino Unoのブートローダとして機能させるには、下位ヒューズバイトにFFH、上位ヒューズバイトにDEH、拡張ヒューズバイトに05Hを書き込む必要があります。そのためには、次のコマンドを実行してください。この際に、ヒューズバイトに書き込む値を間違えると、それ以降ATmega328Pの内蔵メモリの読み出しと書き込みができなくなる可能性がありますので、十分注意してコマンドを入力してください。

avrdude -c avrisp -P COM7 -b 19200 -p m328p -U lfuse:w:0xff:m -U hfuse:w:0xde:m -U efuse:w:0x05:m
図25、ヒューズバイトの書き込み
図25、ヒューズバイトの書き込み

6-4-8.ロックビット(ロックビットバイト)を書き込む

これは、必須の作業ではありませんが、Arduino Unoのブートローダを書き込んだ後には、ロックビットバイトを0FHに設定するのが好ましいです。ロックビットバイトをデフォルトの3FHから0FHに書き換えると、Arduinoのスケッチ側から、ブートローダの読み書きが禁止されます。よって、悪意のあるスケッチを作っても、ブートローダが破壊される事がなくなります。

ロックビットバイトを0FHに書き換えるには、次のコマンドを実行してください。

avrdude -c avrisp -P COM7 -b 19200 -p m328p -U lock:w:0x0f:m
図26、ロックビットバイトの書き込み
図26、ロックビットバイトの書き込み

これで、Arduino Unoのブートローダが書き込めました。

6-4-9.フラッシュメモリを読み出してファイルに記録する

フラッシュメモリに書き込まれた情報を読み出し、.hexファイルに記録するには次のコマンドを実行します。

avrdude -c avrisp -P COM7 -b 19200 -p m328p -U flash:r:test.hex:i

こうする事で、フラッシュメモリの内容が全て読み出され、"test.hex"というファイル名の.hexファイルに記録されます。このtest.hexを別のATmega328Pに書き込めば、フラッシュメモリの内容が全てコピーできる事になります。

Arduinoのスケッチが書かれたATmega328Pのフラッシュメモリを読み出すと、ブートローダとスケッチの情報がまとめて読み出されます。その.hexファイルを別のATmega328Pに書き込めば、ブートローダとスケッチの書き込みが同時に行われるため、量産時に手間を省く事ができます。(他にもヒューズバイトとロックビットバイトの書き込みは必要)

6-4-10.プログラム書き込み時の注意事項

AVRマイコンにプログラムを書き込むときに、注意しなければならない事がいくつかあり、それを守らないとプログラムの書き換えがうまくいかない事がありますので、説明します。

6-4-10-1.フラッシュメモリ、EEPROM、ヒューズバイト、ロックビットバイトの書き込み順序に気をつける

先ほどArduino Unoのブートローダを書き込んだ際には、フラッシュメモリ、ヒューズバイト、ロックビットバイトの順で書き込みました。絶対にこの順序で書き込まなければならない訳ではありませんが、書き込み順序には気をつけるべき点があります。特に、ロックビットバイトは、フラッシュメモリやEEPROMの後に書き込むべきです

avrdudeは、デフォルトの動作では、フラッシュメモリにデータを書き込む前に、チップイレース(Chip Erase)を行います。チップイレースとは、フラッシュメモリ、EEPROMおよびロックビットバイトを消去する(全てのビットを1に初期化する)事です。(ただし、EESAVEヒューズビットが0なら、チップイレースの際にEEPROMは消去されません) チップイレースの際には、ヒューズバイトは影響を受けません。

フラッシュメモリよりロックビットを先に書き込んでしまうと、フラッシュメモリの書き込みの際に行われるチップイレースで、ロックビットが消去されてしまうので、ロックビットの書き込みが無効になります。また同様の理由から、EEPROMの書き込みをする場合も、フラッシュメモリの書き込みの後に行う必要があります。(ただし、EESAVEヒューズビットが0の場合はこの限りではない)

ロックビットバイトは、設定内容によっては、EEPROMの書き換えを禁止してしまうので、EEPROMの書き込みをする場合は、ロックビットバイトの書き込みより先に行うべきです。

ヒューズバイトはチップイレースの影響を受けないので、基本的にどのタイミングで書き込んでもいいのですが、書き込む内容によっては、ライタからの書き込み動作に影響する場合があるので不用意にRSTDISBLヒューズビットを0にしないマイコン内部のクロック発振回路を使わない設定の場合は、書き込み時にも外部の発振回路が必要の項で説明するように、書き込む順番に注意が必要な場合があります。

6-4-10-2.不用意にRSTDISBLヒューズビットを0にしない

RSTDISBLヒューズビットは、/RESETピンをリセット信号の入力に使うか、GPIOや割り込み入力などの他のヒューズビットを使うかを決めるヒューズビットです。RSTDISBLヒューズビットの意味を表11に示します。

表11、RSTDISBLヒューズビットの意味
RSTDISBLの値 意味
0 /RESET端子は、GPIOや割り込み入力などに使われ、外部リセットは受け付けない。このモードでは、ICSPによるプログラム等の書き込みはできない
1 /RESET端子は、外部からのリセット信号の入力に使われ、GPIOや割り込み入力などには使えない。(工場出荷時設定)

不用意にRSTDISBLの値を0にしてしまうと、それ以降、ICSPによるプログラム等の書き込みができなくなりますので、注意してください。(ただし、パラレルプログラマという書き込み器を使えば、RSTDISBLを1に書き戻したり、RSEDISBLが0の状態でプログラムの書き込みをしたりできる) RSTDISBLビットを含むヒューズバイト(ATmega328Pの場合は上位ヒューズバイト)を書き換える際には、書き込む値を間違わないように十分な注意が必要です。

なお、使用できるI/Oピンを1つ増やしたいなどの理由でRSTDISBLを0にしたい場合は、RSTDISBLビットを含むヒューズバイトを一番最後に書き込む必要があります。

6-4-10-3.SPIENヒューズビットを1にしない

SPIENというヒューズビットは、0の時にはICSPを用いたプログラム等の書き込み・読み込みを許可し、1の時にはそれらを禁止します。ICSPでSPIENビットを0から1に書き換えられる仕組みにしておくと、SPIENビットの書き換え以降に、ICSPを用いたプログラムなどの書き込み・読み込みができなくなるため、ICSPを用いてSPIENビットの操作をしようとしても無視するようになっています。avrdudeとArduinoISPを用いてSPIENビットを1に書き換えようとすると、書き込みの後のベリファイ時にエラーが発生します。

6-4-10-4.マイコン内部のクロック発振回路を使わない設定の場合は、書き込み時にも外部の発振回路が必要

AVRマイコンは、クロック信号の発生の方法として、大雑把に分類すると、次の3つのモードを持っています。

  1. マイコン内部に内蔵したCR式のクロック発振回路を用いる方法
  2. マイコンの外部のクロック発振回路からクロック信号を供給してもらう方法
  3. マイコンの外部に接続した水晶振動子またはセラミック発振子を用いてクロックを発振する方法

これらのクロックのモードの選択は、ヒューズビットの書き換えにより行います。(ATmega328Pの場合はCKSEL0~3の4ビットで設定する) ヒューズビットを1の方法(マイコン内部のクロック発振回路を用いる方法)以外に設定すると、それ以降、設定に応じた外部回路がないと、フラッシュメモリ、EEPROM、ヒューズビット、およびロックビットの書き換えができなくなります。

これは、フラッシュメモリなどの書き込みにもクロックが必要だからです。新品のAVRマイコンは、マイコン内部のクロック発振回路を用いる設定になっているので、外部回路がなくてもフラッシュメモリ等の書き換えが可能ですが、ヒューズビットを書き換えて、クロックの発振に外部回路が必要な2または3の方法を用いるモードに設定すると、それ以降は外部回路を接続しない限りは、フラッシュメモリなどの書き換えができなくなります。

なお、Arduino Unoは16MHzの水晶振動子を用いてクロックを発生しています(3の方法)から、一度ブートローダを書き込んだ後は、水晶振動子がないと、ブートローダの書き換えができなくなります。ただし、Arduino Uno用ブートローダライタシールドArduino用ブートローダ/スケッチライタには、水晶振動子が付いていますので、その点の心配は必要がありません。

新品のATmega328Pを使う場合は、水晶振動子を使わない書き込み回路でも1度だけブートローダが書き込めますが、この場合はCKSEL0~3を含む下位ヒューズバイトを最後に書き込む必要があります。

このページでは、コマンドラインからavrdudeを使用し、ArduinoISPを用いたライタでAVRマイコンにプログラム等を書き込む方法について説明しました。次のページでは、Atmel Studio上でArduinoISPを使う方法について説明します。

ツイート
シェア
このエントリーをはてなブックマークに追加
フォロー
目次へ  前のページへ (1) (2) (3) 次のページへ

このページで使われている用語の解説

関連ページ

関連製品

Arduino Uno用ブートローダスケッチライタシールドキット 商品名 Arduino Uno用ブートローダスケッチライタシールドキット
税抜き小売価格 1200円
販売店 スイッチサイエンス
サポートページ
Arduino用ブートローダ/スケッチライタキット 商品名 Arduino用ブートローダ/スケッチライタキット
税抜き小売価格 2200円
販売店 スイッチサイエンス 妙楽堂
サポートページ
このサイトの記事が本になりました。
書名:Arduino 電子工作
ISBN:978-4-7775-1941-5
工学社の書籍の内容の紹介ページ
本のカバーの写真か書名をクリックすると、Amazonの書籍購入ページに移動します。
サイトマッププライバシーポリシーお問い合わせ用語集
しなぷすのハード製作記