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
)はこのまま流用できそうです