PIC EEPROM |
EEPROM の使い方
EEPROMは他のメモリから独立したメモリです。PICプログラマからの書き込み、実行プログラムからの読み書きも可能で、最近発売のPICにはほとんど実装されています。EEPROMは8bit幅のメモリで、PICによって容量は異なりますので、それぞれのデータシートで確認が必要です。EEPROMの読み書きにはmsecオーダーの時間が必要で、特に書き込み速度は遅いので注意が必要です。 EEPROMに関係するSFR
EEPROMへのアクセスは、SFRのEEADR, EEDATA, EECON1, EECON2を使い間接的に行います。
EEDAは8ビットのEEPROMのアドレス指定用のレジスタ。
EEDATAは8ビットの実データ読み書き用のレジスタ。
EECON1は読み書きに関する、開始命令・完了フラグ・許可/禁止・エラーフラグを指定、監視できるレジスタ。下位5ビットが有効。
EECON2は書き込みの時に使用。アセンブラの書き方サンプルを参考にして下さい。
EECON1
-- -- -- EEIF WRERR WREN WR RD
RD:1をセットすると読み出しが開始される。読み出しが終了すると自動的に0になる
WR:1をセットすると書き込みが開始される。書き込みが終了すると自動的に0になる。
WREN:1は書き込み許可、0は書き込み禁止。
WRERR:書き込みエラーフラグ。1がエラー
EEIF:書き込みが完了すると1が立つ。PIC16F84Aの EEDATA, EEADRはBank0にありますが、PIC16F6xxAのEEDATA, EEADRはBank1にあります。自分が使うPICのデータシートで確認が必要です。
EEPROMの開始アドレスはH'2100'番地に割り当てられています。プログラム中のORG文でH'2100'以降を指定し、初期値として値を保存することができます。 H'2100'とはライターの仕様によるものですが、ほとんどのライターはH'2100'がEEPROMデータメモリの先頭を指すようになっています。 また、PIC18Fシリーズの場合には、EEPROMの開始アドレスはH'F00000'に割り当てられています。 詳しくはPrograming Specificationを参照してください。
プログラムからEEPROMに初期値として書き込む方法
この例ではH'00'がEEPROMの先頭番地に書き込まれ、H'11'が次の番地に、という風に順に書き込まれます。
(例1)
ORG H'2100' DE H'00', H'11', H'22'例1をPICプログラマで書き込む時、Programmer > Setting で開かれるウインドウの、Programタグで、表示される"EEPROM"のチェックボックスがチェックされている必要があります。プログラム処理によってEEPROMに対して読み出し、書き込みを行なう方法
読み出し手順要約
1.データの保存先アドレスをEEADRにセット
2.EECON1のRDにビットセット(読み出し実行)
3.EEDATAに値が返る
書き込み手順要約
1.データの書き込み先アドレスをEEADRにセット
2.書き込みたい値をEEDATAにセット
3.EECON1のWRENにビットセット(書き込み許可を与える)
4.呪文を唱える
5.EECON1のWRにビットセット(書き込み実行)
6.EECON1のWRがクリアされる(完了を)のを待つ
(例2)プログラムでEEPROMに読み書きする
;変数のメモリ確保 e_ADRS equ 0x00 ;EEPROM保存先アドレスを記憶 e_DATA equ 0x01 ;EEPROMに保存するデータを一時的に記憶 【Raed手順】Wレジスタにデータを読み出す RD_EEPROM MOVF e_ADRS, W ;保存先アドレスを一旦Wレジスタへ格納 BSF STATUS, RP0 ;Set to page 1 MOVWF EEADR ;アドレスをEEADRへセット BSF EECON1, RD ;読み出し開始 MOVF EEDATA, W ;Wレジスタにデータ取り出し BCF STATUS, RP0 ;PAGE0に戻る 【Write手順】 WR_EEPROM BCF STATUS, RP0 ;Set to page 0 MOVF e_ADRS, W ;データエリアのアドレス指定 BSF STATUS, RP0 ;Set to page 1 MOVWF EEADR ;Address set BCF STATUS, RP0 ;Set to page 0 MOVF e_DATA, W ;書き込むデータセット BSF STATUS, RP0 ;Set to page 1 MOVWF EEDATA ;Data set BSF EECON1, WREN ;Set WR Enable MOVLW 55H ;Write Sequence(B'01010101') MOVWF EECON2 ;Start write MOVLW 0AAH ;(B'10101010') MOVWF EECON2 BSF EECON1, WR ;Go write WR_LP ;書き込み確認待ちループ BTFSC EECON1, WR ;Check Write end GOTO WR_LP BCF STATUS, RP0 ;Return to page 0
EEPROMのバグ
エラータでPIC16F648AのEEPROMのバグが報告されています。
原文
Unexpected program execution may occur during data EEPROM write cycle.
Note: This problem is corrected in PIC16F648A Rev. A5 and PIC16F627A/628A Rev. A8.
和訳
EEPROMの書き込み中に期待しない動作が起こるかもしれない.
注)この問題はPIC16F648A Rev. A5 とPIC16F627A/628A Rev. A8 で修正されている.
(秋月電子で2005.6に購入したPIC16F648A I/P はDate code 0414367でRev. A1.)
(秋月電子で2005.8に購入したPIC16F648A I/P はDate code 04193BJでRev. A1.)
入手したPICがどのバージョンのものかを調べてEEPROMに限らずバグが無いか確認する必要があります。このエラータに掲載されているEEPROMバグの回避策は下の通りになっていました。
DATA EEPROM WRITE CODE EXAMPLE
BANKSEL 0x00 ;select Bank0 BCF PIR1, EEIF ;enshure write complete ;flag is clear BANKSEL 0x80 ;change to Bank1 MOVLW 1 << PEIE ;enable only ;periphral interrupt MOVWF INTCON ; MOVLW 1 << EEIE ;enable only EE write ;complete interrupt MOVWF PIE1 ; BSF EECON1, WREN ;enable EE write MOVLW 0x55 ;required write ;protect squence MOVWF EECON2 ; MOVLW 0xAA ;second part of ;sequence MOVWF EECON2 ; BSF EECON1, WR ;initate write SLEEP ;suspend operation ;during write BCF EECON1, WREN ;disable EE write ;program execution ;resumes with this ;instruction upon EE ;write completion
PICマイコンと電子工作 HOME