温度ロガーの温度センサ補正値を、EEPROMに書いて不揮発化
温度センサには、それぞれバラツキがあるので、それを、h2
-0.5 のような補正コマンドで補正する、というのが温度ロガーの仕様でした.
しかし、電源を入れる度に h2 -0.5
と打たなければならず、とても使いにくかったです.
そこで、STM8S の 4000番地からある EEPROM
領域に補正値を書き込んで、電源を切っても補正値が消えないように改善しました.
このように、EEPROMに不揮発性のデータを書き込むやりかたを、こちらで解説
しました.
EEPROMへの補正値格納マッピングはこうしました.
4020〜402F
センサ2の補正値をASCIIで格納 (最大15文字)
4060〜406F
センサ6の補正値をASCIIで格納 (最大15文字)
4070〜407F
センサ7の補正値をASCIIで格納 (最大15文字)
STVDのプロジェクトファイルを、ここに置きます. (zip)
以下で、ソースコードの変更点を解説します.
main( )
プログラム起動時に、EEPROMを読んで、補正値変数HOSEIに、補正値をセットするように追加しました.
for(i=0;i<=15;i++){
a[i] = FLASH_ReadByte(0x4020+i); }
HOSEI2 =
atof(a);
for(i=0;i<=15;i++){ a[i] = FLASH_ReadByte(0x4060+i); }
HOSEI6 =
atof(a);
for(i=0;i<=15;i++){ a[i] = FLASH_ReadByte(0x4070+i); }
HOSEI7 =
atof(a);
UART_Menu(
)
補正値コマンドをRS232から受信したら、HOSEI変数をセットすると同時に、EEPROMにASCIIで補正値を格納するようにしました.頭の
FLASH_Unlock( ) で書き換え許可し、末尾の FLASH_Lock( ) で書き換え禁止しています.
else
if(fieldnumber==2 && Field[0][0]=='h' & strlen(Field[1])<=15
&& Field[0][2]==0){
FLASH_Unlock(FLASH_MEMTYPE_DATA);
if(Field[0][1]=='2'){
HOSEI2
= atof(Field[1]);
for(i=0;i<=15;i++){ FLASH_EraseByte(0x4020+i);FLASH_ProgramByte(0x4020+i,(u8)Field[1][i]);
}
}
if(Field[0][1]=='6'){
HOSEI6
= atof(Field[1]);
for(i=0;i<=15;i++){ FLASH_EraseByte(0x4060+i);FLASH_ProgramByte(0x4060+i,(u8)Field[1][i]);
}
}
if(Field[0][1]=='7'){
HOSEI7
= atof(Field[1]);
for(i=0;i<=15;i++){ FLASH_EraseByte(0x4070+i);FLASH_ProgramByte(0x4070+i,(u8)Field[1][i]);
}
}
FLASH_Lock(FLASH_MEMTYPE_DATA);
stm8s_conf.h
#define _FLASH
(1)
FLASH書き換え関数を利用するためにコメント解除
release 2010.9