Japanino ArduinoISPで ATtiny13 の 内部クロックを書き換える方法 - 工場出荷時に戻す (27) (11/6)
懸案だったATtiny13の工場出荷時のFuseビットの書き戻しがわかった。
自分の環境ではBASCOM-AVRのために、C:\avrdudeに有名な書込みツールavrdudeを格納してあり、それを使ってFuseビットも書き換えよう。
(2016/8/19の記事、Japanino ArduinoISP で BASCOM-AVR ATtiny13 (8/19)内の上記のパスが誤ってarduinoとなっており、BASCOM-AVRで書き込みが出来ない不具合が発生していました。現在は修正されています)
準備:
BASCOM-AVRの環境作成時の手順で、Japanino(arduino)をISPライタにしてある事を確認する。
(ライタにするにはJapanioの場合学研のarduino-018で、Arduino ISPスケッチをJapanioに書込む)
クロックが戻ったかの確認のため、ATtiny13へarduino 1.0.5-r2でBlinkスケッチを書込む。
(ATtiny13に例の書込み用の6本の配線を行っておく)
Blinkスケッチのled=13はATtiny13のPB0にLEDを繋いだならled=0に修正しておく。
LEDが1秒おきに点滅するのを確認する。
読み出し:
コマンドラインツールなのでコマンドプロンプトを特に管理者権限でなくて起動する。
cd c:\avrdude で移動し、
avrdude.exeとavrdude.confがある事を確認する。
以下の手順はこちらのサイト様が詳しい。
ArduinoISPを汎用AVRライタとして使う(2) - しなぷすのハード製作記
まず現在のFuseビットの値を読み出す。
上位バイトは、
avrdude -C c:\avrdude\avrdude.conf -p t13 -P COM3 -c avrisp -b 19200 -U hfuse:r:con:h
COMポート番号はそれぞれの環境に合わせて。
すると0xffと表示される。
同様に下位バイトは、
avrdude -C c:\avrdude\avrdude.conf -p t13 -P COM3 -c avrisp -b 19200 -U lfuse:r:con:h
私の環境は9.6MHzなので、
0x7aと表示される。
ついでに拡張Fuseビット読み出しだと、上下バイトがそれぞれ読み出せる。
avrdude -C c:\avrdude\avrdude.conf -p t13 -P COM3 -c avrisp -b 19200 -U efuse:r:con:h
ATtiny13には拡張Fuseビットは無いようで特に読み出せないようだ。
この様子を次の画像で示す。
解説:
さてこのビットの意味だが、参考としたサイト様は次の通り。
ヒューズ設定 | 始めるAVR
tiny13データシート - AVR日本語情報サイト
こちらの17章がFuseビットの詳細だ。
上位バイトは規定値0xFFで変わっていないが、下位ビット0x7Aは規定値だと0x6Aになっている(0110 1010=0x6A)。0x6Aと0x7AではCKDIV8ビットのみが0→1に変わっており、規定値では0は分周比1/8、自分の9.6MHzのATtiny13では1で分周比1だ。そうか~、クロック数が上がったのではなく、分周比が変わって速くなっていたのか~。
まあベースのクロックがそうなっているわけで、BASCOM-AVRで指定するprescale(分周比)はさらに分周するのだが。ここは複雑なので触れない。
で、結局下位ビットを0x6Aに書き戻せば9.6/1→9.6/8で動作がゆっくりになるはずだ。
念のため、しなぷすのハード製作記様の手順通り、lockビットの読み出しも行なってみた。
avrdude -C c:\avrdude\avrdude.conf -p t13 -P COM3 -c avrisp -b 19200 -U lock:r:con:h
書き込み:
いよいよ書き込み(結局これだけやればOK)。
avrdude -C c:\avrdude\avrdude.conf -p t13 -P COM3 -c avrisp -b 19200 -U lfuse:w:0x6a:m
mは即書き換える指定。HEXで指定できる。
書き込んだ値が読み出せるかも再度実行して0x6aが返ってきている事を確認した。
その画像がこれ。
これでクロック数を書き換えるのにわざわざブートローダーを書き込む事をしなくて済む。