SSブログ

PIC18のEEPROMはややこしい [MPLABXとXC8]

(2014.01.30)
CTMUチャネルごとに微妙に異なる計測値を正規化(値域を0~8000に揃える)しようと考えました。

<計算式>
normalize_ratio = 8000 *(current - min)/ (max - min)

計測値の最大/最小をEEPROMに記録し、再起動時にそれを読み出すことにして、その初期値をEEPROMに書き込もうとしたのですが・・・

以下のコードで上手く行くものと思っていましたが、XC8コンパイラにeeprom qualifierを無視されてしまいました。orz

<駄目なコード>
__eeprom UINT16 eeprom_ctmu_max[MTOUCH_SENSORS_NUMBER] = { 6000, 6000, 6000, 6000, 6000, 6000, 6000, 6000};
__eeprom UINT16 eeprom_ctmu_min[MTOUCH_SENSORS_NUMBER] = { 2000, 2000, 2000, 2000, 2000, 2000, 2000, 2000};

<XC8コンパイラのメッセージ>
SRC/ctmu_main.c:80: warning: qualifier "eeprom" ignored
SRC/ctmu_main.c:81: warning: qualifier "eeprom" ignored

???
『XC8のマニュアルを読む限り、これで良さそうなのに何故?』と思ったら、後ろの方にこんな記述がありました。
-----------------
2.5.9.4 CAVEATS
XC8 does not implement the __eeprom qualifiers for any PIC18 devices; this qualifier will work as expected for other 8-bit devices.
-----------------

『__eeprom qualifiersがPIC18では使えない!』
『それじゃ、どうすれば良いんだ?』

”pic18 eeprom”でWEB検索を掛けて、後閑さんの(このページ)を見つけました。

”PIC18Fシリーズの場合には、この開始アドレスが「0xF00000」
となっています。各PICデバイスごとの、Programming Specification
の中に記述があります”

と言うことなので、PIC18(L)F2X/4XK50のFlash Memory Programming Specification(これ)を拾ってきて、調べてみると・・・

-----------------
When embedding data EEPROM information in the hex file, it should start at
address F00000h.
-----------------

という事で、先のコードを次のように変更し、なんとかEEPROMを初期化することが出来ました。

<動くコード>
const UINT16 eeprom_ctmu_max[MTOUCH_SENSORS_NUMBER] @0xf00000 = { 6000, 6000, 6000, 6000, 6000, 6000, 6000, 6000};
const UINT16 eeprom_ctmu_min[MTOUCH_SENSORS_NUMBER] @0xf00010 = { 2000, 2000, 2000, 2000, 2000, 2000, 2000, 2000};

お試しでこんなコードを書いてみると、コンパイルは通りますがEEPROM上のデータは読めませんでした。

<コンパイルは通るけど動かないコード>
ctmu_log[0].max = eeprom_max_data[0];
ctmu_log[0].min = eeprom_min_data[0];

プログラムを走らせた後、EEPROMの値をデバッガで見ようとしたのですが、それも上手く出来ません。(<==やり方が悪い?)

どうも、PIC18のEEPROMは色々ややこしいようです。

にほんブログ村 IT技術ブログへ
にほんブログ村 ネットブログ コミュニティサイトへ
にほんブログ村 IT技術ブログ オープンソースへ


nice!(0)  コメント(0)  トラックバック(0) 
共通テーマ:日記・雑感

nice! 0

コメント 0

コメントを書く

お名前:
URL:
コメント:
画像認証:
下の画像に表示されている文字を入力してください。

※ブログオーナーが承認したコメントのみ表示されます。

トラックバック 0

この広告は前回の更新から一定期間経過したブログに表示されています。更新すると自動で解除されます。