2017年12月24日日曜日

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


背景

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

全体像

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

使ったもの

  • PC
    ubuntu17.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

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

MPLAB® X Integrated Development Environment (IDE)

自分が見たときはv4.05でした。


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

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


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

コンパイラ

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

MPLAB® XC Compilers

自分が見たときはv1.45でした。


ファイルを実行可能な権限に変更して実行することで、インストーラを起動します。
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」というプロジェクトができました。


空のプログラムをビルド

先ほど作った「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>

void main(void) {
    TRISB = 0x00;
    PORTB = 0x00;
    while(1) {
        PORTBbits.RB7 = 1;
        __delay_ms(500);
        PORTBbits.RB7 = 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);

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

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

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

0.5秒光らせて1秒休むを繰り返しています。
while(1) {
    PORTBbits.RB7 = 1;
    __delay_ms(500);
    PORTBbits.RB7 = 0;
    __delay_ms(1000);
}

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

0 件のコメント :

コメントを投稿