PIC アプリケーションで、ユーザが設定変更した動作パラメータなどを、EEPROM に保存して永続化するためのメモ。例えば、24 時間タイマー装置で、プッシュ スイッチを用いてオン/オフ時刻を設定できるようにしている場合や、今までの動作状況(カウンタ値など)が、停電などで PIC の電源が失われたとしても永続化できると嬉しいですよね。まだそこまで複雑なアプリケーションに着手できていないので、出番は当分、先のことになりそうですが、EEPROM を持つチップであればこれを利用できます。
EEPROM はチップに内蔵された数十~数百バイトのフラッシュ メモリで、ソフトウェア中から読み書きできます。また、チップにソフトウェアを書き込む際に、初期値を流し込むこともできるので、最初に述べたような使途以外にも、ソフトウェアの動作パラメータを流しこんで、コンフィギュレーション テーブルのように使うことも考えられます。EEPROM の動作が、CPU や RAM 上に存在するレジスタや変数と違う点は以下の通りです。
RESET スイッチを押すと、チップがリセットされますRESET スイッチが押される度に、LED の点灯/消灯パターンが変化します
#include <pic.h>
__CONFIG (
FOSC_HS // High Speed Crystal/Resonator
& WDTE_OFF // Watchdog Timer: OFF
& PWRTE_OFF // Power-up Timer: OFF
& CP_OFF // Code Protection: OFF
);
__EEPROM_DATA (0x00,0x00,0x00,0x00, 0x00,0x00,0x00,0x00);
// EEPROM の adr で指定されたアドレスから 1 バイト読出す
unsigned char ReadEEPROM (unsigned char adr)
{
EEADR = adr; // Set address
RD = 1; // Set read bit
return EEDATA; // Return read data
}
// EEPROM の adr で指定されたアドレスに data で指定された 1 バイトを書きこむ
void WriteEEPROM (unsigned char adr, unsigned char data)
{
EEADR = adr; // Set address
#if 1
RD = 1; // Set read bit
if (EEDATA == data)
return; // Return read data
#endif
EEDATA = data;
WREN = 1; // Set write enable bit
EECON2 = 0x55;
EECON2 = 0xaa;
WR = 1; // Set programming bit
while (!EEIF) // Wait till write operation complete
NOP ();
EEIF = 0; // Clear EEPROM write complete bit
WREN = 0; // Clear write enable bit
}
// main
#define EEPROM_ADDR 0
void main (void)
{
// 入出力方向の設定
TRISB = 0;
// EEPROM から読出し
char data = ReadEEPROM (EEPROM_ADDR) & 0xf;
// ポートに出力
PORTB = data;
// EEPROM に書き戻す
WriteEEPROM (EEPROM_ADDR, data + 1);
while (1);
}
ReadEEPROM、WriteEEPROM)はこのまま流用できそうです