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は色々ややこしいようです。
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は色々ややこしいようです。
|
|
|
コメント 0