PIC ことはじめ ~ EEPROM でパラメータの永続化

Posted by
ぴろり
Posted at
2013/05/29 15:58
Trackbacks
関連記事 (0)
Post Comment
コメントできます
Category
電子工作 カテゴリ
カバーイメージ

 PIC アプリケーションで、ユーザが設定変更した動作パラメータなどを、EEPROM に保存して永続化するためのメモ。例えば、24 時間タイマー装置で、プッシュ スイッチを用いてオン/オフ時刻を設定できるようにしている場合や、今までの動作状況(カウンタ値など)が、停電などで PIC の電源が失われたとしても永続化できると嬉しいですよね。まだそこまで複雑なアプリケーションに着手できていないので、出番は当分、先のことになりそうですが、EEPROM を持つチップであればこれを利用できます。

このエントリーをはてなブックマークに追加  

準備

 EEPROM はチップに内蔵された数十~数百バイトのフラッシュ メモリで、ソフトウェア中から読み書きできます。また、チップにソフトウェアを書き込む際に、初期値を流し込むこともできるので、最初に述べたような使途以外にも、ソフトウェアの動作パラメータを流しこんで、コンフィギュレーション テーブルのように使うことも考えられます。EEPROM の動作が、CPU や RAM 上に存在するレジスタや変数と違う点は以下の通りです。

  • 読出しは高速(1 命令クロック)に行えるが、書込みが非常に遅い(約10ミリ秒)
  • フラッシュ メモリのため、書込み回数に寿命がある*1

材料

  • EEPROM を持った PIC。今回は PIC16F84A を使用しました。

回路図

回路図
BSch3V 用回路図データ

説明

  • PIC16F84(A) を使用し、EEPROM の動作を確認します
  • データ ビットの状態を 4 つの LED の点灯/消灯で確認します
  • RESET スイッチを押すと、チップがリセットされます
  • RESET スイッチが押される度に、LED の点灯/消灯パターンが変化します
  • チップを抜き差ししたり、電源が断たれた場合でも、次回起動時に 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);
}

説明

  • EEPROM の初期値をソースコード内に記述できます(10行目)
  • アプリケーションが起動すると、EEPROM の 0 アドレスから 1 バイト読出します(48行目)
  • 読み出したデータを PORTB に出力し、LED を点灯/消灯します(50行目)
  • 読み出したデータに 1 を加えて、EEPROM の 0 アドレスに書き戻します(52行目)
  • EEPROM への書き出しは非常に時間を要しますが、簡単のために割り込みを利用せず、書込み動作が完了するのを待つブロック動作になります(35~36行目)
  • EEPROM に書き出すべきデータと同じデータがセットされていた場合、時間節約のために書込み動作を行いません(24~28行目)*2
  • EEPROM への読み書き用関数(ReadEEPROMWriteEEPROM)はこのまま流用できそうです
このエントリーをはてなブックマークに追加  

  1. *1 ドキュメントに拠れば PIC16F84A で概ね1000万回
  2. *2 EEPROM への書込み動作完了割り込みを期待している場合、割り込みが発生しません

この記事を読んだ人はこんな記事も読んでいます記事リコメンデーションについて

カバー画像:PIC ことはじめ ~ 簡単な I/O

関連記事/トラックバック

関連記事/トラックバックはまだありません

この記事にトラックバックを送るには?

コメントを投稿する

 
 (必須, 匿名可, 公開, トリップが使えます)
 (必須, 匿名可, 非公開, Gravatar に対応しています)
 (必須)
スパム コメント防止のため「投稿確認」欄に ランダムな数字 CAPTCHAについて を入力してから送信してください。お手数ですがご協力のほど宜しくお願いいたします。