Pic12F1822のデータEEPROMに書き込むのは

先週から今週にかけて、あいかわらずノロノロ~とまったりプログラムを検討しています。
Pic12F1822のデータEEPROMエリアに、DE命令を使って数値を指定するのにかなり苦労しました。

Picマイコンについては研究されている方も多く、その成果を公開してくださるおかげで有用な情報も特に
苦労することもなく瞬時に調べることができてしまいます。
私の場合は業務で切迫して焦って作っているわけでもなく、単に趣味!?でやっているだけなので、基本的には
マイクロチップの純正ドキュメントをあれこれ調べて解決をするようにして、細々と楽しんでいます。
今回はいくら設定してもうまく動かないので不本意ながらネットで調べみたところ、このことについて話題に
している方も居ないようなので、解決記念で今回判明したことをメモしておきたいと思います。



従来のPic1XやPic18シリーズは、データEEPROMエリアにDE命令でデータを書き込みたい場合、各Picごとに
用意されているドキュメント(Memory Programming Specification)の中にEEPROMの開始アドレスが記載
されているので、これを見てEEPROMのエリアをORG命令でアドレス指定するのが基本です。


同様にPic12F1822のMemory Programming Specificationを見てみると・・・

 「EEPROMエリアは物理的にはプログラムメモリーやレジスタとは別に256byte存在していて、論理的には
  プログラムエリアの1E000h~1E1FFhに256word分マッピングされている。」
 「1wordは2byteであるが、下位byte(LSb:下位byte[bitではない])が先にあり、上位byte(LSb)は後と
  なる。 データEEPROMは下位byteに入っている。」

となっているので

      ORG  0x1E000
      DE   データ1,データ2,・・・

としてアセンブルすると、以下のようなエラーが出てうまくいきません。

      Error[117]  ファイル名 行番号 : Address wrapped around 0


そこで困ってあれこれ調べてみると、MPLABの画面上部にある Help ==> Topics ==> MPASM_Assembler
 ==> キーワードの中にあるEEPROM Byte の中に、これに関する記載がありました。

      Table: EEPROM Start Address by Device
                   Device Address
      Most PIC1X MCUs    0x2100
      PIC18 MCUs       0xF00000
      PIC16F19XX MCUs    0xF000

PIC16F19XXとしか書いてありませんが、このMCUは Pic12F1XXX Pic16F1XXX と同じ
Enhanced Midrange Core なので、Pic12F1822も開始アドレスを

      ORG 0xF000
      DE  データ1,データ2,・・・

と書いてみたところ、正しく動作することを確認しました。



Pic12F1822のMemory Programming Specificationに1E000h~1E1FFhのアドレスが記載されていて、
DE命令時に指定するスタートアドレスと違うことについては次のように解釈できます。

           0x1E000 = B’0001 1110 000 0000 0000
           0x1E1FF = B’0001 1110 000 1111 1111’ 
                                   ↑   下位8bit
                               下から9bit目 

EEPROMは下位8bit、00h~FFhの計256バイトのアドレス空間があります。
プログラムメモリは1word = 2byteなので、下から9bit目が0か1かでLSb(下位byte)とMSb(上位byte)を
区別しています。 上位アドレスには何も入っていません。(物理的に存在していません)

よって、EEPROMの物理アドレス00hは論理アドレスでは以下のように表現されます。

            LSb = B'0001 1110 0000 0000 0000'
            MSb = B'0001 1110 0001 0000 0000'

実際にはEEPROMのデータは8bitでLSbとMSbの区別はつけないので、下から9bit目は無視(カット)して
下から4bitずつ16進数表記をすると、

            B'1111 0000 0000 0000' = 0xF000 

となり、これがMPLABでのDE命令のデータEEPROMスタートアドレスと合致します。



商売柄、人にわかりやすく説明するのは不得意なのでこの程度の書き方しかできませんが、いずれにしても
マイクロチップによるミッドレンジコアMCUのこの部分に関する説明はたいへんに不親切です。
せめて0xF000という開始アドレスもMemory Programming Specificationに記載しておいてほしいものです。

もし、このミッドレンジコアの開始アドレスに関して明確に書かれているMicrochipの純正ドキュメントがあれば
是非ご紹介ください!


2012_0229

この記事へのコメント:

管理人のみ通知 :

トラックバック: