{{category 電子工作/AVR}} {{tag AVR,WinAVR,AVRstudio}} >>origin 2007-09-30 ---- %%AVRStudio6での設定方法を追記(2012-12-12)%% %%Microchip Studioでの設定方法を追記(2023-08-01)%% !!!AVRStudio4 AVR Studio4とWinAVRでLCDに実数表示させる場合に、 fprintf(fp, "%4,2f", ds); なんて書いてもまともに出力されずにしばらくはまりました。・・で調べてみるとWinAVRのチュートリアルにちゃんと書いてありました。 浮動小数点を扱う場合は、リンカーオプション指示とmathライブラリとprintf用のfloatライブラリを明示的にリンクしなければいけないようです。 具体的には、AVR Studioの"Project"メニューから"Configration Options"を選択して、"Libraries"タブで"libm.a"と"libprintf_flt.a"を"Add Object..."で選択します。 {{image image012.png}} つぎに下のほうの"Custom Options"タブで"[Linker Options]"に"-Wl,-u,vfprintf"を追加してやります。 {{image image013.png}} これでプロジェクトをビルドしてAVRマイコンに書き込めば正常な表示が得られました。 !!!AVRStudio6  設定方法が、AVRStudio4と多少違うので追記します。  プロジェクトのプロパティを開いて、AVR/GNU LinkerのGeneralにリストアップされている Use vprintf Library(-Wl,-u,-vfprintf)にチェックを追加する。 {{image AVRStudio6_Linker_option.png}}  つぎに、同じくAVR/GNU LinkerのLibrariesにprintf_fltを追加する。おそらくlibmは最初からリストアップされている(単にmと表示)はずなので追加は不要と思うが、リストアップされていない場合はこれも必要。 {{image AVRStudio6_Libraries_add.png}}  ついでに、CPUのクロック周波数の宣言は次のとおり。 {{image AVRStudio6_F_CPU.png}} !!!Microchip Studio  Microchip StudioもAVR Studioと同じような設定が必要となります。ただ、最新のバージョンではこれらライブラリのためのオプションがなくなっています。  プロジェクトを作成してプロジェクトのプロパティを開きます。以下の画像のようにToolchain→XC8 Linker→Generalに”Use vprintf library(-Wl,-u,vprintf)"が表示されない場合はMicrochip Studioのダウングレードをおススメします。 {{image microchip_studio_option_nogood.png}}  確認できる限り、Microchip StudioのVersion 7.0.2542ではこのオプションが利用可能です。この古いバージョンは[こちら|https://www.microchip.com/en-us/tools-resources/archives/avr-sam-mcus]からダウンロードできます。  新しいMicrochip StudioをアンインストールしてVersion 7.0.2542をインストールしてください。注意事項として、以下のように最新版(latest version)をインストールするかどうかを聞かれるメッセージがでることがあります。この場合はチェックを外します。なお、インストールするとXC8もVersion2.31と少し古いものがインストールされます。 {{image microchip_studio_install_message.png}}  下の画像のようにToolchain→XC8 Linker→Generalにvprintfライブラリのオプションが表示されていればOKです。 {{image microchip_studio_option_good.png}}  Toolchain→XC8 Linker→Librariesに”libprintf_flt"を追加してやればOKです。 {{image microchip_studio_libprintf.png}}  最新版でこのオプションがサポートされていない理由はよくわかりません。ただ、この浮動小数点対応ライブラリをリンクするとバイナリが巨大となることから使用が推奨されていないことも考えられます。本来は、自力で関数作成するなどして対応するのが良いかと思われます。