MPLAB X IDE でコードを書いてPICに書き込む (覚え書き)

# MPLAB X IDE v5.25 とPICkit3 を使ってPIC16F84Aに書き込む手順の覚え書き
PIC16F84Aなんてかなり古いチップですが、書き込み手順を自分の覚書として残しておきます。
書き込むのはLEDチカチカです。芸がないな～。

##用意したもの
**ソフトウェア系**
- Windows10 Professional (64bit)がインストールされたPC
- MPLAB X IDE (v5.25)
- コンパイラ xc8 (v2.10)
**ハードウェア系**
- PICkit3
- PIC16F84A-10/P (16F88ではない)
- ブレッドボード
- 抵抗 10kΩ x2, 220Ω x1
- コンデンサ 22pF x1, 0.01uF x1
- ジャンパピン多数
- USBからの 5V給電装置 (ようするに USBから5Vもらってくるもの)



##LEDチカチカの回路
![schematic.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/513938/94fa64b0-a202-91d9-c3d1-14f03b75b805.png)

クロックはRC発振(10kΩ/22pF)の回路です。定数は適当です。マニュアルによれば、5kΩ以上1MΩ以下、20pF以上が推奨みたいなことが書かれています。

|FOSC|  |   |
|---|---|---|
|RCEXT|外部RC発振|周波数精度は低い|
|HS   |外部XTAL/セラロック発振|4MHz以上推奨|
|XT   |外部XTAL/セラロック発振|4MHz以下推奨|
|LP   |?|32.768KHz水晶の時らしい|

C1はいわゆるパスコンです。電源-グランド間のノイズ吸収のために入れるものです。なくても動くことがあります。
JP1はPICkit3と接続するコネクタです。
RA2ピンにLEDをぶら下げて点滅させます。電流制限用の抵抗220Ωを入れています。

**ブレッドボード**
ブレッドボード上の実装例: もうちょっとレイアウト考える余地あり。
![breadboard.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/513938/8383c37e-49bb-925c-a89a-1b33214f7df6.png)


##MPLAB X IDE上で新規プロジェクトを立ち上げる
**まずはMPLAB X IDEを起動**
![icon1.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/513938/59dd37f4-da7c-19de-99ae-c7e02125aea4.png)

**新規プロジェクトの設定**
File->New Project... で
![newpj0.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/513938/dc3bfe03-c8fe-51fc-b310-2dffc3cafa4e.png)

開いたダイアログで Standalone Projectを選択して [Next]
![newpj1.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/513938/078406ce-1861-38f0-9555-5c76a17be9df.png)

書き込むデバイス(チップ型番)を選択。PIC16F84ならば、Middle-range の中にあります。[Next]
![newpj2.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/513938/d2d9f7ee-f479-68bd-f30c-27bf5dd250ac.png)

Select Tool では PICkit3 を選択します。ほかの書き込みツールを場合はそれに応じて設定します。あとでも設定できます。
![newpj3.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/513938/b5114c9a-0669-f474-4610-a617eb4ecff9.png)

Select Compiler ではコンパイラを選びます。ここは　xc8 (v2.10) です。[Next]
![newpj4.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/513938/55b9eafc-3934-69d2-20c7-d0107f2a65c9.png)

最後に任意のProject Nameを設定します。EncodingはShift-JISを設定しておくのがいいでしょう。コメントで日本語入れたくなるでしょうし。そしたら [Finish]
![newpj5.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/513938/90429ef2-c4be-b064-ed8a-2920cfbba39a.png)

##ソースを書く##
まずは、Projectのツリーからsource Files->New->main.c ... を選んで main.c ファイルをproject folder に新規生成＆登録します。
![newpj6.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/513938/ca034332-d520-9324-9d57-ecbab51a6a61.png)

ファイル名は任意にできるようです。
![newpj7.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/513938/9b74ca9a-e1dd-c012-fdd6-438dbf79fdbe.png)

そうすると最初はこういうテンプレートになってます。（毎回名前を消すのが面倒になってきました...）
![newpj8.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/513938/51cc0ae5-f2cf-4c33-860e-b47b6627502a.png)

つぎにチップごとに違って覚えきれない Configuration BitsのPragma設定をします。もちろん、これにたよらず自分でpragma設定してもいいです。
メニューから Production -> Set Configuration Bits
![newpj9.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/513938/1c0ef0b5-0a0c-6fc5-618f-e020e77a7c1c.png)

ウィンドウの下のほうにConfiguration Bitsの新しいサブウィンドウが生成されます。チップによって設定できる項目が変わります。PIC16F84は非常に少なくてたった4項目。らくちんです。
![newpj10.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/513938/7fb75524-0bc7-f13e-e7a1-e9bc521d8197.png)
FOSCはクロックの供給回路のタイプを選びます。今回の回路では外部RCによる発振なのでEXTRCを選択します。
WDTEはをウォッチドッグタイマーを有効・無効にする設定です。デバッガを使うなら無効です。どっちでもいいです。
そのあと、[Generate Source Code to Output] を押してこの設定のコードを表示させます。
それをコピーして、main.c の先頭部分にペーストしてしまいましょう。
![newpj11.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/513938/dc56bce1-c069-57ad-b49a-8f5a2e800288.png)

main 関数内に動作コードを書いていきましょう。

```c:main.c
/* 
 * File:   main.c
 * Author: cvp-swat
 *
 * Created on 2019/10/14, 23:52
 */

// 'C' source line config statements

// CONFIG
#pragma config FOSC = EXTRC     // Oscillator Selection bits (RC oscillator)
#pragma config WDTE = OFF       // Watchdog Timer (WDT disabled)
#pragma config PWRTE = OFF      // Power-up Timer Enable bit (Power-up Timer is disabled)
#pragma config CP = OFF         // Code Protection bit (Code protection disabled)

// #pragma config statements should precede project file includes.
// Use project enums instead of #define for ON and OFF.

#include <xc.h>
#include <stdio.h>   // なくてもいいかも 
#include <stdlib.h>  // なくてもいいかも 

#define _XTAL_FREQ 2000000 // __delay_ms() を使う場合は設定が必要。

/*
 * 
 */
int main(int argc, char** argv) {
    TRISA = 0b00000000;  // PORTA は全部出力モードに設定
    TRISB = 0b00000000;  // PORTB は全部出力モードに設定
    while(1){            // 永久ループにする
        RA2 = 1;         // RA2ピンを HIGHにして
        __delay_ms(950); // 950待って
        RA2 = 0;         // RA2ピンを LOWにして
        __delay_ms(950); // 950待って
    }
    return (EXIT_SUCCESS);
}
```

##書き込み
PICkit3 をブレッドボードのコネクタに接続します。ピンの順番や電圧を間違えないようにしましょう。
![IMG_2211.JPG](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/513938/28a0107f-e84d-d5c8-21cd-97bb9d55f75b.jpeg)

POWER/ACTIVE/STATUS ランプも緑/青/緑に点灯しているのを確認してから、三角アイコンを押してコンパイル＆書き込みをします。
![newpj12.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/513938/224a2ebd-de14-c887-7b83-9e92a51f0e98.png)
PICkit3 を抜けば、チップは通常動作を始めます。


エラーがあれば赤字で表示されます。
![newpj13.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/513938/901ddd7d-7b60-05fe-c527-a61b735bb7b1.png)

Invalid Device IDの場合は PIC周辺の接続を確認しましょう。
また、PICkit3 の電力プロパティを調整することで解決する場合があります。
![newpj14.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/513938/fbd65989-46ad-bfee-e599-040f9006cb9c.png)


MCLRは書き込み中は11Vくらいまで上がるので注意。