LED表示器ドライバIC

Arduinoで実験 (ヒューズビット・ロックビット)

2013/04/19

ATMEL の AVR マイコンでは、固有の機能を使用/未使用等を設定するヒューズビットとロックビットがある。

本稿では、ヒューズビット・ロックビットの書き込み方法ではなく、各ビットの詳細を書きとどめておく。

マイコンの機種によって設定内容が若干異なり機種毎の設定方法を良く確認しておかないと、最悪、うんともすんとも言わなくなってします。

Arduino をブートローダー書き込み機にしてブートローダーを転送することもできるようだが、AVRISP mkII を持っているので上級者向けの方法はとらないこととする。


◆ ATmega328P

Arduino のベーシック機 UNO や FIO PRO 等で使用されているマイコンで、秋月でも DIP パッケージで購入できるので製作例も多くみられる。

右2列は、*がチップ初期値、A が Arduino UNO 初期値

HIGH FUSE

名称 bit 内容 * A
RSDIBL 7 ポート PC6 の動作を設定
 1 = RESET ピン
 0 = I/O ピン
1 1
DWEN 6 デバッグ Wire 機能の許可
 1 = 不許可
 0 = 許可
1 1
SPIEN 5 シリアルプログラムでのデータ転送を許可する。
 1 = 不許可
 0 = 許可
0 0
WDTON 4 ウォッチドッグ・タイマーを常時有効にする。
 1 = 有効
 0 = 無効
1 1
EESAVE 3 Chip Erase 時に内蔵 EEPROM を保持する。
 1 = 未保持
 0 = 保持
1 0
BOOTSZ1 2 ブートローダーのサイズを選択
 21   size       Address
-------------------------------
 11 =  256 byte ($3F00~$3FFF)
 10 =  512 byte ($3E00~$3FFF)
 01 = 1024 byte ($3C00~$3FFF)
 00 = 2048 byte ($3800~$3FFF)
0 1
BOOTSZ0 1 0 1
BOOTRST 0 リセット時に実行されるプログラム領域の選択
 1 = アプリケーション領域
 0 = ブートローダー領域
1 0

LOW FUSE

名称 bit 内容 * A
CKDIV8 7 システムクロックを8分周選択
 1 = 8分周する
 0 = 8分周しない
0 1
CKOUT 6 システムクロック出力の許可
 1 = 不許可
 0 = 許可
 CLK0(PB0)を外部用のクロック出力として使用できる。
1 1
SUT1 5 起動時間(電源投入からプログラムが動作するまでの遅延時間)の選択。(下表) 1 1
SUT0 4 0 1
CKSEL3 3 クロックの設定。(下表) 0 1
CKSEL2 2 0 1
CKSEL1 1 1 1
CKSEL0 0 0 1

クロックによる SUT1/0 と CKSEL3/2/1/0 の関係

発振器 遅延時間 SUT CKSEL
Sleep Reset 14ck+ 1 0 3 2 1 0
外部クロック
0~20MHz
5 クロック 0 ms 0 0 0 0 0 0
4.1 ms 0 1
65 ms 1 0
内部発振
7.3~8.1MHz
6 クロック 0 ms 0 0 0 0 1 0
4.1 ms 0 1
65 ms 1 0
内部発振
128KHz
6 クロック 0 ms 0 0 0 0 1 1
4.1 ms 0 1
65 ms 1 0
外部発振器
8.0~16MHz
258 クロック 4.1 ms 0 0 1 1 1 0
65 ms 0 1
1K クロック 0 ms 1 0
4.1ms 1 1
65 ms 0 0 1 1 1 1
16K クロック 0 ms 0 1
4.1 ms 1 0
65 ms 1 1
 外部発振器 0.4 MHz ~ 8.0 MHz の使用に関する設定は割愛。
 水晶キャパシタ容量 12~22 pF
 遅延時間( Sleep )はパワーダウン、パワーセーブからの起動遅延時間
 遅延時間( Reset )はリセットの起動遅延時間(14 クロック)に付加される遅延時間(5V動作時)

Extended FUSE

名称 bit 内容 def ard
  7 未使用 1 1
6 1 1
5 1 1
4 1 1
3 1 1
BODLEVEL2 2 低電圧検出(BOD)時のリセット制御と検出電圧の選択
 210
-----------------------
  111 = 低電圧検出時のリセット禁止
  110 = Vcc 2.5V用設定。 1.8V以下で停止
  101 = Vcc 3.5V用設定。 2.7V以下で停止
  100 = Vcc 5.0V用設定。 4.3V以下で停止
1 1
BODLEVEL1 1 1 0
BODLEVEL0 0 1 1

LOCK

名称 bit 内容 def ard
  7 未使用 1 1
6 1 1
BLB12 5 ブートローダー領域に対する制限
 54
----
 11 = 制限なし
 10 = SPMM禁止
 00 = SPM・LPM禁止
 01 = LPM禁止(アプリケーション領域)
1 0
BLB11 4 1 0
BLB02 3 アプリケーション領域に対する制限
 32
----
 11 = 制限なし
 10 = SPM禁止
 00 = SPM・LPM禁止
 01 = LPM禁止(ブートローダー領域)
1 1
BLB011 2 1 1
LB2 1 フラッシュ・EEPROMに対する保護
 10
-----
 11 = 未保護
 10 = 書込禁止、ヒューズビット変更禁止
 00 = 書込・読込禁止 ヒューズビット・ロックビット変更禁止
1 1
LB1 0 1 1

◆ 機種別のビット配置

各機種毎にヒューズビットの内容が違い、特に ATmega168 と ATmega328 は容量以外ほぼ同じ構成なのだがビット構成が違うので、同じ設定をすると、正しく動作しなくなる。


ATtiny13A ATtiny2313A ATmega168P ATmega328P ATmega1284P
Ex 7
Ex 6
Ex 5
Ex 4
Ex 3
Ex 2 BOOTSZ1 BODLEVEL2 BODLEVEL2
Ex 1 BOOTSZ0 BODLEVEL1 BODLEVEL1
Ex 0 SELFPRGEN BOOTRST BODLEVEL0 BODLEVEL0
Hi 7 DWEN RSTDISBL RSTDISBL OCDEN
Hi 6 EESAVE DWEN DWEN JTAGEN
Hi 5 SPIEN SPIEN SPIEN SPIEN
Hi 4 SELFPRGEN WDTON WDTON WDTON WDTON
Hi 3 DWEN BODLEVEL2 EESAVE EESAVE EESAVE
Hi 2 BODLEVEL1 BODLEVEL1 BODLEVEL2 BOOTSZ1 BOOTSZ1
Hi 1 BODLEVEL0 BODLEVEL0 BODLEVEL1 BOOTSZ0 BOOTSZ0
Hi 0 RSTDISBL RSTDISBL BODLEVEL0 BOOTRST BOOTRST
Lw 7 SPIEN CKDIV8 CKDIV8 CKDIV8 CKDIV8
Lw 6 EESAVE CKOUT CKOUT CKOUT CKOUT
Lw 5 WDTON SUT1 SUT1 SUT1 SUT1
Lw 4 CKDIV8 SUT0 SUT0 SUT0 SUT0
Lw 3 SUT1 CKSEL3 CKSEL3 CKSEL3 CKSEL3
Lw 2 SUT0 CKSEL2 CKSEL2 CKSEL2 CKSEL2
Lw 1 CKSEL1 CKSEL1 CKSEL1 CKSEL1 CKSEL1
Lw 0 CKSEL0 CKSEL0 CKSEL0 CKSEL0 CKSEL0
Lc 7
Lc 6
Lc 5 BLB12 BLB12 BLB12
Lc 4 BLB11 BLB11 BLB11
Lc 3 BLB02 BLB02 BLB02
Lc 2 BLB01 BLB01 BLB01
Lc 1 LB2 LB2 LB2 LB2 LB2
Lc 0 LB1 LB1 LB1 LB1 LB1

◆ 手持ち機器の各設定

手許にある機種毎のビット構成を記録しておく

  Ex Fuse Hi Fuse Low Fuse Lock
Arduino UNO FD D6 FF CF
Arduino FIO        
SparkFun Mega Pro        
ATmega328P default FF D9 62 FF
ATtiny13A default FF 6A FF
ATmega1284P default FF 99 62 FF
ATtiny2313 default FF DF 64 FF