こんにちは、ENGかぴです。
PICマイコンに書き込まれたソースコードは読み込むことができるため開発者以外の第3者でも読み込むことができます。PICマイコンのプロテクト機能を使うとプロジェクトファイルを持たない第3者からのソースコード抜き取りが防止できます。
PICマイコンのソースコードをプロテクトの効果についてまとめています。PIC16F1827で動作確認したことについてリンクをまとめています。
PICマイコン(PIC16F1827)で実現できる機能と解説リンクまとめ
PIC16F1827のソースをプロテクト
PIC16F1827の設定はMCCを使っています。MCCの使い方については下記記事にまとめています。
MPLAB Code Configurator(MCC)の追加と使い方
今回はMCCを使用してSystem Module・EUSART・TMR0の設定を行っています。動作確認のソースコードは下記記事のものを流用しています。
EUSARTはプロテクトしたProgram memory Code内のデータを読み出して表示するために使用しています。
System Moduleの設定
最初に共通事項であるSystem Moduleの設定を行います。MPLAB X IDEを起動しMCCのアイコンをクリックしてMCCを有効にします。

内部クロックを使用するためINTOSCを選択しています。クロック周波数は任意でもよいですが4MHz_HFを選択しています。クロックを高速にするほど消費電流が増えてしまいます。
WDTのモードが4種類ありますがWDTの動作を常にONしたいためWDT_enabledを選択しています。WDT_enabledを選択するとSWDTENビットの設定は無効になります。

ソースコードのプロテクトはCONFIG1レジスタで行います。CPに「Program memory Code protection is enabled」を選択するとソースコードのプロテクトができるようになります。
CPDはEEPROMのデータのプロテクトする場合は「Data memory code protection is enabled」を選択します。
PR:わからないを放置せず、あなたにあった最低限のスキルを身に着けるコツを教える テックジム 「書けるが先で、理解が後」を体験しよう!
EUSARTの設定
PICマイコンのシリアル通信はEUSARTと表現されています。シリアル通信はMSSPの設定によりSPI通信やI2C通信も実現することができます。EUSARTはDevice Resources内のPeripherals欄のEUSARTを選択して追加します。

EUSARTを非同期で使用するためにModeでasynchronousを選択しEnable Transmit及びEnable Receiveにチェックを入れます。Baud Rateは19200bpsとしていますが任意でも構いません。
送信や受信時に割り込みを使用してデータの格納を行う方が確実なデータ取得がしやすいためEnable EUSART Interruptsをチェックし割り込みを使用しています。
データの取得が遅れたりするとオーバーランが発生することがあるため可能な限り受信時にレジスタからデータを獲得しておくことが推奨されます。
パリティを使用しないためTransmission Bits及びReception Bitsを8ビット構成にしています。
Software Settings欄にはTransmit Buffer SizeやReceive Buffer Sizeで割り込み時にデータを一時保存しておくバッファのサイズを選択できますがサイズを大きくするとデータ容量が増えてしまい使用できるRAMサイズを圧迫するため少なめの値にしておく方が良いでしょう。
TMR0を設定する
TMR0はDevice Resources内のPeripherals欄のTimerを選択しTMR0をクリックして追加します。

Timer Clock内でクロックに関する設定を行います。Clock Sourceは内部クロックを使用しているためFOSC(FOSC/4)を指定します。PrescalerはClock Sourceに対してTMR0のカウントアップする分周比を指定します。
Timer PeriodはTMR0がオーバーフローするタイミングを設定します。1ms毎にオーバーフロー割り込みが発生しますがCallback Function Rateを0x0A(10)を指定しているため10ms毎にコールバック関数が呼び出されます。
void mainTimer(void); //タイマー0割り込みのコールバック関数
//コールバック関数の使用例
TMR0_SetInterruptHandler(mainTimer); //コールバック関数を指定
上記例ではmainTimer()が10ms毎にコールされます。
PR:RUNTEQ(ランテック )- マイベスト3年連続1位を獲得した実績を持つWebエンジニア養成プログラミングスクール
プロテクトの動作を確認する
プロテクトの効果についてプロテクトしなかった場合とプロテクトした場合の結果を比較して動作確認を行います。またプロテクトしたProgram memory Codeのアドレスを参照して読み込むことでユーザーのソースコード内ではプロテクトされずに読み込めることを確認します。
プロテクトの効果の確認
プロテクトの効果について確認します。MPLAB X IDEを使って「Make and Program Device」でソフトを書き込みますが、プロテクトを行う場合と行わない場合の2通りのソフトを書き込んで「Read Device Memory」でProgram memory Codeを読み込みます。

プロテクトなしの場合はProgram memory Codeが読み出されています。定数で宣言したバージョン情報がAddress:0x392から「PIC16F1827-RES Ver1.00」で格納されていることが分かります。ASCIIで確認するとPICマイコンのOpcodeを含めて表示されるため0x34(文字で4)が入っていますが4を抜いて見ると文字列が確認できます。

プロテクトを使用すると「Read Device Memory」で読み出しても値がすべて0になっており内容を確認することができなくなります。プロジェクトファイルを持たない第3者からソースコードを抜き取られることはありません。
ユーザーのソースコード内では参照ができることを確認
プロテクトはプロジェクトファイル以外からProgram momory Code領域を読み出した時プロテクトして内容を分からなくするものです。ユーザーのソースコード内ではプロテクトされずに値を参照できます。
バージョン情報を文字列として定数定義するとProgram memory Code領域に格納されます。PIC16F1827のソースコードでProgram memory Code領域のアドレスを参照して電文を生成します。

SW1を押すとArudino UNOから電文を送出し受信したPIC16F1827はProgram memory Code領域の文字列を読み込んでArudinoに返信します。
SW2は電文がバージョン情報を要求する電文以外を受信するとNGを返信します。(SW2はプロテクトとは関係ありませんが動作確認のため実装しています。)ピンの設定は以下の通りです。

ユーザーのソースコード内での読み出しになるためプロテクトされずにArduinoのシリアルモニタに文字が表示されるのを確認しました。

SW1を押すとシリアルモニタに「PIC16F1827-ROM Ver1.00」が表示されています。SW2を押すとバージョン確認の電文ではないため「NG」を表示しています。
ソースコード全体
ソースコードは記事作成時点において動作確認できていますが、使用しているライブラリの更新により動作が保証できなくなる可能性があります。また、ソースコードを使用したことによって生じた不利益などの一切の責任を負いかねます。参考資料としてお使いください。
リンクからZIPファイル形式のファイルをダウンロードし、任意の場所に展開していただくとテキストファイルが生成されます。
main.cをコピーすると使用できます。pic16f1827-protect.txtはArduinoのソースコードです。拡張子をtxtからinoに変更するかコピーすると使用できます。
本ソースコードはMPLAB X IDEにMCCのプラグインをインストールしていることが前提となります。MCCをインストールする方法は下記記事を参考にしてください。
MPLAB Code Configurator(MCC)の追加と使い方
Arduino UNOのソースコード:
関連リンク
PICマイコンを使ってマイコンのレジスタの設定やMPLAB X IDEのプラグインであるMCCを使用して動作確認したことについてまとめています。
PICマイコン(PIC12F675)で実現できる機能と解説リンクまとめ
PICマイコン(PIC16F1827)で実現できる機能と解説リンクまとめ
最後まで、読んでいただきありがとうございました。
PICマイコンを使った製品を開発する場合は基本的にソースコードが抜き取られないようにプロテクトしておくことを意識しておくとよいと思います。