このチュートリアルでは、ヒューズについて説明します。私が大学にいて、電子機器のすべてのクールなことを学んでいたとき、AVRでヒューズという用語を初めて聞いたのですが、このトピックについての私の最初の考えは、ああ! AVRの中には、何か間違ったことをすると吹き飛ばされるものがあります。当時、インターネット上で利用できるリソースはあまりありませんでした。私はこれらのヒューズがAVRマイクロコントローラー内のいくつかの特別なビットを参照していることを見つけるためにかなり検索しました。これらのビットはAVR内の小さなスイッチのようなものであり、それらをオン/オフにすることで、AVRのいくつかの特別な機能をオン/オフにすることができます。オンとオフを切り替えることは、設定とリセットを意味します。
この機会に、AVRのヒューズビットに関するすべてのことについて話し合います。簡単にするために、人気のあるATmega328Pマイクロコントローラーを収容するArduinoボードの例を取り上げます。ここでは、これらの機能の一部をオンまたはオフに設定するためにこれらのヒューズを設定する方法を学習します。これは、実際のアプリケーションで非常に便利です。それでは、すぐに始めましょう。
以前の投稿では、GSMモジュールとAVRマイクロコントローラーのインターフェースやHC-05とAVRマイクロコントローラーのインターフェースなど、多くのAVRマイクロコントローラープロジェクトを構築しました。これらのプロジェクトについて詳しく知りたい場合は、それらをチェックしてください。
AVRのヒューズとは-詳細な説明
前に説明したように、マイクロコントローラーのヒューズは、AVRマイクロコントローラーのさまざまな機能を有効または無効にするためにオンとオフを切り替えることができる小さなスイッチのようなものです。これが次の質問が発生する部分です。では、これらのヒューズをどのように設定またはリセットしますか?この質問への答えは簡単です:私たちはヒューズレジスタの助けを借りてそれを行います。
ATmega328P ICには、合計19個のヒューズビットがあり、それらは3つのヒューズバイトに分割されています。これらは、「拡張ヒューズバイト」、 「高ヒューズバイト」、および「低ヒューズバイト」として定義されます。
ATmega328 / PデータシートRev:7810D–AVR–01 / 15の表27を見ると、ヒューズビットに関する細部をすべて見つけることができます。ただし、以下の画像は、データシートのヒューズビットセクションに関するより良いアイデアを提供します。
ヒューズビットについて少し学んだので、データシートを調べて、このICに必要なすべての詳細を調べてみましょう。
拡張ヒューズビット:
[ヒューズビット]タブをクリックして少し下にスクロールすると、表27-5が表示されます。これは、一般に「EFUSE」として知られている「拡張ヒューズバイト」の 表を示しています。下の画像はまさにそれを示しています。
この表では、使用可能なビットは3つだけで、他の3つは予約されています。これらの3ビットは、ブラウンアウト検出レベルを処理します。表28-5を見ると、注に示されているように、詳細を確認できます。
上記の表からわかるように、電圧低下検出の表があります。電圧低下検出は、供給電圧が特定の電圧レベルを下回ったときにマイクロコントローラをリセットする機能です。ATmega328P ICでは、電圧低下検出を完全に無効にするか、上記の表に示されているレベルに設定することができます。
ハイヒューズバイト:
下の画像でわかるように、データシートの表27-6:は、ATmega328PICの高ヒューズビットを示しています。
ハイ・ヒューズATmega328マイクロコントローラ内部のさまざまなタスクとの契約。このセクションでは、高ヒューズビットとその動作について説明します。 BOOTRST、BOOTSZ0、およびBOOTSZ1ビットから始めましょう。これらの3ビットは、ブートサイズの設定を担当します。ブートサイズは、ブートローダーをインストールするために予約されているメモリの量を指します。
ブートローダーは、マイクロコントローラー上で実行され、さまざまなタスクを管理する特別なソフトウェアです。ただし、Arduinoの場合、ブートローダーを使用して、マイクロコントローラー内にArduinoスケッチをアップロードします。以前の記事の1つで、Arduinoを使用してATmega328Pでブートローダーを書き込む方法を示しました。あなたがトピックに興味があるなら、あなたはそれをチェックすることができます。トピックに戻ると、上位バイトの他のビットの目的はかなり明確にされています。EESAVEビットは、チップ消去サイクルが実行されている間、EEPROMメモリを保持することです。 WDTONビットは、ウォッチドッグタイマーを有効または無効にするためのものです。
ウォッチドッグタイマーはATmega328PICの特別なタイマーで、独立したクロックを持ち、独立して動作します。ウォッチドッグタイマーが有効になっている場合は、一定の期間でクリアする必要があります。有効になっていない場合、ウォッチドッグタイマーはマイクロコントローラーをリセットします。これは、プロセッサが動かなくなった場合に多くのマイクロコントローラに搭載される便利な機能です。ウォッチドッグは、エンドアプリケーションへの損傷を防ぐためにリセットします。
DWENビットは、デバッグワイヤを有効にするためにあります。これは、ハードウェアに内部的に組み込まれている準備プロトコルであり、プロセッサのプログラミングとデバッグに使用されます。この機能を有効にすると、1本のワイヤを接続してプロセッサをフラッシュおよびデバッグできます。ただし、これを使用するには、Atmelの準備となる特別なハードウェアが必要になります。
残りの2ビットは、自分が何をしているかを正確に理解していない限り、避ける必要のあるビットです。これらは、RSTDISBLビット7とSPIENビット5です。RSTDISBL(External Reset Disable)は、その名前が示すように、外部ハードウェアリセットピンを無効にし、SPIENビットを使用してSPIプログラミングインターフェイスを無効にします。これらの2つのビットのいずれかを無効にすると、AVRが完全にブリックする可能性があります。したがって、それらをそのままにしておくことをお勧めします。
低ヒューズバイト:
下の画像でわかるように、データシートの表27-7:は、ATmega328PICの下部ヒューズビットを示しています。
このヒューズバイトは、AVR内のクロックソースとクロックの他のいくつかのパラメータを設定する役割を果たします。このセクションでは、そのすべてについて学習します。
7番目のビットまたはCKDIV8フラグは、クロックソースを8で除算するように設定できます。これは、AVRを自分でプログラミングしようとした場合に、すでに知っていると思われる非常に便利です。次のビットはCKOUTビットで、低ヒューズバイトの6番目のビットです。それをプログラミングすると、マイクロコントローラのPORTB0に内部クロック信号が出力されます。
ビット5とビット4のSUT1とSUT0は、マイクロコントローラの起動時間を制御します。これにより、供給電圧が許容可能な最小しきい値電圧レベルに達する前に発生する場合と発生しない場合がある起動アクションが防止されます。そして、最後の4つのCKSEL0-4ビットは、マイクロコントローラーのクロックソースを選択するために使用されます。以下に示す表は、クロックソースの設定を担当するこれらの4ビットをよりよく理解するためのものです。この表は、データシートのクロックソースセクションにあります。
さて、先に進む前に、もう1つ確認する必要があるのは、発振器の起動遅延の表です。起動遅延とは、ヒューズの下位バイトのビット4と5を指します。遅延は、回路が動作する条件と使用している発振器のタイプに応じて設定する必要があります。デフォルト値は、パワーアップまたはパワーダウンシーケンスが実行されるときに、6クロックサイクルで立ち上がり電力を遅くするように設定されています。次に、起動後65Msの遅延を伴う14クロックサイクルの別の遅延があります。
ふぅ!それは消化すべき多くの情報でした。ただし、先に進む前に、このセクションを簡単なメモで終了しましょう。
注意:
データシートを注意深く見た場合、ヒューズビットをプログラミングすることはそれを低く設定することを意味することに気づいたはずです。つまり、0(ゼロ)です。これは、ポートを高くまたは低くするために一般的に行うこととは逆です。ヒューズを構成するときは、このことを覚えておく必要があります。
Arduinoのヒューズビット
上記のセクションではヒューズについて多くのことを話しましたが、このセクションでは、ヒューズの構成方法とマイクロコントローラーでの書き込み方法について説明します。そのためには、Avrdudeというツールが必要になります。これは、AVRマイクロコントローラーのメモリーの読み取り、書き込み、および変更に使用できるツールです。SPIで動作し、さまざまなタイプのプログラマーをサポートする長いリストがあります。以下のリンクからツールをダウンロードできます。また、お気に入りのマイクロコントローラーArduinoを使用します。
- Avrdudeバージョン6.3Windowsをダウンロード-ming32
これでAvrdudeができたので、それを抽出して、そのフォルダーでコマンドウィンドウを開く必要があります。また、後で使用する予定がある場合は、Windows環境変数セクションにフォルダーパスを追加できます。ただし、デスクトップに配置して、そこでコマンドウィンドウを開きます。それが済んだら、USBaspプログラマーをPCに接続し、USBaspプログラマーに適切なドライバーがあることを確認します。それが済んだら、準備は完了です。最初にデフォルトのヒューズ値を読み取ります。これを行うには、次のコマンドを実行する必要があります。
avrdude.exe -c usbasp -p m328p -U lfuse:r:low_fuse_val.txt:h -U hfuse:r:high_fuse_val.txt:h -U efuse:r:ext_fuse_val.txt:h
すべてが正しければ、このコマンドはヒューズバイトを読み取り、それらを3つの別々のテキストファイルに入れます。以下の画像は、プロセスのより良いアイデアを提供します。
ご覧のとおり、AvrdudeはArduino nanoのヒューズビットを読み取り、3つの別々のテキストファイルに保存しました。ここで、それらを開いて3つの値を取得しました。用EFUSE:0xFDで、用HFUSE:0XDA、用LFUSE:0xFFで。これは、Arduinonanoで取得したデフォルトのヒューズ値でした。それでは、これらのビットをバイナリに変換して、データシートのデフォルト値と比較してみましょう。以下の表はまさにそれを示しています。
便宜上、ヒューズビットは16進値で記述されていますが、それらを2進値に変換してデータシートと比較すると、何が起こっているのかがわかります。下部ヒューズバイトから始めましょう。上記の文字列からわかるように、0XFFに設定され、バイナリ値は0B11111111になります。
ストックの低いヒューズバイトとArduinoの比較:
低ヒューズバイト |
ビット番号 |
AVRのデフォルト値 |
Arduinoのデフォルト値 |
CKDIV8 |
7 |
0(プログラム済み) |
1(プログラムされていない) |
CKOUT |
6 |
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(プログラムされていない) |
Higher Fuse Byteは、バイナリで0XDA、つまり0B11011010に設定されます。
バイナリの上位ヒューズバイト:
高ヒューズバイト |
ビット番号 |
AVRのデフォルト値 |
Arduinoのデフォルト値 |
RSTDISBL |
7 |
1(プログラムされていない) |
1(プログラムされていない) |
DWEN |
6 |
1(プログラムされていない) |
1(プログラムされていない) |
SPIEN |
5 |
0(プログラム済み) |
0(プログラム済み) |
WDTON |
4 |
1(プログラムされていない) |
1(プログラムされていない) |
EESAVE |
3 |
1(プログラムされていない) |
1(プログラムされていない) |
BOOTSZ1 |
2 |
0(プログラム済み) |
0(プログラム済み) |
BOOTSZ0 |
1 |
0(プログラム済み) |
1(プログラムされていない) |
BOOTRST |
0 |
1(プログラムされていない) |
0(プログラム済み)) |
拡張ヒューズバイトの設定は0XFDに設定され、バイナリでは0B11111101です。
バイナリの拡張ヒューズバイト:
拡張ヒューズバイト |
ビット番号 |
AVRのデフォルト値 |
Arduinoのデフォルト値 |
– |
7 |
1 |
1 |
– |
6 |
1 |
1 |
– |
5 |
1 |
1 |
– |
4 |
1 |
1 |
– |
3 |
1 |
1 |
BODLEVEL2 |
2 |
1(プログラムされていない) |
1(プログラムされていない) |
BODLEVEL1 |
1 |
1(プログラムされていない) |
0(プログラム済み) |
BODLEVEL0 |
0 |
1(プログラムされていない) |
1(プログラムされていない) |
これで、このセクションは終了です。今のところ、AVRマイクロコントローラーとそのヒューズビットについて多くのことを学びました。それでは、Arduino Nanoのヒューズビットのいくつかを変更して実験することにより、私たちの理論をテストして、この記事を締めくくりましょう。
AVRでヒューズをテストするために必要なコンポーネント
上記の部分でヒューズについて多くのことを話しました。しかし、この記事をさらに進めるには、いくつかのハードウェアコンポーネントといくつかのソフトウェアツールが必要です。このセクションでは、それらについて説明します。画像付きの必須コンポーネントのリストを以下に示します。
- ブレッドボード-1
- ArduinoNano-1
- USBaspAVRプログラマー-1
- USBケーブル-1
- AVR10ピンから6ピンへのコンバーター-1
- Avrdude(AVRをプログラミングするためのソフトウェアツール)
- LED-1
- 330R抵抗器-1
- ジャンパーケーブル
AVRでヒューズビットをテストするための回路図
このセットアップでのハードウェアテストのセットアップを以下に示します。Arduino NanoをUSBケーブルでPCに接続し、USBaspプログラマーもPCに接続しました。この記事の目的は、AVRのヒューズビットをプログラムすることです。そのため、USBaspプログラマーをArduinoに接続しました。以下の画像は、セットアップのより良いアイデアを提供します。
AVRでのヒューズのテスト
テストのセットアップを以下に示します。ご覧のとおり、ArduinoとUSBaspプログラマーの両方を私のラップトップのUSBに接続しました。
それでは、Arduino IDEを開いて、基本的なまばたきスケッチをアップロードしましょう。基本的なまばたきスケッチの内容は一目瞭然なので、詳しくは触れませんでした。
ビデオでは、ピン番号13のLEDが正常に点滅していることがわかります。次に、ヒューズ設定を微調整して、デフォルト値に設定しましょう。そして、以前にデータシートで見たように、EFUSEは、0XFFです。HFUSEはD9です。LFUSEは:62です。それでは、Avrdudeを使用して構成し、フラッシュして、何が起こるかを見てみましょう。使用するコードは-
avrdude -c usbasp -p m328P -U lfuse:w:0x62:m -U hfuse:w:0xd9:m -U efuse:w:0xff:m
これを行うと、16Mhzクロックの値を計算してプログラムしたため、LEDが非常にゆっくり点滅することがわかります。ヒューズを焼いた後は、1Mhzの内部RC発振器だけです。これが、LEDの点滅が非常に遅い理由です。それでは、もう一度スケッチをアップロードしてみましょう。 Arduinoがエラーを出し、コードがアップロードされていないことがわかります。ヒューズを変更することで、ブートローダーの設定も台無しにしたからです。下の画像でそれを見ることができます。
これを修正し、Arduinoを以前の状態に戻すには、Arduinoのブートローダーを再度書き込む必要があります。これを行うには、 [ツール]-> [プログラマー]-[USBasp ]に移動します。これを実行したら、もう一度[ツール]に移動して、[ブートローダーの書き込み]オプションをクリックします。これにより、Arduinoのストックブートローダーが再び焼き付けられ、すべてが以前の状態に戻ります。
ブートローダーがフラッシュバックされてArduinoに戻った後、元の状態に戻り、最後の画像は、ブートローダーが再び焼き付けられた後のLEDの点滅を示しています。
そして、これでこの記事は終わりです。この記事を楽しんで、何か新しいことを学んだことを願っています。記事に関してご不明な点がございましたら、お気軽に下記にコメントをお寄せください。