回答:
はい、できます。私はこれを何度もやってきました。
ただし、個別のEEPROMの使用に関連するいくつかの欠点があります。
多くのPIC18には、最大1KのサイズのEEPROMメモリがあります。残念ながら、あなたが参照するPIC18F46J50はそうではありません。EEPROMが利用可能な場合、EEPROMの消去/書き込みサイクルは最低1,000,000で、フラッシュはわずか10,000であるため、データに十分な大きさの場合は、はるかに優れた選択肢です。
PIC18は、他のほとんどのマイクロコントローラーと同様に、ハーバードアーキテクチャと呼ばれるアーキテクチャを使用します。つまり、プログラムとデータ用に物理的に別々のアドレス可能な領域があります(つまり、プログラムアドレス4とデータアドレス4はあり得、それらは同じではありません)。したがって、Cまたはアセンブリ言語の通常の方法を使用してフラッシュメモリを読み書きすることはできません。
代わりに、PIC18ファミリでは、TBLPTRと呼ばれる22ビットレジスタに開始アドレスを設定します。フラッシュからバイトを読み取るには、TBLRD命令を使用します。読み取り後にアドレスを自動的にインクリメントまたはデクリメントするオプションがあり、手動で行う必要はありません。
フラッシュメモリに書き込むには、上書きするフラッシュメモリの1つ以上の64バイトブロックを最初に消去する必要があります。TBLPTRに開始アドレスを再度設定し、他のいくつかのレジスタに値を設定して消去操作を初期化した後、割り込みが無効になり、0x55の直後に0xAAをレジスタに書き込む必要があります。これは消去コマンドのロックを解除し、誤ったコードが誤ってメモリを消去するのを防ぐために必要です。最後に、実際に消去を行うコマンドが実行され、続いて割り込みが再度有効になります。
フラッシュメモリへの書き込みは、ブロックサイズが小さいことを除いて、消去と同様です。書き込みは実際にはTBLWT命令を使用して実行されます。これにより、TBLRD命令と同様に自動インクリメント/デクリメントも可能になります。
構成データを保存することに加えて、フラッシュメモリへの書き込みにより、いわゆる「無線によるファームウェア」を使用して現場でファームウェアを更新することができます。Bluetoothモジュール、Wi-Fi、セルラーモジュール、または有線接続からアップデートを受信し、フラッシュを特定のポイントより上にアップデートできる、通常はプログラムメモリの最初にあるファームウェアの固定ブロックが必要です。新しいコードを含むプログラム(「フェンス」など)。更新が完了すると、リセットが開始され、新しいコードが使用されます。
PICファミリ以外の多くのマイクロコントローラには、フラッシュメモリを更新する機能があります。ほとんどの場合、構成レジスタ、アドレスポインタ、および特別な命令を組み合わせて使用して、タスクを実行します。