楽々PIC

水田除草と言うブログを書いていますが、PIC関連の記事が意外に人気で驚いています。 PICを使った電子工作に興味を持つ方が多いことを知って、一緒にPICを学ぶブログを作りたいと思いました。 「楽々PIC」は教材と言うよりも少し実用性?のある楽しい道具を作りながら学ぶブログを目指します。

EEPROM

EEPROM 読み書き

 「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書き込み


下図は、正しく書き込めたか確かめるべリファイ処理です。

EEPROM を読み出す処理は以下の通りです。
 (1) EEADR にアドレスを書き込む
 (2) アクセス先として EEPROM を選択 ( BCF  EECON1 , EEPGD )
 (3) 書き込み指示 ( BSF  EECON1 , RD )
 (4) EEDATA からデータを読み出す

読み出し時には完了待ちや割り込み処理は不要で、(3)の後すぐに読み出せます。
連続して 2byte 以上の読み出しを行う場合の(2)は、前述書き込み時と同様の扱いです。

EEPROMべリファイ

以上のようにプログラムで書き込んだ内臓 EEPROM の内容は MPLAB の EEPROM ウィンドウに反映されない点に注意が必要です。 ブレークポイントを設定し、プログラムを止めて EEDATA の内容を見るなどデバックに手間がかかります。 最終的には EEPROM から読み出した値をデータ・メモリーに書き出して確認しました。

今回は、上図のプログラムはいずれも不採用にしましたが、近いうちに赤外線リモコンを使ってプログラム定数を変更する場面で EEPROM の読み書きが必要になると思います。 その時には EEPROM 割り込みを使ったプログラムを紹介したいと思います。


楽々PIC」は楽しい道具を作りながら学ぶブログを目指します。



EEPROM 初期設定

 RRP1320-1-02 では予め内臓 EEPROM に記録した赤外線リモコンの受信コードを元に、押されたボタンを特定して所定のサブルーチンを CALL します。 EEPROM に初期値を書き込む方法について説明してみます。  <PICデバイス=18F1320>

EEPROM に初期設定を書き込む際には、下図のようにアセンブラの DE 疑似命令を使います。 プログラム・メモリーにテーブルを準備する時に使う DB 疑似命令と同様に使えるようです。

EEPROM_DE

ORG 疑似命令で先頭を指定して、DE 疑似命令を並べます。 PIC18F シリーズでは 0F00000H ~ 0F000FFH の 256byte を指定します。 上図のように指定した結果は、EEPROM ウィンドウでも確認できます。

PICkit3 をプログラマーに設定して PIC に書き込む際には、Programmer → Settings で表示される PICkit3 Settings ウィンドウの Program Memory タグにある Memories EEPROM にチェックが入っていることを確認する必要があります。

Programmer_Settings


DE 疑似命令を使うと下図の通り、自動的にチェックが入るようです。

Program_Memory

初めは DE 疑似命令を知らずに、プログラム・メモリーに DB 疑似命令でテーブルを準備して、自前のプログラムで EEPROM に転送していたのですが、一般的でない上に EEPROM ウィンドウに反映されない為、DE 疑似命令による初期設定に変更しました。

EEPROM に転送するプログラムは書き込みとべリファイの為の読み出しを行うものですが、動作中にEEPROMを書き換える時に応用できると思いますので、別の記事「EEPROM 読み書き」で動作確認済みソースを紹介しています。


赤外線リモコン受信の関連記事インデックスはこちら → 「赤外線リモコン受信


楽々PIC」は楽しい道具を作りながら学ぶブログを目指します。


PICのメモリー

 このブログでは、PICを動かすプログラムを作成するに必要最小限の説明を行いたいと考えています。 その立場でPIC18Fのメモリーを説明します。 これまでの記事にもデータ・メモリー、プログラム・メモリーと言った言葉を使ってきましたが、少しまとめてみます。 太い線で囲まれたメモリーはPICに何らかの動作をさせようとすると必ず扱うメモリーです。 EEPROMメモリーは必要に応じて使います。 灰色の文字で示したメモリーはプログラムの動作に必須ですが、極々特殊な例を除けばプログラムで書き換えることはありあません。(言葉だけ覚えておけば良いと思います。)

memory

<<< プログラム・メモリー >>>
プログラム・メモリーはMPLAB(等)で作成したプログラムを書いて使います。 PICは電源リセット直後に0番地から命令を読み出して実行します。 プログラム・メモリーに書かれた情報は、PICの電源が切れても保存され、次に電源が入るとPICは再び0番地から命令を読み出して実行します。

PICはプログラム・メモリーに書かれた命令を次々と実行するだけでなく、ここに書かれたデータテーブルを読み出して活用したり、新たに情報を書き換えることが出来ます。 プログラム・メモリーは10万回の書き換えに耐えるようです。(有限だけど、ほぼ無限です!)

<<< データ・メモリー >>>
PICに何らかの処理をさせようとすれば必須のメモリーです。 正式には File Registers と呼ぶようですが、このブログではデータ・メモリーと書きます。 PICの電源が切れるとデータ・メモリー内の情報は失われます。 プログラムが自由に使うメモリーで、プログラムの目的を達成する為に、その多くの部分がデータ・メモリーにアクセスする命令に成るのが普通です。

データ・メモリーは幾つかのバンクで仕切られていますが、最も良く使うのがアクセスバンクです。 このブログでは 「データ・メモリー≒アクセスバンク」 と言う扱いです。 プログラムで扱う情報が多いケースでは他のバンクを使うことも考えます。

アクセスバンクの中に、SFR ( Special Function Register ) と言う特殊な役割を持ったメモリー群があります。 SFRはPICの各端子を電気的に入出力動作させる為のソフトウェアとハードウェアのインタフェースと言った役割のものが多く、用途毎に指定されたSFRにアクセスします。 PICではテーブル参照(間接アドレッシング)や掛け算もSFRを使って実現します。

<<< EEPROMメモリー >>>
PICの電源が切れても情報を保存するデータ用のメモリーです。 累積動作回数を記録すると言った用途で、必要に応じて使います。

<<< スタックメモリー >>>
サブルーチンコールや割り込み時に戻り番地を記録する為に使われるメモリーで、特殊な使い方を除きプログラムで値を読み書きすることはありません。 注意したいのはその容量ですが、31段の戻り番地を記録出来るので普通は心配いりません。 名前だけ知っていれば困らないと思います。

<<< プログラムカウンター >>>
プログラム・メモリーの中で、現在どのアドレスを実行しているかを記録しているメモリーです。 名前だけ知っていれば良いと思います。


楽々PIC」は楽しい道具を作りながら学ぶブログを目指します。



ダウンロードコーナー
記事検索
アンケートに御協力下さい


アーカイブ
楽々PIC 宛てBlogMail


--- ご了承下さい ---

注意して記事を書いていますが、記事及びリンク先の情報による不利益について、一切責任を負い(負え)ません。
QRコード
QRコード
アクセスカウンター

    Atsuhiro Imai

    バナーを作成


    プロフィール

    jyosou_robot

    • ライブドアブログ