MCC(MPLAB Code Configurator)を操作して見る(Memory編)

〔導入編〕 〔操作編〕 〔Timer〕 〔CLC〕 〔MPLAB X の使い方に戻る〕


前前ページの〔導入編〕でMCCのインストールの行い方を記述しました。
前ページの〔操作編〕でMCCの基本モジュール[System Module][Pin Module][Interrupt Module]の
操作方法を記述しました、なので基本操作は読んでいる者として以下は記述します。

このページでは〔Memory編〕としてEEPROM/HEF/Flashの操作方法です。

従来の方法

従来の方法は、”PICのEEPROMとHEFについて”を参照下さい。
そのページに記述して有る様にEEPROMからの読み書きは、"eeprom_read( )/eeprom_write( )"関数で
行っていました。
ですがぁ"XC8 v1.40"のコンパイラに切り替えた所、PIC18系ではeeprom関数はサポートしなくなった
様です、PIC12/PIC16系は従来通り利用出来ます。

コンパイラのワーニング画面
従来通りコンパイルをしてみるとぉ、”ルーチンはサポートされなくなりました。
MPLAB X MCCを使用して下さい。”っと来たもんだ。

《Memory》

なのでぇ、MCCでMemoryにアクセスする方法を書いて置きます。
(もちろん、PIC12/16/18系の全てで動作可能です、又、旧コンパイラでも動作します)

Memoryモジュール設定ウインドウの開き方

MEMORY起動画面 IDE左側まん中のウインドウの[Device Resources]画面で操作を行います。

1. Memoryの文字をダブルクリックするか左横の▼をクリックします。
2. 左図の様になるので、MEMORYをダブルクリックします。
  (この後、少し時間が掛かります)
3. MEMORYの文字が消え、設定ウインドウが展開されます。

MEMORY初期画面
この様な"MEMORY"画面が表示されます。
"Add DataEE Routines"はeepromにアクセスする為のルーチン追加の事です。
このまま何も操作をしないで[Generate]を行います。

[Generate]の行い方

[Generate]画面 IDE左側上のウインドウの[Project Resources]画面で
操作を行います。
[Generate]ボタンを押し自動生成させましょう。

下の様にGenerateファイル保存画面が表示されます。

Generateファイル保存画面
プロジェクトのフォルダーが開くと思うのでこのまま[保存]ボタンをクリックします。

Generateファイル保存画面
IDEの下ウインドウに"completed"文字が表示されたら終了です。

プロジェクトの画面
左の如く生成されたファイルが、プロジェクトにも
登録されています。

私はこの登録されたファイルではあつかいづらいので、
登録されたファイルは一旦全て
"Remove From Project"を行いました。

[Generate]の際にProjectに登録するか聞いて来て
欲しいぞぉ。Microchipさん!


プロジェクトの画面
プロジェクトのフォルダにもこの様に生成されたファイルが
追加されています。

"mcc_generated_files"フォルダーの中に有る、
[memory.h][memory.c]のファイルを使用します。
後のファイルは消してしまっても良いでしょう。


[memory.h][memory.c]のファイルについて

このファイルがData EEPROM MemoryFlash Program Memoryにアクセスする為の関数集です。
この関数集はそのまま利用する事にします。
[memory.h]を見れば、Example等が書いて有るのでぇさほど難しい事もないと思われますがぁ...

以下はPIC18F26K22で[Generate]した結果です。
使用するPICで若干関数が異なる所に注意しましょう、詳しくは生成されたファイルを見ましょう。

Flash Module APIs
 uint8_t FLASH_ReadByte(uint32_t flashAddr)
 uint16_t FLASH_ReadWord(uint32_t flashAddr)
 void   FLASH_WriteByte(uint32_t flashAddr, uint8_t *flashRdBufPtr, uint8_t byte)
 int8_t  FLASH_WriteBlock(uint32_t writeAddr, uint8_t *flashWrBufPtr)
 void   FLASH_EraseBlock(uint32_t baseAddr)

 これらの関数はプログラムエリアのメモリに読み書き出来ます、十分に注意が必要です。

 "FLASH_WriteByte"は一旦 1ブロック読み出され、指定バイトを変更後"FLASH_WriteBlock"されます。
 "FLASH_WriteBlock"は該当ブロックを"FLASH_EraseBlock"で消去された後に書き込まれます。
 1ブロックのサイズはPICにより異なるので[memory.h]を見ましょう。

Data EEPROM Module APIs
 void  DATAEE_WriteByte(uint8_t bAdd, uint8_t bData)
 uint8_t DATAEE_ReadByte(uint8_t bAdd)

 この関数が従来の"eeprom_read( )/eeprom_write( )"の代わりを行う物です。

 上の関数は、"uint8_t bAdd"と8ビットアドレス指定ですが、
 PIC16F18313の様に16ビットアドレス指定が下記の様に有るので注意しましょう。

 void  DATAEE_WriteByte(uint16_t bAdd, uint8_t bData)
 uint8_t DATAEE_ReadByte(uint16_t bAdd)

8ビットアドレスでの動作結果

以下はPIC18F26K22シミュレータを動作させて見た結果の画面です。

8ビットアドレスでの動作結果画面1

"FLASH_ReadWord( )"でFlash Program Memoryのアドレス=0x02番地を読み出した物です。
変数のiを表示させてみると、ちゃんと”FO7F”の内容が読み出されている事が解ると思います。

8ビットアドレスでの動作結果画面2

まず、"__EEPROM_DATA"でEEPROMに初期値データを書き込んで置きます。
そして、"DATAEE_ReadByte( )"で"EEPROM"のアドレス=0x01番地を読み出すとぉ、
変数のcには"0x11"が読み出されていますね。


16ビットアドレスでの動作結果

以下はPIC16F18313シミュレータを動作させて見た結果の画面です。
PIC16系は"eeprom_read( )"も使えるので、"DATAEE_ReadByte( )"の両方で読み出して見ました。

16ビットアドレスでの動作結果画面1

画面を見てもらえば変数のcとnumがちゃんと内容を表示していますね。
上の画面で、青色四角内のアドレス表示が"F000"と16ビットで表示されています、
8ビットの画面では"000"と表示されているので違いが解るかと思います。

※ 上の画面で、EEPROMに初期値データを書込む方法で"eeprom char dt=0x30 ;"の行が有りますが
   PIC18系では使えません、記述しても無視されます、"__EEPROM_DATA"のみ可能です。


《HEF》

EEPROMの無いPIC12F1501等の系統はHEFと言うFlash Program Memoryの一部に書き込める機能が
有ります。
PIC12F1501でGenerateした結果の[memory.c]を見てみます。

Flash Module APIs
 uint16_t FLASH_ReadWord(uint16_t flashAddr)
 void   FLASH_WriteWord(uint16_t flashAddr, uint16_t *ramBuf, uint16_t word)
 int8_t  FLASH_WriteBlock(uint16_t writeAddr, uint16_t *flashWordArray)
 void   FLASH_EraseBlock(uint16_t startAddr)

EEPROMが無いので以上の関数のみです。

HEFに関する詳しい内容は、”PICのEEPROMとHEFについて”を見て下さい。

《その他》

それにしても、コンパイラのバージョンが変わる度に前の関数や記述方法等が使えなくなる様な事は
止めて欲しいもんだ。
その度にMyHPの見直し等にせまられるんだぞぉ!!!




【きむ茶工房ガレージハウス】
Copyright (C) 2006-2017 Shigehiro Kimura All Rights Reserved.