2017年12月24日日曜日

Ubuntuに開発環境を作り、PIC16F1829でLチカする方法


背景

PIC16F1829とはMicrochip社が提供している、PICマイコンと呼ばれる組み込み機器向けのプロセッサの一つです。
Arduino IDEとの勝手の違いに戸惑ったので、備忘録としてメモを残します。

全体像

  1. 使ったもの
  2. 開発ツールをインストール
  3. プロジェクトを作成
  4. 空のプログラムをビルド
  5. Lチカプログラムを作成
  6. 配線
  7. 書き込み
  8. まとめ
  9. 参考

使ったもの

  • PCUbuntu17.10 64bitをインストールしています
  • PIC16F1829
    LチカさせるPICマイコンです。
  • PICkit3
    PICマイコンにプログラムを書き込む装置です。
  • ブレッドボード
    PICマイコンから信号線を引き出すためのベースにしました。
  • ジャンパワイヤ
    信号線の引き回しに利用しました。
  • LED
    信号線の動作確認に利用しました。
  • 1kΩ抵抗
    LEDへの電力量調整に使いました。
  • 10kΩ抵抗
    信号線のプルアップに使いました。
  • 電源(Arduino または 電池ケース + 単3電池2本 など)
    PICkit3から供給される電力は弱いため、PIC16F1829を動かすには別途電源が必要です。
    PIC16F1829は1.8Vから5.5Vで動作するので、Arduinoや電池から電力を供給します。

開発ツールをインストール

microchipが提供している開発環境をインストールします。
こちらのページ(linuxにMPLAB-Xをセットアップ)を参考にしました。

関連ライブラリをインストール

依存関係の説明ページに従い、MPLABを実行するために必要なライブラリをインストールします。
sudo apt-get install libc6:i386 libx11-6:i386 libxext6:i386 libstdc++6:i386 libexpat1:i386

依存を満たさず次の手順で紹介するMPLABXのインストーラを実行すると、このようなエラーが出ます。
64 Bit, check libraries
Check for 32 Bit libraries
These 32 bit libraries were not found and are needed for MPLAB X to run:
libc.so
libdl.so
libgcc_s.so
libm.so
libpthread.so
librt.so
libstdc++.so
libexpat.so
libX11.so
libXext.so

For more information visit http://microchip.wikidot.com/install:mplabx-lin64

MPLAB

MPLABとは、PICマイコン向けのクロスコンパイル機能が付いた開発プログラムです。
下記のmicrochipのページからMPLABXをダウンロードします。

MPLAB® X Integrated Development Environment (IDE)

この記事を書いたときはv4.05でした。
(v5.20でも同様の操作でプログラムを書けることを確認しました。)


ダウンロードしたインストーラを展開・実行して、インストールを行います。
cd ~/Downloads
tar -xf MPLABX-v4.05-linux-installer.tar
sudo ./MPLABX-v4.05-linux-installer.sh

操作画面が表示されます。


デフォルト値でインストールしました。

コンパイラ

MPLABのクロスコンパイルに必要なコンパイラは別途インストールする必要があります。
PIC16F1829はxc8系のコンパイラが動くので、下記のページでxc8系のコンパイラのインストーラをダウンロードします。

MPLAB® XC Compilers

この記事を書いたときはv1.45でした。
(v2.05でもLチカ出来ることを確認しました。)


ファイルを実行可能な権限に変更して実行することで、インストーラを起動します。
cd ~/Downloads
chmod a+x xc8-v1.45-full-install-linux-installer.run
sudo ./xc8-v1.45-full-install-linux-installer.run

操作画面が表示されます。


デフォルト値でインストールしました。

プロジェクトを作成

インストーラによってOSのアプリケーションとして登録されているので、mplab ideとかで検索してIDEを起動します。


File -> New Projectでプロジェクトを新規作成します。

Stand Alone プロジェクトを選択して、Nextをクリックします。


Deviceに、利用するPICマイコンの型番(今回はPIC16F1829)を入力して、Nextをクリックします。


Debug Headerはなしで良いと製品ページに書かれているので、NoneのままでNextをクリックします。


今回はライターにPICkit3を使うので、PICkit3を選択してNextをクリックします。


ダウンロードしたXC8のコンパイラを選択してNextをクリックします。


上記のコンパイラ選択でmpasmの方をを選択すると、下記のエラーが出てビルドに失敗します。
これはmpasmで指定するコンパイラがアセンブラ用のコンパイラなので、cをビルドできないために発生するエラーだと推測しています。
原因は定かではないですが、mpasmではエラーになるので、xc8のコンパイラを選択してください。
make[2]: *** 'dist/default/production/___.X.production.hex' に必要なターゲット 'build/default/production/main.o' を make するルールがありません.  中止.
make -f nbproject/Makefile-default.mk SUBPROJECTS= .build-conf
make[1]: *** [.build-conf] エラー 2
make[1]: ディレクトリ '/home/asuki/MPLABXProjects/www.X' に入ります
make: *** [.build-impl] エラー 2
make  -f nbproject/Makefile-default.mk dist/default/production/___.X.production.hex
make[2]: ディレクトリ '/home/asuki/MPLABXProjects/www.X' に入ります
make[2]: ディレクトリ '/home/asuki/MPLABXProjects/www.X' から出ます
nbproject/Makefile-default.mk:90: ターゲット '.build-conf' のレシピで失敗しました
make[1]: ディレクトリ '/home/asuki/MPLABXProjects/www.X' から出ます
nbproject/Makefile-impl.mk:39: ターゲット '.build-impl' のレシピで失敗しました

BUILD FAILED (exit value 2, total time: 61ms)

プロジェクト名は「test_blink」にしました。
「Set as main project」が有効になっていると、他のプロジェクトがビルドしにくくなるので、チェックを外しました。
Finishを押すとプロジェクトが作られます。


「test_blink」というプロジェクトができました。


「Set as mainpProject」のチェックを有効にした場合は、main projectになっているプロジェクトが太字で表示されます。


main projectが設定されていると、複数のプロジェクトを開いているときにmain以外のプロジェクトをビルドしようとしてもmainがビルドされて都合が悪いときがあります。
そんなときは、プロジェクトで右クリックをしてmain projectの設定を変えると良いです。

main projectになっているプロジェクトを右クリックすると、選択肢に「Unset main project」があるので、それを選ぶとmain projectではなくなります。


main projectではないプロジェクトを右クリックすると、選択肢に「Set as main project」とあるので、それを選ぶとmain projectになります。


空のプログラムをビルド

先ほど作った「test_blink」プロジェクトは、ソースコードが無いのでまだコンパイルできません。
Lチカプログラムを記述するのにも必要なので、プログラムファイルを追加します。

Source Filesで右クリックして、New -> main.c を選択します。


ファイル名をmainとして、Finishをクリックします。


main.cファイルができました。


この状態になるとビルドできるはずなので、トンカチマークをクリックしてビルドしてみます。


IDE下部のOutputエリアにBUILD SUCCESSFULと表示されれば、ビルド成功です。


ビルドに失敗する場合は、下記の点に注意して、もう一度プロジェクトを作り直すのが良さそうです。
(GUI操作で設定変更もできますが、プロジェクトを作り直すのが手っ取り早いと思います。)
  • PICマイコンの型番は合っているか
  • コンパイラは別途ダウンロードしたxc系のものを選択しているか

Lチカプログラムを作成

先ほど作成した「main.c」を下記のように変更します。
main.c
#define _XTAL_FREQ 500000
#include <xc.h>
#pragma config FOSC=INTOSC, WDTE=OFF, PWRTE=OFF, MCLRE=OFF, CP=OFF, CPD=OFF, BOREN=ON, CLKOUTEN=OFF, IESO=OFF, FCMEN=OFF
#pragma config WRT=OFF, PLLEN=OFF, STVREN=OFF, LVP=OFF

void main(void) {
    TRISB = 0x00;
    LATB = 0x00;
    while(1) {
        LATBbits.LATB7 = 1;
        __delay_ms(500);
        LATBbits.LATB7 = 0;
        __delay_ms(1000);
    }
}

記述内容を説明します。

PIC16F1829のデータシートの5.2.2.5 Internal Oscillator Frequency Selectionによると、デフォルトの周波数は500kHzとなっているということなので、「__delay_ms」を使うための「_XTAL_FREQ」に500000(500k)を設定しています。
#define _XTAL_FREQ 500000

これによって、__delay_msが使えるようになります。
__delay_ms(500);

PIC16F1829用の設定です。
PIC16F1829の製品ページのDocuments -> Code Examples にあるサンプルコードの値を利用しました。
以前はこれが無くても動いたと思うのですが、cx8系のコンパイラがv2になったためか、この設定が無いとGPIOから信号が出なくなっていました。
#pragma config FOSC=INTOSC, WDTE=OFF, PWRTE=OFF, MCLRE=OFF, CP=OFF, CPD=OFF, BOREN=ON, CLKOUTEN=OFF, IESO=OFF, FCMEN=OFF
#pragma config WRT=OFF, PLLEN=OFF, STVREN=OFF, LVP=OFF

LEDの信号線としてポートBの7番ピンを使っています。
LATBbits.LATB7 = 0;

ポートBを出力として使うために、「TRISB」を0にしています。
TRISB = 0x00;

ポートBの出力をLOWにするため、「PORTB」を0にしています。
LATB = 0x00;

RB7から0.5秒信号を出力、1秒出力停止を繰り返します。
while(1) {
    LATBbits.LATB7 = 1;
    __delay_ms(500);
    LATBbits.LATB7 = 0;
    __delay_ms(1000);
}

Lチカプログラムができました。



配線

プログラムの書き込みとRB7でLチカ出来るように配線します。

PICkitの配線は下記マニュアルの「STANDARD CONNECTION」を参考にしました。
PICkit3 User's Guide

PICKit3 のピンの役割はこうなっています。
番号 名前 役割
1 MCLR リセット(Master Clear with Internal pull-up)
2 Vdd 電源電圧測定
3 GND グラウンド
4 ICSPDAT ICSP通信のデータ
5 ICSPCLK ICSP通信のクロック
6 LVP 低電圧での書き込みできるか確認
(Low voltage programming)
PIC16F1829はLVPのピンが出てないようなので、今回は使いません。

このように接続しました。


Pro Microを電源として使う場合は、これで動きます。


電池を電源として使う場合は、これで動きます。


PIC周辺は、こんな感じです。


書き込み

PICkit3をPCに接続し、矢印したボタンを押すと、ビルドと書き込みを行えます。


初回書き込み時は警告が出るので、OKをクリックします。


PIC16F1829への電力供給が不足しているとと下記のようなエラーが出ます。
Target device was not found (could not detect target voltage VDD). You must connect to a target device to use PICkit 3.
この場合は電源が期待通りに動いていることを確認してください。

書き込みが成功すれば0.5秒光る、1秒消えるを繰り返します。


まとめ

PICマイコンでLチカできました。
勝手が分からなかったためにコンパイラやライターの設定が間違っていて時間を取られましたが、Lチカまでできれば、やりたいことの試行錯誤に移れます。

何かの参考になれば嬉しいです。

これの続編として、ArduinoとのI2C通信にも成功しました。
興味があればこちらもご覧ください。
PIC16F1829をI2Cスレーブとして動かし、Arduinoからの信号でLチカする方法

参考

PICKIT3を使ってみよう
PICkit3 Programmer/Debugger User’s Guide
PIC16F/LF1825/1829 Data Sheet

変更履歴

2019.07.04
マイコンに依存する設定がないとGPIOから信号が出なくなっていたので、設定を追記しました。
現時点で最新バージョンのMPLABX(v5.20)とxc8コンパイラ(v2.05)で動作を確認しました。
GPIOの出力操作にPORTBを利用していましたが、マイコンサンプルコードに合わせてLATBを利用する形式に変更しました。
2019.07.12
main projectの切替方法を追加しました。
2020.08.01
MPLABXインストール時前に関連ライブラリをインストールする手順を追加しました。

0 件のコメント :