「EEPROM 初期設定」で紹介し通り、内臓 EEPROMに初期値を書き込む時にはアセンブラの疑似命令 DE を使うのが便利です。 一方で、処理中の定数をEEPROMに保存して、再起動時に活用するような場合は EEPROM にを読み書きするプログラムが必要になります。
下図はプログラム・メモリー上にある 20byte のデータ列を EEPROM に書き込んでいます。 リセット直後の初期化処理用に作った為、1byte 書き込みの都度完了を待つ間(数msec)は他に何もせずにループしています。 リアルタイム処理を行いながら書き込む場合は割り込みを使う必要がありますが、ここでは動作確認済みの読み書き手続きを説明することを目的にします。 <PICデバイス=18F1320>
EEPROM に書き込む手順は以下の通りです
(1) EEADR にアドレスを書き込む
(2) EEDATA にデータを書き込む
(3) アクセス先として EEPROM を選択 ( BCF EECON1 , EEPGD )
(4) 書き込み許可指示 ( BSF EECON1 , WREN )
(5) 書き込みシーケンス1として EECON2 に値 055H を書き込む
(6) 書き込みシーケンス2として EEOCN2 に値 0AAH を書き込む
(7) 書き込み指示 ( BSF EECON1 , WR )
(8) 書き込み完了待ち EECON1 <WR> が 0 になるまで待つ
(あるいは完了割り込み処理を作成)
(9) 書き込み禁止指示 ( BCF EECON1 , WREN )
連続して 2byte 以上を書き込む場合は、1byte 目に(3)~(4)を実行して 2byte 目では省略しても問題ないようです。 念の為、下図の通り EEPROM アクセスの最初に BCF EECON1 , CFGS も実行し、誤ってコンフィグレーションビットにアクセスしないようにしています。
下図は、正しく書き込めたか確かめるべリファイ処理です。
EEPROM を読み出す処理は以下の通りです。
(1) EEADR にアドレスを書き込む
(2) アクセス先として EEPROM を選択 ( BCF EECON1 , EEPGD )
(3) 書き込み指示 ( BSF EECON1 , RD )
(4) EEDATA からデータを読み出す
読み出し時には完了待ちや割り込み処理は不要で、(3)の後すぐに読み出せます。
連続して 2byte 以上の読み出しを行う場合の(2)は、前述書き込み時と同様の扱いです。
以上のようにプログラムで書き込んだ内臓 EEPROM の内容は MPLAB の EEPROM ウィンドウに反映されない点に注意が必要です。 ブレークポイントを設定し、プログラムを止めて EEDATA の内容を見るなどデバックに手間がかかります。 最終的には EEPROM から読み出した値をデータ・メモリーに書き出して確認しました。
今回は、上図のプログラムはいずれも不採用にしましたが、近いうちに赤外線リモコンを使ってプログラム定数を変更する場面で EEPROM の読み書きが必要になると思います。 その時には EEPROM 割り込みを使ったプログラムを紹介したいと思います。
「楽々PIC」は楽しい道具を作りながら学ぶブログを目指します。
下図はプログラム・メモリー上にある 20byte のデータ列を EEPROM に書き込んでいます。 リセット直後の初期化処理用に作った為、1byte 書き込みの都度完了を待つ間(数msec)は他に何もせずにループしています。 リアルタイム処理を行いながら書き込む場合は割り込みを使う必要がありますが、ここでは動作確認済みの読み書き手続きを説明することを目的にします。 <PICデバイス=18F1320>
EEPROM に書き込む手順は以下の通りです
(1) EEADR にアドレスを書き込む
(2) EEDATA にデータを書き込む
(3) アクセス先として EEPROM を選択 ( BCF EECON1 , EEPGD )
(4) 書き込み許可指示 ( BSF EECON1 , WREN )
(5) 書き込みシーケンス1として EECON2 に値 055H を書き込む
(6) 書き込みシーケンス2として EEOCN2 に値 0AAH を書き込む
(7) 書き込み指示 ( BSF EECON1 , WR )
(8) 書き込み完了待ち EECON1 <WR> が 0 になるまで待つ
(あるいは完了割り込み処理を作成)
(9) 書き込み禁止指示 ( BCF EECON1 , WREN )
連続して 2byte 以上を書き込む場合は、1byte 目に(3)~(4)を実行して 2byte 目では省略しても問題ないようです。 念の為、下図の通り EEPROM アクセスの最初に BCF EECON1 , CFGS も実行し、誤ってコンフィグレーションビットにアクセスしないようにしています。
下図は、正しく書き込めたか確かめるべリファイ処理です。
EEPROM を読み出す処理は以下の通りです。
(1) EEADR にアドレスを書き込む
(2) アクセス先として EEPROM を選択 ( BCF EECON1 , EEPGD )
(3) 書き込み指示 ( BSF EECON1 , RD )
(4) EEDATA からデータを読み出す
読み出し時には完了待ちや割り込み処理は不要で、(3)の後すぐに読み出せます。
連続して 2byte 以上の読み出しを行う場合の(2)は、前述書き込み時と同様の扱いです。
以上のようにプログラムで書き込んだ内臓 EEPROM の内容は MPLAB の EEPROM ウィンドウに反映されない点に注意が必要です。 ブレークポイントを設定し、プログラムを止めて EEDATA の内容を見るなどデバックに手間がかかります。 最終的には EEPROM から読み出した値をデータ・メモリーに書き出して確認しました。
今回は、上図のプログラムはいずれも不採用にしましたが、近いうちに赤外線リモコンを使ってプログラム定数を変更する場面で EEPROM の読み書きが必要になると思います。 その時には EEPROM 割り込みを使ったプログラムを紹介したいと思います。
「楽々PIC」は楽しい道具を作りながら学ぶブログを目指します。