メニュー
▼ アクセス(地図)
▼ Windowsアプリ開発 ▼ マイコン開発 ▼ CGI・PHP制作 |
▼ サイトマップ(全投稿記事)
▼ タイトル(画像一覧) ▼ 事業内容 |
お問い合わせメールフォームが開きます。
2011年08月13日
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
}
この記事へのコメント
EEPROM_READ, EEPROM_WRITEはhtc.hで用意されていますので、こちらの方が便利と思います。
EEPROM_READ(ADR)
EEPROM_WRITE(ADR,DATA)
htc.hを使う事になっていますが、旧pic.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は注意が必要です。
また、マクロ定義ですので、使用するたびにコードサイズが増えていきます。
こんにちは。
ご指摘ありがとうございます。
上記の定義ノーチェックでした。
調べてところ
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)をチェックしていない事と、マクロ定義ということで、コードサイズが大きくなるという件は参考になりました。
いつも単純に用意された物を使っていただけでしたので、このテクニックは参考になります。
どうもありがとうございました。
定義内容を調べたのですね。
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
レポートは私のブログに書き留めました。ご参考頂ければ幸いです。
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