ソフトにBUGがあったので備忘録です。VersionはV2.1となりました。
(1)sprintfの書式設定と変数の型の不一致:
以前の記事「電圧・電流・電力計」で、
sprintfで入れているのですが、表示できていたのですが、なにかの拍子に突然、2つ目の変数が表示されなくなってしまいました。よくわからないのですが、とりあえず動くように、分割して表示していますので、処理量は多くなってしまっています。
と書いたのですが、原因がわかりました。「何かの拍子に」は、変数をLong(32bit)に変更したこと、でした。
Powerを計算するのに、電圧(mV)×電流(mA)なので、integer16bitをOverflowしてしまうことが分かったので、すべての変数をinteger(16bit)からLong(32bit)に変更しました。
sprintfの書式で、本来32bitの場合は%ldとしなければいけないところを変更せず%dとしてしまったために、変数領域は32bit(long)、表示書式は16bit(int)となってしまい、二つ目の変数が、long32bit中の上位16bitを読み込んで、常に「0」ゼロになってしまっていた、ということのようです。変数を3個表示しようとして気が付きました。
Powerだけをだけを32bitにすればよかったのです。ちなみに、Powerのところは%ldにしてある、というおバカな状況でした。Powerだけを32bitにして、残りは16bitのままとしました。
これが分かったので、LCD2行に、2回のWrite命令で書き込むように修正したところ、当初10回/秒だったものが、17回/秒へ高速化されました。
(2)XC8の最適化:
これは、BUG対応ではないのですが、同じ記事で、
あとは、sprintfなどを使うとプログラムエリアを食うようで、V1.5aで、使用率が90%になっています。RS-232CのようなSerial通信を入れようとすると多分溢れます、、、。
と書いたのですが、Project Properties から、XC8 Compiler のPropertyを覗いてゆくと、Options for xc8-cc、に、Optimizationというカテゴリがあって、そこに、Optimization levelという設定項目がありました。試しに設定してみましたが、Optimization lever = 2 まではFreeで使えるようで、90%だったものが80%にOptimizeされました。
最終的には、(1)の対応をしたり、いらないライブラリを外したりしたのもあり、現在Programは、77%となっています。
多分、Optimizeしなくても大した量の追加ではなかったので入ったとは思います。
とりあえず、現時点での最終版です。以下、長くなりますが、Sourceです。
回路図: V2.0と変更ありません。
環境: MPLAB-X IDE v5.35 XC8/PICkit3 C99 PIC16F88 VC2.1.x
#### V2.1 はBUGがあったので、次の記事でV2.2として載せてあります。そちらを見てください ####
※コメント投稿者のブログIDはブログ作成者のみに通知されます