PICには電源を切ってもデータを保存して置ける領域としてEEPROM(Electrically Erasable Programmable ROM)が用意されています。
PIC16F84Aの場合EEPROMのサイズは、データ長8bitのものが64個で計64byteの領域が存在します。
このEEPROMですが、その特性上書き込み回数の上限値が決まっており、仕様上は1000万回までの書き換えが保証されています。一見すると1000万回なんて到達しなさそうですが、PICの動作速度が速い為、頻繁に書き換えると、意外とすぐに上限に達してしまいます。
計算してみると、1回の書き込みは10msec程度で終わるので、プログラムのロジックが悪い(?)と毎秒100回ぐらいは書き込むことができてしまいます。そうすると1日で100*3600*24=864万回ぐらい書けてしまうので、1日強で書き込み上限に達することができます。
また書き込んだデータの保持期間については,40年までは保障されています。
ただしこれは設計値を守って使用した場合なので、温度が高いところで使用したり供給する電圧が微妙に高すぎるなどの設計値を逸脱した環境で使用した場合はもっと短くなります。
アセンブラによるEEPROM領域へのアクセス方法についてですが、レジスタと異なりMOV命令では取得することはできません。その代わりに、以下のSFR(Special Function Register)を操作することで読み書きを行います。
EEDATA 書き込み(読み出し)データ指定用レジスタ EEADR 書き込み(読み出し)先のアドレス指定用レジスタ EECON1 EEPROM操作のコントロール用レジスタ EECON2 EEPROM操作のコントロール用レジスタ |
それでは、EEPROMへの具体的なアクセス方法を確認していきます。
EEPROMへのデータ書き込み
EEPROMへの書き込み手順は以下の通りで行います
1. EEADRレジスタに書き込むべき場所(アドレス)を指定する 2. EEDATAレジスタに書き込むデータを設定する 3. EECON1の2ビット目(WREN)を1にする(書き込み有効にする) 4. EECON2に55H,AAHを書き込む 5. EECON1の1ビット目(WR)を,1にする(書き込み要求を行う) 6. 書き込みが終わるのを待つ |
上記の4.での書き込みは、具体的には以下のアセンブリになります。
これは、下記の4命令を正確に、この順に実行する必要があります(データシートでも明記されています)。
MOVLW H'55' MOVWF EECON2 MOVLW H'AA' MOVWF EECON2 |
6.の完了待ちについては、書き込みが完了するとEECON1の1ビット目が1->0に更新されるので、それを監視します。この更新(書き込み処理)にはかなり(5msec程度)時間がかかるので、一般的にはループ処理を作って完了を待つ事が多いです。。
–書き込みの成功チェック–
上記シーケンスを見ても分かるように、EEPROMへの書き込みは、書き込みが成功したか否かについて、PICデバイス側から応答をもらうことはできません。
このため、書き込みチェックを行うためには、書いたデータが正しいかを再度読み込んでチェックする(ベリファイ処理)必要があります。
EEPROMからのデータ読み出し
EEPROMからのデータ読み出しは、以下の流れになります1. EEADRに読み出したい場所のアドレスをセットする 2. EECON1の0ビット目(RDビット)を1にする 3. EEDATAからデータを読み取る |
これはアセンブラで書くと、以下のような流れになります。
BCF STATUS, RP0 ; バンク0に切り替える MOVLW 0x00 ; 読み込むEEPROMのアドレスを指定する(この例では0番地) MOVWF EEADR BSF STATUS, RP0 ; バンク1に切り替える BSF EECON RD ; 読み出し要求を立てる BSF STATUS, RP0 ; バンク0に戻す MOVF EEDATA, W ; WレジスタにEEPROMの内容を読み出す |
読み込みは、書き込みと違って1サイクルあればEEPROMからの読み出し準備が完了します。
ですのでRDビットを1にした直後にEEDATAから読み取りを行っても構いません。
※ちなみに,EEPROMへは間接アドレッシングによるアクセスはできないので注意が必要です。
MPLABのシミュレーターで実行時におけるEEPROM関係の制限
MPLABのシミュレータでデバッグ実行する場合、EEPROMの値はメニューバーのView->EEPROMより確認できます。
EECON2は、物理的には存在しないレジスタ(制御用)なので、このレジスタに値を書き込んでもシミュレータ上のレジスタ値は変更しません。
書き込みで、EECON1の1ビット目(WR)の待ちについては、シミュレーター上の時間で4msec程度掛からないと変化しません。
20MHzの設定でデバッグしていると、フラグが落ちるまで20000命令ぐらい待たなければならないので、ステップ実行ではいつまでまでたっても先に進みません。
実際に待たせてみたのが、下のキャプチャ画像です。

書き込み完了をシミュレータで確認したい場合は、ループの終わりにブレークポイントを張って、一度実行させてしまう必要があります。
関連記事
コメントを残す