Burning Fuses: Enabling the High-Speed CPU Clock (p.193)非公式訳

ヒューズビットを設定する: 高速CPUクロックが使えるようにする

まさかと思うかもしれませんが、AVRマイコンのほとんどはシステムCPUクロックが8分周された状態で出荷されます。つまり特に設定しない限り8分の1の速度で動作するということです。なぜAtmel社はこのようなことをするのでしょうか? ほとんどのプロジェクトは本来のクロック速度をまったく必要としないからです。また、クロック速度を落とせばそれだけ消費電力が少なくて済むからです。しかしこのセクションでは、ほどほどに抑え込まれていたクロックを解き放ち、ハードウェアクロックを使って無線周波信号を直接生成します。そのためには限界までクロック速度を引き上げる必要があります。

クロック速度を上げるということはヒューズビットの設定を変えるということです。AVRマイコンには、「ヒューズビット」と呼ばれる特殊なメモリーロケーションが2~3バイト用意してあります。ヒューズビットは、AVRマイコンの動作を根本から変えてしまうため、プログラムが書き込まれるメインフラッシュメモリーからは分離されていますが、そのことを除けば機能はフラッシュメモリーと似たようなものです。ヒューズビットの読み書きについては、AVRマイコン内のその他のフラッシュメモリーにプログラミングするのとまったく同じようにフラッシュプログラマーとAVRDUDEとを使って行えます。

ヒューズビットはAVRマイコンの動作を変えてしまうため、取り扱いに少し気をつける必要があります。大きな危険が2つあるからです。

してしまいがちな最悪なことはSPIプログラミングビットを変更してしまうことです。この変更をしてしまうと、それ以降、フラッシュプログラマーではプログラミングできなくなります。なぜこのような変更がしたくなるのでしょうか? おそらく、RESET端子をリセット専用以外の何らかの用途に充てたいからです。しかしこの変更をしてしまうと、特殊な方法を使わない限り、プログラミングモードへ入るようAVRマイコンへ信号が伝えられなくなります。もちろん高電圧並列プログラマー回路を使えば元には戻せますが、ディジタルI/Oをたった一本増やすためにこんな苦労はしたくないでしょう。知識が増えて高電圧プログラマー回路による方法が使えるようになるまでは、SPIENイネーブルヒューズビットは変更しないでください。

ヒューズビットに関してもうひとつやってしまいがちなのが、外部水晶クロック源を取り付けていないにもかかわらず、そのクロック源にCPUクロックを接続する設定にしてしまうことです。この設定にしてしまうと、CPUは決してやってこない外部クロックパルスをただじっと待ち続けます。この状態だと、コードが実行されないばかりか、外部クロック源を接続しない限りはAVRマイコンのプログラムの書き換えもヒューズビットの変更もできません。

ただしこれはそれほど深刻な事態ではありません。水晶クロック源が手近にありさえすれば、それを接続してヒューズビットを元どおりに内部CPUクロックにリセットすれば済むだけだからです。それにたとい水晶クロック源が手持ちになくても、たとえば1 MHz信号が生成されるよう設定した別のAVRマイコンを、動かなくなったAVRマイコンのクロック入力に接続するという手もあります。そうしてヒューズビットを書き換えて内部クロックを有効化すれば作業が再開できます。

この2つの忠告は置いておくとして、ヒューズビットを使うとどんな有益なことがあるのでしょうか? この章では、内部CPUクロックを8分周するCLKDIV8ヒューズ(デフォルトで設定されているヒューズ)をクリアします。CPUクロックを外部水晶クロック源で駆動するという設定もごく普通に使われます。ブートローダーの動作を決めるヒューズビットもあります(ブートローダーとは、マイコン自体の内部に存在していて、マイコンにプログラムを書き込む働きをするプログラムのことであり、プログラムの書き込みにはフラッシュプログラマーではなくシリアル接続が多く使われます)。

AVRヒューズビットの設定を計算するのに特に便利なオンラインアプリ(http://www.engbedded.com/fusecalc)があります。ここにはマイコンのデータがすべてあらかじめ入力してあります。このオンラインアプリは、コマンドラインに入力する必要のあるAVRDUDEフラグまで示してくれます。

ATmega48、88、168、328の各シリーズの場合、デフォルトのヒューズ値は下のとおりです。

  • lfuse=0x62
  • hfuse=0xDF
  • efuse=0x01

高速モードの有効化に必要なのはlfuseを0xE2に変更することだけです。フルスピードクロックに設定するためのAVRDUDEフラグは-U lfuse:w:0xE2:m,のような感じになります。これは、「lfuseに相当するフラッシュメモリーに即座にバイトデータ0xE2を書き込め」という、AVRDUDEに対する命令です(mは、ファイルからのデータ読み取りの反対です)。LinuxまたはMacの場合は、「man avrdude」と打ち込むかインターネットで「avrdude man page」を検索するかして、コマンドライン引数すべての詳細を調べてください。

また、本書のサポートページに上げてあるmakeファイルを使えば、「make set_fast_fuse」また「make set_default_fuses」と入力するだけでフルスピードモード(8 MHz)と低速モード(1 MHz)とが切り換えられます。