PICマイコンを始めよう


# 導入からLEDの点灯、点滅まで

本記事は、Maicrochip社のMPLAB® X Integrated Development Environment (IDE)、MPLAB® XC Compilersの導入、プラグインであるMPLAB® Code Configuratorの導入と使用方法についてまとめ、LEDの点滅までを目標とし、記事にした。

## PIC開発環境を整える

### 開発に必要なもの

- 今回のPIC開発に必要なもの
 - PC
 - PICマイコン(今回、pic16f18857を使用)
 - pickit3またはpickit4
 - 5V電源
 - LED
 - 抵抗器
 - ブレッドボード
 - ブレッドボード用配線
 
![DSC_0119.JPG](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/681321/a3d5cbb1-cc86-fe65-4ae6-83310eec855d.jpeg)

### MPLAB Xのインストール

下記のwebサイトより、microchip社開発環境であるMPLAB X IDEをダウンロードできる。

https://www.microchip.com/mplab/mplab-x-ide

サイトの下のほうに以下の「Downloads」から実行ファイルをダウンロードする。
![202009292101.PNG](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/681321/51675d4f-8f10-737b-be59-11a786d5f621.png)

ダウンロードしたら、実行する。
![202009292107.PNG](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/681321/a0d7cc3c-4ace-93a2-e831-bcd65bd49eaa.png)

規約を読み、承諾する。
![202009292108.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/681321/1c82701a-30fb-718c-618e-d1ab50abb7d8.png)

インストール場所を指定し、プロキシ設定を適宜変更する。
![202009292109.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/681321/62e0ca34-3971-0731-07ea-5b0d22da9f24.png)

そのまま、「Next」を行う。
![202009292110.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/681321/e22e3ce2-71d2-c684-8b9a-32c0ee7d7f28.png)

全て終了したら、開発環境の導入が完了する。ただし、コンパイラは別途導入する必要があるため、次章で導入する。
![202009292111.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/681321/abad5074-8401-e7b0-580f-94169675a98e.png)


### コンパイラのインストール

下記のwebサイトより、microchip社開発環境で実行できるコンパイラXC8をダウンロードできる

https://www.microchip.com/en-us/development-tools-tools-and-software/mplab-xc-compilerss 

![202009292102.PNG](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/681321/e8cc7335-2abb-4c85-ba41-181df35fa062.png)

ダウンロード完了したら、実行する。
![202009292112.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/681321/18200366-af7d-059e-bcfa-bd33ffd19a63.png)

規約を読み、実行する。
![202009292113.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/681321/0870d6ef-7a4b-9f26-e14e-d50c7f9da27d.png)

ライセンスタイプは無償を選択する。
![202009292114.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/681321/ad19dc80-4abf-ea0d-da56-8690e37e3a85.png)

インストールする場所を選択する。
![202009292115.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/681321/6884fda7-082a-0ec9-9dcb-42179ab97887.png)

コンパイラの設定をする。今回、環境パスに追加している。
![202009292116.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/681321/f6cf8132-8f8f-f068-4394-f6ad51fd7bd1.png)

「Next」を押し、コンパイラの導入を行う。
![202009292117.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/681321/6edc614a-cb35-ae2c-99a6-d2e789b859d2.png)

実行完了したら、コンパイラの導入が完了する。
![202009292118.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/681321/2c6aa2b9-d49b-58e3-66ae-1fe3e1e86945.png)

### MCC(MPLAB Code Configurator)の導入

MCC(MPLAB Code Configurator)とは、PICを起動した際の初期化をGUIを使ってMPLAB内で簡単に定義、ファイルの生成を行ってくれるツールである。 PICを動作するための最低限の設定やファイル生成を行い、PICの種類によってどのような機能が搭載されているかをグラフィカルにわかるため、簡単にPICの開発に取り組める。
MPLAB X IDE を実行する。
Tools -> Pluginsを開く。

![202009292120.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/681321/10991812-84c9-056c-9655-bca5e32e4c19.png)

「Available Plugins」のタブを選択し、MPLAB Code ConfiguratorのチェックボックスをONにする。
そして、株の「instal」を実行する。
![202009292121.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/681321/1fcff709-b8f8-8037-4748-677c56c6ccaa.png)

Plugin Installerが実行される。
![202009292122.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/681321/30831f09-ff6c-af4d-b1b7-d1978440649c.png)

インストールが完了し、MPLAB X IDE再起動を行うと導入が完了する。
![20200929213.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/681321/53891266-2b70-87fd-9a8b-35c2f7c99a50.png)


## ハードウェアの作成

下図のように配線する．

![202010142158.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/681321/ef898320-f5d7-2108-26b4-c3a67263e26b.png)

## プログラム作成

プロジェクトの作成から、メインプログラム作成までを行う。

### プロジェクトの作成

File -> New Projectを選択し、「New Project」ウィンドウを立ち上げる。
![202009292123.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/681321/3ca102f5-99f6-9653-3523-e55f63558083.png)

「standalone Project」を選択し、「Next」を押す。
![202009292124.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/681321/dcf65f6b-535d-db5d-5b90-b62dbba7025f.png)

デバイスの選択を行う。
![202009292125.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/681321/75361ce5-02d6-78db-b855-db7bc1c216fb.png)

ツールの選択をする。
![202009292126.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/681321/bdeb8dc0-d274-8c95-08ea-9b722fbee150.png)

先ほどインストールした、コンパイラの選択を行う。
![202009292127.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/681321/56063170-7f0f-6bf3-bfd3-95fd76567966.png)

プロジェクトネームと場所を決め、「Finish」を選択し完了。
![202009292128.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/681321/b03c07f6-f05f-4adc-647e-bf9e6222fd13.png)


### MCCによるファイルの生成

MCCのプラグインがインストールしてあると、ツールバーに「MCC」と書かれたボタンが現れる。
MCCボタンをクリックする。(プロジェクトで初めてMCCを起動すると、mccファイルの保存を訊かれるため、保存をする。)
![202009292129.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/681321/522d3df2-a839-1559-15f8-241b5dc7acd0.png)

下のような画面となる。

![202009292130.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/681321/b42ba253-d1e9-62c4-f946-726abd24e14e.png)

クロック速度とオシレータの選択を行う。
今回のマイコン(16F18857)は、内蔵オシレータを搭載しており、32MHzで動作させることができる。

![202009292131.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/681321/ae3dedee-351f-c050-0909-1b7890239f40.png)

画面下部の「Pin Module」の「GPIO」をoutputと設定する。
次に、画面中央の「Pin Module」というタブを開き、「Custom Name」を変更し名前を付ける。

![202009292132.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/681321/cc061bdc-d25a-76df-a83a-fcbcfe55aad5.png)

そして、「Available Resource」を選択し、「TMR1」を追加する。(＋ボタンを選択する。)

![202009292133.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/681321/1a99be84-66a0-a386-c8b1-23248dce5fee.png)

画面左部の「tree view」に、TMR1が追加され、クリックすると画面中央部の設定画面が表示される。
「clock source」と「timer period」、「Enable Timer Interrupt」を画面のように設定する。
最後に、画面左部の「Generate」を押すと、ファイルが生成される。

![202009292134.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/681321/e6869853-a56c-4568-16ca-d99bab382408.png)

### mainプログラムの変更

~~~c

/**
  Generated Main Source File

  Company:
    Microchip Technology Inc.

  File Name:
    main.c

  Summary:
    This is the main file generated using PIC10 / PIC12 / PIC16 / PIC18 MCUs

  Description:
    This header file provides implementations for driver APIs for all modules selected in the GUI.
    Generation Information :
        Product Revision  :  PIC10 / PIC12 / PIC16 / PIC18 MCUs - 1.81.6
        Device            :  PIC16LF18857
        Driver Version    :  2.00
*/

/*
    (c) 2018 Microchip Technology Inc. and its subsidiaries. 
    
    Subject to your compliance with these terms, you may use Microchip software and any 
    derivatives exclusively with Microchip products. It is your responsibility to comply with third party 
    license terms applicable to your use of third party software (including open source software) that 
    may accompany Microchip software.
    
    THIS SOFTWARE IS SUPPLIED BY MICROCHIP "AS IS". NO WARRANTIES, WHETHER 
    EXPRESS, IMPLIED OR STATUTORY, APPLY TO THIS SOFTWARE, INCLUDING ANY 
    IMPLIED WARRANTIES OF NON-INFRINGEMENT, MERCHANTABILITY, AND FITNESS 
    FOR A PARTICULAR PURPOSE.
    
    IN NO EVENT WILL MICROCHIP BE LIABLE FOR ANY INDIRECT, SPECIAL, PUNITIVE, 
    INCIDENTAL OR CONSEQUENTIAL LOSS, DAMAGE, COST OR EXPENSE OF ANY KIND 
    WHATSOEVER RELATED TO THE SOFTWARE, HOWEVER CAUSED, EVEN IF MICROCHIP 
    HAS BEEN ADVISED OF THE POSSIBILITY OR THE DAMAGES ARE FORESEEABLE. TO 
    THE FULLEST EXTENT ALLOWED BY LAW, MICROCHIP'S TOTAL LIABILITY ON ALL 
    CLAIMS IN ANY WAY RELATED TO THIS SOFTWARE WILL NOT EXCEED THE AMOUNT 
    OF FEES, IF ANY, THAT YOU HAVE PAID DIRECTLY TO MICROCHIP FOR THIS 
    SOFTWARE.
*/

#include "mcc_generated_files/mcc.h"

void TMR1_interrupt(void);    //変更箇所

/*
                         Main application
 */
void main(void)
{
    // initialize the device
    SYSTEM_Initialize();

    // When using interrupts, you need to set the Global and Peripheral Interrupt Enable bits
    // Use the following macros to:

    // Enable the Global Interrupts
    INTERRUPT_GlobalInterruptEnable();    //変更箇所

    // Enable the Peripheral Interrupts
    INTERRUPT_PeripheralInterruptEnable();    //変更箇所

    // Disable the Global Interrupts
    //INTERRUPT_GlobalInterruptDisable();

    // Disable the Peripheral Interrupts
    //INTERRUPT_PeripheralInterruptDisable();

    TMR1_SetInterruptHandler(TMR1_interrupt);    //変更箇所
    
    
    while (1)
    {
        // Add your application code
    }
}

void TMR1_interrupt(void){    //変更箇所
                              //変更箇所
    LED_01_Toggle();          //変更箇所
                              //変更箇所
}                             //変更箇所

/**
 End of File
*/

~~~

### プロパティ変更

プロジェクトを右クリックしてプロパティを開く．

![202010142204.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/681321/7eb5221b-bf7e-f9f2-dfd7-87940ca75aa8.png)

Powerをクリックする．

![202010142205.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/681321/fb918a74-08e5-c0f0-4d71-5c920def473e.png)

PowerをPicKitから胸腔するため，チェックボックスをオンにする．

![202010142206.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/681321/f23d7927-6de0-ab45-25ed-681c12a96edc.png)


### 書き込み
写真のように配線し，書き込みを行う．

![202010142158.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/681321/ef898320-f5d7-2108-26b4-c3a67263e26b.png)

![202010142207.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/681321/567acfd2-ec3c-d2ae-263a-d2f4aaad543b.png)


### 動作
![20200930_224223.gif](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/681321/0ed03f8c-8ef0-e833-efcc-76d498e82759.gif)

## プログラムについて

プログラムについてザックリとした解説を行います。

### main文

main文内では、MCCにより自動生成された関数`SYSTEM_Initialize()`による初期化、ハンドラーの設定、割り込み処理の許可を行っています。
`INTERRUPT_GlobalInterruptEnable()`、`INTERRUPT_PeripheralInterruptEnable()`は、自動生成時にコメントアウトされているので注意。
つぎに、Timer1のカウントスタート`TMR1_StartTimer()`を行っています。
そして、メインループです。
メインループでは何もしません。

~~~C
/*
                         Main application
 */
void main(void) {
    // initialize the device
    SYSTEM_Initialize();

    // When using interrupts, you need to set the Global and Peripheral Interrupt Enable bits
    // Use the following macros to:

    TMR1_SetInterruptHandler(timer1_Interrupt);
    TMR3_SetInterruptHandler(timer3_Interrupt);

    // Enable the Global Interrupts
    INTERRUPT_GlobalInterruptEnable();

    // Enable the Peripheral Interrupts
    INTERRUPT_PeripheralInterruptEnable();

    // Disable the Global Interrupts
    // INTERRUPT_GlobalInterruptDisable();

    // Disable the Peripheral Interrupts
    //INTERRUPT_PeripheralInterruptDisable();

    TMR1_SetInterruptHandler(TMR1_interrupt);
    
    
    while (1)
    {
        // Add your application code
    }
}
~~~


### 割り込み処理について

TMR1によって、一秒おきに`LED_01_Toggle()`が呼び出されます。
設定したピンのHigh,Lowが反転し、LEDが点滅します。

~~~C
void TMR1_interrupt(void){

    LED_01_Toggle();
    
}
~~~
### 動作フロー