後編ではプログラミングをやっていきます。前編はこちら。
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=-1 | LVP(低電圧書き込み)は使わない |
PGC=7 | ラズパイのGPIO4番(GPCLK0)=7本目のピンをPICマイコンのCLOCKにつなぐ例 |
PGD=3 | ラズパイのGPIO2番(SDA)=3本目のピンをPICマイコンのDATAにつなぐ例 |
「VPP、PGC、PGD」の値は自分が作成したPICライターのピン番号に合わせて変更してください。
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が書かれているので忘れずにコピーしてください)。
各設定項目を簡単に説明しますと下記のようになります。
黄色のマーカー表示は上記の例で選択している値です。
設定名 | 値 | 説明 |
---|---|---|
FOSC | ECH | 外部クロックHigh-Powerモード使用 |
ECM | 外部クロックMedium-Powerモード使用 | |
ECL | 外部クロックLow-Powerモード使用 | |
INTOSC | 内部クロックを使用 | |
EXTRC | RC回路によるクロック入力 | |
HS | 水晶振動子High-speed | |
XT | 水晶振動子 | |
LP | 水晶振動子Low-power | |
WDTE | ON | ウォッチドッグタイマーを使う |
NSLEEP | スリープ時無効 | |
SWDTEN | レジスタ制御 | |
OFF | この機能を使わない | |
PWRTE | ON | 電源ONから64ms後にプログラムを開始する |
OFF | この機能を使わない | |
MCLRE | ON | LVP無効時、/MCLR信号ピンとして使う |
OFF | LVP無効時、デジタル入力(RA3)ピンとして使う | |
CP | ON | プログラムメモリー保護機能を使う |
OFF | この機能を使わない | |
CPD | ON | データメモリー保護機能を使う |
OFF | この機能を使わない | |
BOREN | ON | 電源電圧の降下を監視する |
NSLEEP | スリープ時無効 | |
SBODEN | レジスタ制御 | |
OFF | この機能を使わない | |
CLKOUTEN | ON | RA4ピンをCLKOUTピンとして使用する |
OFF | この機能を使わない | |
IESO | ON | 外部・内部クロックの切替えでの起動をする |
OFF | この機能を使わない | |
FCMEN | ON | 外部クロックの監視をする |
OFF | この機能を使わない | |
WRT | OFF | Flashメモリーの保護をしない |
BOOT | 000hから1FFhまでのメモリーを保護する | |
HALF | 000hから3FFhまでのメモリーを保護する | |
ALL | 000hから7FFhまでのメモリーを保護する | |
PLLEN | ON | 動作クロックを32MHzにする |
OFF | この機能を使わない | |
STVREN | ON | スタックがオーバフローやアンダーフローしたらリセットする |
OFF | この機能を使わない | |
BORV | LO | 電源電圧の降下監視の電圧設定(LOは1.8V) |
HI | 電源電圧の降下監視の電圧設定(HIは2.5V) | |
LVP | ON | 低電圧プログラミングモードを使う |
OFF | この機能を使わない | |
DEBUG | ON | インサーキット デバッガモードを使う |
OFF | この機能を使わない |
公式ページ
PIC12F1822 Documentation | Microchip Technology
上記ページで「Programming Specifications」を選択
日本語資料 | マイクロチップ・テクノロジー・ジャパン株式会社
内部クロック周波数の設定
今回は内部クロックを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ケーブルを小さく切った基板にはんだ付けしたものを作ってみました。
実際の動作は動画を再生してご覧ください。
回路図はこのようになります。
ブレッドボードに実装する場合は下図のようになります。
こちらの記事を参考にさせていただきました。
neuralassemblyのメモ: Raspberry PiのGPIOを用いてPICマイコンに書き込みをしてみた