">
FlatIsleロゴ

Flat Isle 日誌

Raspberry Pi でPICライター作成(後編)

2022-07-08

後編ではプログラミングをやっていきます。前編はこちら

pickleをインストール

PICマイコンへの書き込みソフト「pickle」をラズパイにインストールします。

sudo su
wget "http://wiki.kewl.org/downloads/pickle-5.01.tgz"
tar zxf pickle-5.01.tgz
cd pickle
make linux
make linux-install

pickleの設定ファイルを作成します。

mkdir /home/ユーザー名/.pickle
nano /home/ユーザー名/.pickle/config

設定ファイルの中身は下記のようにしました。

DEVICE=RPI
SLEEP=1
BITRULES=0x1000
VPP=15
PGM=-1
PGC=7
PGD=3

以下は設定内容の説明です。

DEVICE=RPIラズパイzero~1は RPI、ラズパイ2~3は RPI2、ラズパイ4は RPI4 を指定
SLEEP=1ラズパイのGPIO用の設定
BITRULES=0x1000ラズパイのGPIO用の設定
VPP=15ラズパイのGPIO22番=15本目のピンをPICマイコンのVPP/MCLRピンにつなぐ例
PGM=-1LVP(低電圧書き込み)は使わない
PGC=7ラズパイのGPIO4番(GPCLK0)=7本目のピンをPICマイコンのCLOCKにつなぐ例
PGD=3ラズパイのGPIO2番(SDA)=3本目のピンをPICマイコンのDATAにつなぐ例

「VPP、PGC、PGD」の値は自分が作成したPICライターのピン番号に合わせて変更してください。
GPIO番号とピン番号を混同して書き間違えることは多々ありますドンマイ。
ラズパイのGPIO図解
画像引用元:Raspberry Pi GPIO 公式ページ

IDEをインストール

PICマイコンを動かすプログラムを書くための統合開発環境(IDE)が必要です。
別のパソコンにMPLAB X IDEをインストールします。
公式ページからダウンロードできます。

今回使うPICマイコンには専用のコンパイラが必要なので、それもインストールします。
公式ページの 「View Downloads」-「Compiler Downloads」をクリックし、一覧から「MPLAB XC8 Compiler」を選んでダウンロードしてください。

プログラムを書く

MPLAB X IDEを使って、PICマイコンを動かすプログラムを書きます。
今回の例では PIC12F1822 を用いて、LEDを光らせるコード(世間一般では「Lチカ」と言われていますが、ここでは「Lペカー🤩」と名付けましょう)を作成していきます。
PIC12F1822 の5番ピン(RA2)を使って出力することにします。

プロジェクトの新規作成

メニューバーの「File」-「New Project」で新規プロジェクトを作成します。
カテゴリーは「Microchip Embedded」、プロジェクトは「Standalone Project」のままで次へ。
この例では PIC12F1822 を使いますので、ファミリーは「Mid-Range 8-bit MCUs (PIC10/12/16/MCP)」を選び、デバイスに「PIC12F1822」を選びます。ツールは「No Tool」のままで次へ。
「Supported Debug Header」は「None」のままで次へ。
「Compiler Toolchains」から「XC8(v.2.31)」を選び、次へ。
「Project Name」にプロジェクト名を入力し、「Project Location」で保存先を指定します。一番下の「Encoding」を忘れずに「Shift_JIS」にしておきます(コメントの文字化け防止)。
「Finish」をクリックするとプロジェクトフォルダが作成されます。

ファイルの新規作成

画面左側にあるプロジェクトウィンドウの「Source Files」を右クリックし、「New」-「C Main File…」を選んでファイルを作成します。
ファイル名を入力し、「Finish」をクリックするとファイルが作成され、開かれます。

「Source Files」のツリー下に、作成したファイル名が表示されていればOKです。

この状態になっていないと、ビルドする時に「プロジェクト内にファイルが無い」旨のエラーが出ます。これを解決するには「Source Files」を右クリックし、「Add Existing Item…」を選び、プロジェクトに含めたいファイルを選択します。

コンフィギュレーションビットの設定

PICマイコンの動作を細かく決めるコンフィギュレーションビットを設定する必要があります。
メニューバーの「Production」-「Set Configuration Bits」を選ぶと、画面下部に「Configuration Bits」が表示されます。

ここで「Option」の値を必要に応じて変更し、「Generate Source Code to Output」をクリックします。

すると、下図のように「Output – Config Bits Source」が表示されますので、この内容をコピーしてソースコードに貼り付けます(最終行にincludeが書かれているので忘れずにコピーしてください)。

各設定項目を簡単に説明しますと下記のようになります。
黄色のマーカー表示は上記の例で選択している値です。

設定名説明
FOSCECH外部クロックHigh-Powerモード使用
ECM外部クロックMedium-Powerモード使用
ECL外部クロックLow-Powerモード使用
INTOSC内部クロックを使用
EXTRCRC回路によるクロック入力
HS水晶振動子High-speed
XT水晶振動子
LP水晶振動子Low-power
WDTEONウォッチドッグタイマーを使う
NSLEEPスリープ時無効
SWDTENレジスタ制御
OFFこの機能を使わない
PWRTEON電源ONから64ms後にプログラムを開始する
OFFこの機能を使わない
MCLREONLVP無効時、/MCLR信号ピンとして使う
OFFLVP無効時、デジタル入力(RA3)ピンとして使う
CPONプログラムメモリー保護機能を使う
OFFこの機能を使わない
CPDONデータメモリー保護機能を使う
OFFこの機能を使わない
BORENON電源電圧の降下を監視する
NSLEEPスリープ時無効
SBODENレジスタ制御
OFFこの機能を使わない
CLKOUTENONRA4ピンをCLKOUTピンとして使用する
OFFこの機能を使わない
IESOON外部・内部クロックの切替えでの起動をする
OFFこの機能を使わない
FCMENON外部クロックの監視をする
OFFこの機能を使わない
WRTOFFFlashメモリーの保護をしない
BOOT000hから1FFhまでのメモリーを保護する
HALF000hから3FFhまでのメモリーを保護する
ALL000hから7FFhまでのメモリーを保護する
PLLENON動作クロックを32MHzにする
OFFこの機能を使わない
STVRENONスタックがオーバフローやアンダーフローしたらリセットする
OFFこの機能を使わない
BORVLO電源電圧の降下監視の電圧設定(LOは1.8V)
HI電源電圧の降下監視の電圧設定(HIは2.5V)
LVPON低電圧プログラミングモードを使う
OFFこの機能を使わない
DEBUGONインサーキット デバッガモードを使う
OFFこの機能を使わない

内部クロック周波数の設定

今回は内部クロックを16MHz(本PICマイコンの最速)で動作するように設定していきます。
プログラムの最初に、以下のコードを入力します。

void main()
{
    // 内部クロックは16MHzとする
    OSCCONbits.SPLLEN = 0;        // PLLEN=ON | PLLEN=OFF & SPLLEN=1 4xPLL有効 SPLLEN=0 4xPLL無効
	OSCCONbits.IRCF   = 0x0F;     // 0x0F:16MHz 0x0E:8MHz(4xPLL時32MHz) 0x0D:4MHz
	OSCCONbits.SCS    = 0x02;     // 0x02:内部オシレータ 01:Timer1 00:ConfigurationWord1のFOSCで指定
    // 内部クロックでTIMER0を使用、プリスケーラ比 1:256
	OPTION_REGbits.nWPUEN = 0;    // 内部プルアップ 0:有効 1:無効
	OPTION_REGbits.INTEDG = 0;    // RB0/INT ピン割り込みエッジ 0:立ち下がり 1:立ち上がり 
	OPTION_REGbits.TMR0CS = 0;    // Timer0 のクロック源 0:内部命令サイクルクロック(FOSC/4) 1:RA4/T0CKIピン
	OPTION_REGbits.TMR0SE = 0;    // Timer0 ソースT0CKI ピンのエッジ 0:LowからHigh 1:HighからLow
	OPTION_REGbits.PSA    = 0;    // プリスケーラを Timer0 モジュールに 0:割り当てる 1:割り当てない
	OPTION_REGbits.PS     = 7;    // プリスケーラ比 1: 0:2 1:4 2:8 3:16 4:32 5:64 6:128 7:256
}

またプログラム内でdelay関数を使えるように、内部クロック周波数の定義に上記クロック(16MHz)を記述しておきます。

#define _XTAL_FREQ      16000000

各I/Oピンの設定

PICマイコンの各ピン(ICの足)の動作を、「ANSELA」、「TRISA」、「PORTA」の各変数で設定していきます。各変数の意味は、マニュアル (PIC12(L)F1822 / PIC16(L)F1823 データ シート)P126~P127を参照ください。
今回すべてデジタル出力とするため、以下のように設定します。

    ANSELA = 0b00000000 ;     // アナログは使用しない(すべてデジタルI/Oに割当てる)
    TRISA  = 0b00001000 ;     // ピンは全て出力に割当てる(RA3は入力専用)
    PORTA  = 0b00000000 ;     // 出力ピンの初期化(全てLOWにする)

出力処理

1秒毎にLEDが点灯・消灯を繰り返すようにしました。出力先は5番ピン(RA2)にしています。

    while(1) {
        //1秒毎にLEDをON/OFFする処理
        __delay_ms(1000);
        RA2 = 0;            // 5番ピンにLOWを出力する(LED OFF)
        __delay_ms(1000);
        RA2 = 1;            // 5番ピンにHIGHを出力する(LED ON)
    }

ビルドする

書いたプログラムをビルドしてHEXファイルを作ります。
ツールバーにある「Build Main Project」ボタンか、F11キーを押してビルドします。

画面下部に「BUILD SUCCESSFUL」と表示され、下の行に「Loading code from …」で、出力されたHEXファイルのパスが表示されていればOKです。

PICに書き込む

ラズパイがPICマイコンを認識できるか確認します。
今回使う12F1822の場合は下記のp14コマンドで、PICの情報が表示されればOKです。

p14 id
#低電圧プログラミングモードの場合 p14 lvp id

pickleの設定ファイルで指定した各ピン(VPP、PGC、PGD)への出力テストをしたい時は、下記のptestコマンドを使います。Low→High→Lowが出力されます。数字は秒数です。

ptest VPP 5

PICマイコンへの書き込みコマンドは下記の通り。

p14 program /ディレクトリ/ファイル名.hex

ちゃんと書き込みできたか検証するコマンドは下記の通り。「Fail: 0」と表示されればOKです。

p14 verify /ディレクトリ/ファイル名.hex

ちなみに、PICに書き込まれているプログラムを消すコマンドは下記の通りです。

p14 blank

マウントを使ってWindowsの共有フォルダをラズパイから参照できるようにすると、パソコンとラズパイ間でのHEXファイルのやり取りが楽になります。

sudo mkdir /mnt/win
sudo mount -t cifs -o username=ユーザー名,password=パスワード //IPアドレス/共有フォルダのパス /mnt/win

ちなみにアンマウントは下記の方法でできます。

sudo umount /mnt/win
sudo rmdir /mnt/win

ラズパイを起動するたびにマウントし直す必要があるので、下記の方法で自動化しておくと便利です。

sudo mkdir /mnt/win
sudo nano /etc/fstab
//IPアドレス/共有フォルダのパス /mnt/win cifs username=ユーザー名,password=パスワード 0 0
sudo reboot

動作の確認

PICマイコンに書き込んだプログラムがちゃんと動くか確かめます。
動作確認用に、LEDと抵抗、PICマイコンを挿すソケット、電源用のUSBケーブルを小さく切った基板にはんだ付けしたものを作ってみました。
実際の動作は動画を再生してご覧ください。

回路図はこのようになります。

POW1 +5V IC1 PIC12F1822 VDD VSS RA2 1 2 3 4 5 6 7 8 R1 150Ω LED1

ブレッドボードに実装する場合は下図のようになります。