2011年08月13日

PIC HI-TECH CでEEPROMアクセス

PIC HI-TECH CでEEPROMアクセス

マイクロチップのPICマイコンにて、HI-TECH Cコンパイラを使用してのPIC内臓のEEPROMアクセスはとても簡単です。
下記のコードでバイトアクセスが完了します。
うまく組み込んでメモリー機能付エレキーでも作ってみましょう。


コメント欄に追加情報があります。 ご参考まで。

他の処理で割込イベントを使用している場合には、書き込み時
 WREN = 1;
処理前に割込を禁止にしておく必要があります。(マクロをご参照)


#include <pic.h>
//───────────────────────────────────
// Read data
//───────────────────────────────────
unsigned char E2promRead( unsigned char adr )
{
EEADR = adr;
RD = 1; // Set read bit
return( EEDATA ); // Return read data
}


//───────────────────────────────────
// Write data
//───────────────────────────────────
void E2promWrite( unsigned char adr, unsigned char data )
{
EEADR = adr;
EEDATA = data;

WREN = 1;   // Set write enable bit
EECON2 = 0x55;
EECON2 = 0xaa;

WR = 1;   // Set programming bit
while( EEIF == 0 ) // Wait till write operation complete
{
NOP();
}
EEIF = 0; // Clear EEPROM write complete bit
WREN = 0;   // Clear write enable bit
}





同じカテゴリー(マイコン開発)の記事
Fusion PCBでエレキー
Fusion PCBでエレキー(2020-04-01 19:00)


この記事へのコメント
EEPROM_READ, EEPROM_WRITEはhtc.hで用意されていますので、こちらの方が便利と思います。

EEPROM_READ(ADR)
EEPROM_WRITE(ADR,DATA)

htc.hを使う事になっていますが、旧pic.hでも同じ定義な様です。

ご参考になれば幸いです。
Posted by エアーバリアブル at 2011年08月18日 03:16
エアーバリアブル様

こんにちは。

ご指摘ありがとうございます。
上記の定義ノーチェックでした。

調べてところ
 C:\Program Files\HI-TECH Software\PICC\9.81\include
フォルダ(バージョンにより異なります)のインクルードファイルの
 eeprom_routines.h
でマクロとして定義されていました。(htc.hまたはpic.hでインクルード)

定義内容は下記の通りです。

#define EEPROM_WRITE(addr, value) \
do{ \
 while(WR)continue;EEADRL=(addr);EEDATA=(value); \
 CARRY=0;if(GIE)CARRY=1;GIE=0; \
 WREN=1;EECON2=0x55;EECON2=0xAA;WR=1;WREN=0; \
 if(CARRY)GIE=1; \
}while(0)

#define EEPROM_READ(addr) ((EEADRL=(addr)),(RD=1),EEDATA)


このマクロをそのまま使用する場合
「EEIF (EEPROM write complete bit)」 をチェックしていないので
Write直後のReadは注意が必要です。

また、マクロ定義ですので、使用するたびにコードサイズが増えていきます。
Posted by 宇都宮 at 2011年08月18日 08:26
宇都宮様、

定義内容を調べたのですね。
EEIF (EEPROM write complete bit)をチェックしていない事と、マクロ定義ということで、コードサイズが大きくなるという件は参考になりました。
いつも単純に用意された物を使っていただけでしたので、このテクニックは参考になります。

どうもありがとうございました。
Posted by エアーバリアブル at 2011年08月18日 08:45
エアーバリアブル様

早速のコメントありがとうございます。
また何かお気づきの点がありましたら、アドバイスお願いいたします。

現在忙しくて、ブログの更新が滞っていますが
一段落したら新しい記事をまとめたいと思います。
Posted by 宇都宮宇都宮 at 2011年08月18日 15:56
一つの関数にすると劇的に容量が小さくなりました。更に、こちらで公開されているソースを使用すると更に小さくできました。
レポートは私のブログに書き留めました。ご参考頂ければ幸いです。
http://airvariable.asablo.jp/blog/2011/08/22/6062680
貴重な情報を頂いて感謝致します。

また、ソースは私の公開しているフリーソフト中で使わせて頂きましたが、もし問題がありましたらご指摘頂ければ幸いです。

http://www.ne.jp/asahi/air/variable/picmel/applications/lcd_vu_meter/index.html
Posted by エアーバリアブル at 2011年08月22日 08:33
エアーバリアブル様

レポート拝見しました。
わかりやすくまとめていらっしゃるので関心しました。

ソース公開の件はまったく問題ありません。
他にも使えそうなソースがありましたら、どしどし使ってください。
Posted by 宇都宮 at 2011年08月22日 09:17
関数の中に、マクロを定義するれば、コードサイズは大きくなりませんね。
Posted by お名前 at 2014年12月16日 09:19
> 関数の中に、マクロを定義するれば、コードサイズは大きくなりませんね。

そうですね。 かつ、その方がライブラリの互換性が良くなると思います。
Posted by 宇都宮宇都宮 at 2014年12月16日 09:49
上の画像に書かれている文字を入力して下さい
 
<ご注意>
書き込まれた内容は公開され、ブログの持ち主だけが削除できます。

削除
PIC HI-TECH CでEEPROMアクセス
    コメント(8)