AVRのフューズビットをMacで書き換える方法

AVRをプログラミングした時に、想定したスピードで動作しないことがあります.delay関数などで動作タイミングを制御した際にこれが見られることがあります.これはマイコンを動作させているクロックスピードの設定とプログラム側で想定していたクロック速度との違いがあるときに起ります。

内蔵の発信器でクロックを作っているか
外部発信器でクロックを作っているか
クロックの分周比の設定

などによってマイコンの動作速度が変わります。どのクロック信号を使うか、分周比をどうするのか、予めチップ側にその設定を行っておき、どうじにプログラミング側でもそれの応じた設定になっていないといけません。

また、検討時には動作していたものが実機に載せた時に動かないというトラブルも有ります.動作電圧が実機では3Vで動かすつもりがデバッグでは5V電源だったときにも起こりえます.これはマイコンチプの設定で指定電圧よりも供給電圧が下がった時に自動的にシャットダウンする機能が働いていることがあります.

これらの設定はマイコンチップのフューズビットを適切に書き換える事で変更することができます.

一般的にはWindows OSで動作するAtmel Studioを使ってフューズビットの書き換えを行うのですが、Macを使っている場合にはAtmel Studioを使うことができません.そこでここではCrossPack-AVRを使いながらフューズビットの書き換えを行う方法を紹介します。
必要なものはターゲットのAVRとMacとを接続するUSBで動作するAVRライターです。ここではAVR純正のライターであるAVR ISP mkIIを使いました。
CIMG2359

ターゲットのマイコンはATmega328Pです。ISPとの接続に便利なAVR boardを使っています.

さっそくMac上で環境を作りましょう。まずはCrossPack for AVR をインストールします.
CrossPack AVRのサイト

上記リンク先を参考にダウンロードとインストールを行います.
PATHも通しておきましょう
export PATH=$PATH:/usr/local/CrossPack-AVR/bin

CrossPack AVRはxcodeの統合環境によるプログラミングやgccを使ったプログラム作成ができるとのことですが、ここではフューズビットの書き換えのみについて以下に説明します.

インストールが終わったら次にUSBからISPが使えるようにするためのavrdudeをインストールします.

MacBook:~ user$ sudo port install git-core libusb avrdude

無事インストールが出来ていれば 
MacBook:~ user$ which avrdude
のコマンドを実行すると
/opt/local/bin/avrdude
と返ってくるはずです。

ここでavrdudeの設定ファイルを確認します.
/opt/local/etc/avrdude.conf (環境によっては別の場所に有る事もあるようです)
ここには使用するISP(AVRライター)の情報が記載されています.

programmer
  id    = "avrispmkII";
  desc  = "Atmel AVR ISP mkII";
  type  =  "stk500v2";
  connection_type = usb;
;

なんていうのがそれぞれのライター(プログラマ)の設定になります.上の例は今回用いたAVR ISP mkIIの設定になります.他にも多くのプログラマの設定がデフォルトでされていますので、お使いのライター、プログラマがあるかどうか確認しておいてください。見つけたらid=””の中をメモしておいてください.ここに出ているid名はあとで使います。

次にCrossPack AVRで雛形を作ります.Terminalを起動したらカレントディレクトリーをDesktopにでも移動しましょう。ユーザーディレクトリでも構いませんが、あとで見失わないところに置いておきます。

cd /Users/user name/Desktop
avr-project temp
cd temp/firmware

デスクトップにフォルダが現れます。この場合はtempという名前のフォルダになります.
temp>firmwareを開きます。Makefileというのがありますのでこれを編集します.

DEVICE     = atmega328p #ターゲットのマイコンチップを指定します
CLOCK      = 8000000 #動作クロックを指定します.
PROGRAMMER = -c avrispmkII #使っているライター(プログラマ)を指定します。avrdude.confで確認したid名です
OBJECTS    = main.o
FUSES      = -U hfuse:w:0xd9:m -U lfuse:w:0xe2:m -U efuse:w:0xff:m #設定するフューズビットを指定します.

上の例では
ターゲットはATmega328P
動作クロック8MHz
プログラマーにはAVR ISP mkII
フューズビットは、内蔵8MHzクロックを使用、BODレベルは無し(電圧が降下しても自動シャットダウンしない)
の設定になっています.デバッグ時に5V電源で動作していて、実機で3Vにした時に動作しない場合はこのBODレベルが3V以上になっていることが予想されますので、フューズビットを適宜書き換えてみてください.

ArduinoIDEからはフューズビットの書き換えが上手く反映されない場合にもこの方法を試してみると良いでしょう.


投稿日

カテゴリー:

,

投稿者: