MPLAB® Code Configurator(GPIO編)

今回はMCCを使って前回と同じくLEDを点滅させるプログラムを書いて行きます。先ずはMCCのインストールから

MCCのインストール

MCCのインストールは下記の順で行います。

  1. 先ずはIDEを上げて下さい。プロジェクトが既にロードされていたらクローズしての空の状態にして下さい。
  2. メニューから Tools ー> Plugins をクリックします。
  3. この画面が表示されたら Available Plugins のタグをクリック。MPLAB® Code Configurator をチェックして左下の Install ボタンをクリック
  4. この画面はそのままクリック
  5. 同意するにチェックをいれて Install ボタンを押すとインストールが開始します。
  6. インストールが完了するとこの画面が表示されます。Restart Nowにチェックが入ったまま Finishボタンを押して終了です。

これで、IDEが再起動されます。再び立ち上がったところでMCCの実行です。

  1. 再びIDEが立ち上がった所で
  2. メニューバーから Tools -> Embedded -> MPLAB Code Configurator を選びます。
  3. するとこの様なメッセージが表示されました。プロジェクトが無いとMCCは起動しないようです。
  4. 前回を参照に、PIC24FJ64GA002用のプロジェクトを作成して下さい。プロジェクトネームは、”test_01”と指定して下さい。ここではプロジェクトのみの作成です。中身の空のプロジェクトを作成します。
  5. その後”8”の要領でMCCを実行すると、この画面が表示されます。矢印のボタンを押して先に進みます。
  6. 矢印の Finish ボタンを押して下さい。これで設定完了です。

少し待つと、MCCの画面が表示されます。

これを使ってGPIOポートRB15を出力設定にして行きます。

  1. 左上にある ”Pin Module” をクリック。画面がこの様に変わります。画面の下に錠のマークの付いた表が有ります。これが現在のGPIOの状態を示しています。
  2. 今回はGPIOのRB15をデジタル出力に設定します。鍵マークに付いた表で縦がPort Bの15、横がGPIO output の欄の鍵をクリックします。そうすると鍵がロックされたアイコンに変わり、上の欄にRB15が追加されます。この欄のOutputにチェックが入っていることを確認下さい。なければチェックして下さい。
  3. 次に左側のProject Resourseに有るGenerateボタンを押すと現在の設定でコードが作成されます。作成状況が中央の画面に表示さます。最後にGenaration complete と表示されれば終了です。
  4. ファイルは、プロジェクトのSource Files ホルダーに作成されていました。Source Files ホルダーの直下に、”main.c” ファイルと “MCC Generated Files” フォルダーが作られいました。
  • main.cの中身を見てみると、SYSTEM_Initialize();という関数を読んでいるだけです。
  • SYSTEM_Initialize();はsystem.cにかかれていました。ここでは下記の3つが呼ばれています。
    • PIN_MANAGER_Initialize();
    • INTERRUPT_Initialize();
    • CLOCK_Initialize();
  • 次に、pin_manager.cを開いてみると、ここでGPIOの設定を行っている事が分かりました。

pin_manager.cを詳しく見ると、下記の様になっています。

pin_manager.c

#include <xc.h>
#include <stdio.h>
#include "pin_manager.h"

/**
 Section: Driver Interface Function Definitions
*/
void PIN_MANAGER_Initialize (void)
{
    /****************************************************************************
     * Setting the Output Latch SFR(s)
     ***************************************************************************/
    LATA = 0x0000;
    LATB = 0x0000;

    /****************************************************************************
     * Setting the GPIO Direction SFR(s)
     ***************************************************************************/
    TRISA = 0x0017;
    TRISB = 0x7FFF;

    /****************************************************************************
     * Setting the Weak Pull Up and Weak Pull Down SFR(s)
     ***************************************************************************/
    CNPU1 = 0x0000;
    CNPU2 = 0x0000;

    /****************************************************************************
     * Setting the Open Drain SFR(s)
     ***************************************************************************/
    ODCA = 0x0000;
    ODCB = 0x0000;

    /****************************************************************************
     * Setting the Analog/Digital Configuration SFR(s)
     ***************************************************************************/
    AD1PCFG = 0x020C;
}

これを元に各レジスタについて、MCCが作成したコードと前回のコード、PICリセット時の値を比べて見ました。

レジスタMCC前回リセット時
 LATA 0x0000 設定無し  0x0000 
 LATB 0x0000  設定無し 0x0000 
 TRISA 0x0017 設定無し  0x079F
 TRISB 0x7FFF 0x0000  0xFFFF 
 CNPU1 0x0000 設定無し  0x0000 
 CNPU2 0x0000 設定無し  0x0000 
 ODCA 0x0000 設定無し  0x0000 
 ODCB 0x0000 設定無し  0x0000 
 AD1PCFG  0x020C 0xFFFF 0x0000
  • LATA,LATB,CNPU1,CNPU2,ODCA,ODCBに関してはMCCで設定した値とリセット時の値が同じ。
  • TRISAに関しては、前回はGPIOのAポートを使用していなかったので設定を省略
  • TRISB:これはBポートの入出力を設定するレジスタ。”0”で出力。”1”で入力です。RB15はこのレジスタの15ビット(最上位)で、そのビットを、”0”にすると出力になります。つまり、MCCはRB15のみを、前回のコードはポートB全てのビットを出力に変更した事になります。
  • AD1PCFG:これはポートをアナログかデジタルとして使用するか設定するレジスタです。”0”ならアナログ。”1”ならデジタルとなります。RB15は9ビット目で設定されます。MCCの 0x020C の ”2”がそのビットに当たります。前回のコードは全てをデジタルに設定しています。ちなみにMCCの最後の ”C” ですが、これはPGED,Cに当たります。PICへの書き込み等PICkit3と通信用に使用しているポートです。そこもデジタルい設定している様です。

この様にMCCはユーザーの指定が有ればその値にレジスタをセットしますが、指定がなければデフォルト値に(PICリセット後の値)にセットします。他のファイルも見ましたが同様でした。

コーディング

さすがに、LEDを点滅させるプログラムは書いてもらえないのでその部分はユーザーのコーディングとなります。

main.c

#include "mcc_generated_files/system.h"

void wait_00(void)
{
    int a,b;

    b = 10;
        while(b --)
        {
            a = 0xffff;
            while( a --) ;
        }
}

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

    while (1)
    {
        LATB = 0xFFFF;
        wait_00();
        LATB = 0x0000;
        wait_00();
    }

    return 1;
}

wait_00() 関数の追加と main()関数の中に有る while(1)ループにLEDのオンオフ機能を追加したのみです。これをコンパイルして実行して下さい。前回と同様にLEDが点滅します。

書き込みのコメントを見ていたら

前回のコードと今回のコードをPICに焼いていたら下記の違いが有ることが分かりました。

output

The following memory area(s) will be programmed:
program memory: start address = 0x0, end address = 0x5ff
configuration memory
Programming/Verify complete

The following memory area(s) will be programmed:
program memory: start address = 0x0, end address = 0x3ff
Programming/Verify complete

上記は書き込み時のメッセージの最後の部分です。1から4行がMCCの場合。 6から8行が前回の場合です。

  • 2と7行の比較:
    • 前回の方がサイズ的に小さい。ー> 余計な(?)設定が無いので当然か
  • 3行目の configuration memory のコメントが前回の場合は表示されない。
    • 前回は、コンフィグを設定していませんでした。
    • つまりコンフィグの書き込みは行われず出荷時の値となっています。
    • 今回は問題が起きませんでしたが、この部分は毎回設定した方が良い部分です。
    • 前回のプログラムにコンフィグ設定を追加したらMCCと同じく configuration memory を表示しました。

次回は

今回の様に簡単なプログラムではMCCの便利さをよく理解出来ませんでした(むしろコードが大きくなってしまった)。TIMERの使用や割り込み等、設定する項目の多い機能には威力を発揮ものと思います。そこで、次回はTIMER割り込みのプラグラムをMCCを用いて書いてみたいと思います。