PIC Code ConfiguratorでLチカ

投稿日 2014/06/21

microchipの開発環境 MPLAB X IDEのプラグインCode Configuratorを使ってみました。

 

PICでのプログラム開発で一番悩ましいのは、クロック設定や周辺デバイスなどの細かい設定を行うためデータシートとにらめっこしなければならない点です。

 

いろいろプログラムを作っていると、デバイスモデルごと(例えば12F, 16F 18F, 24F 30F dsPIC33など)で、だいたい流用できる部分も多いのですが、それでも最終的にはデータ・シートで確認することになります。

 

そこでさっそく飛び付いたのがこのCode Configuratorです。

 

Code ConfiguratorはMPLAB X IDEのいくつかあるプラグインの中のひとつです。

 

現在の環境条件とサポートデバイスは以下のようになっています。

 

サポートデバイスはPICの数多いデバイスファミリの中のごく一部です。

 

12F, 16FはいわゆるF1と呼ばれるxxF1xxxモデルですが、その中によく使う8ピンPIC 12F1822があるので、今回はこれでタイマーによるLチカ・プログラムをCode Configuratorを使って作ってみました。

 

microchip Code Configuratorから抜粋

System requirements

  • MPLAB X: v2.10

  •       (microchipのダウンロードサイトでV1.8になっているが、中身はv2.10)

  • XC8: v1.31

  • XC16: v1.21


Supported devices:

  • PIC12(L)F1501

  • PIC12(L)F1822  <- 今回使用

  • PIC12(L)F1840

  • PIC16(L)F1503

  • PIC16(L)F1507

  • PIC16(L)F1508

  • PIC16(L)F1509

  • PIC16(L)F1512

  • PIC16(L)F1513

  • PIC16(L)F1516

  • PIC16(L)F1517

  • PIC16(L)F1518

  • PIC16(L)F1519

  • PIC16(L)F1526

  • PIC16(L)F1527

  • PIC16(L)F1704

  • PIC16(L)F1708

  • PIC16(L)F1713

  • PIC16(L)F1716

  • PIC16(L)F1782

  • PIC16(L)F1783

  • PIC16(L)F1784

  • PIC16(L)F1786

  • PIC16(L)F1787

  • PIC16(L)F1788

  • PIC16(L)F1789

  • PIC16(L)F1823

  • PIC16(L)F1824

  • PIC16(L)F1825

  • PIC16(L)F1826

  • PIC16(L)F1827

  • PIC16(L)F1828

  • PIC16(L)F1829

  • PIC16(L)F1847

  • PIC16(L)F1933

  • PIC16(L)F1934

  • PIC16(L)F1936

  • PIC16(L)F1937

  • PIC16(L)F1938

  • PIC16(L)F1939

  • PIC16(L)F1946

  • PIC16(L)F1947

  • PIC18(L)F23K22

  • PIC18(L)F24K22

  • PIC18(L)F25K22

  • PIC18(L)F26K22

  • PIC18(L)F43K22

  • PIC18(L)F44K22

  • PIC18(L)F45K22

  • PIC18(L)F46K22

  • PIC18F23K20

  • PIC18F24K20

  • PIC18F25K20

  • PIC18F26K20

  • PIC18F43K20

  • PIC18F44K20

  • PIC18F45K20

  • PIC18F46K20

  • PIC24F08KM101

  • PIC24F08KM102

  • PIC24F08KM202

  • PIC24F08KM204

  • PIC24F16KM102

  • PIC24F16KM104

  • PIC24F16KM202

  • PIC24F16KM204

  • PIC24FJ128GA306

  • PIC24FJ128GA308

  • PIC24FJ128GA310

  • PIC24FJ64GA306

  • PIC24FJ64GA308

  • PIC24FJ64GA310

  • PIC24FV08KM101

  • PIC24FV08KM102

  • PIC24FV08KM202

  • PIC24FV08KM204

  • PIC24FV16KM102

  • PIC24FV16KM104

  • PIC24FV16KM202

  • PIC24FV16KM204

 

準備

 

MPLABX IDE(v2.10以降)を起動します。

 

新しいプロジェクトを作ります。今回はデバイスに12F1822を選びました。

 

Source Filesに空のmain.cを作っておきます。mian.cがまだ無い場合は、Code Configuratorが自動的に作ってくれます。

 

Code Configuratorプラグインをインストールするため、ToolsメニューにあるPluginを開きます。

 

Available Pluginsタブを開きCode Configuratorにチェックを入れて、Installボタンを押してインストールします。

 

インストールが終わると、Installedタブのインストール済プラグインのリストの中にCode Configuratorが現れます。

 

実行

Code Configuratorの起動は、Toolsメニュー、Embedded、Code Configuratorと順にクリックします。

 

12F1822の周辺デバイス(ADC, Timerなど)がDevice Resourceに表示されるので、使用するデバイスを開き、中のモジュール名をダブルクリックします。

 

例えばTimerの中のTMR0:Timerをダブルクリックします。

 

TMR0:Timerが、Project Resourceに表示され、Device resourceからは消えます。

 

Project Resourceに表示されたTMR0:Timerをクリックすると、Code Configuratorのパラメータ設定画面が表示されます。

 

Lチカのための設定

ソースコードの手入力最小限でやってみました。

time0の割り込みサービルルーチンに1行追加するだけです。

 

タイマー0の割り込みを500mS毎に発生させ、GPIO RA0を500mS毎にLow/HighをトグルさせてつないだLEDを点滅させます。

 

必要なデバイスは、

System

  クロックの設定 FOSCを125KHにするため125KHz_MFを選択

    125KHz_MFは源発振に内部500KHzオシレータをそのまま使用し

    分周して125KHzにする

    125KHz_HFにすると内部500KHzオシレータをPLLで16MHzにしてから

    分周して125KHzにする。

  CONGIF1とCONFIG2はデフォルトのまま

 

Interrupt Manager

  割り込み優先順位のオーダーを設定できるが、割り込みはTimer0しかない

  のでOrder = 1のまま

 

TMR0:Timer

  プリスケーラ1:128 Reload Value 0x86(134) Clock sourceはInternal

     これでPeriodが約500mSになります。

    1 / 125KHz x 4 x 128 x (256 - 134) = 499.7mS

  Enable Timer Interruptにチャックを入れます

 

GPIO

  RA0を出力にして初期値0(LOW)にする

 

以上の設定を行ってGenerate Codeボタンをクリックしてソースコードを生成します。

PIC_Code_Configurator1.jpg

写真1: Generate Codeを行った状態

 

生成されるコード

Generate Codeを行うと、main.c(main.cが無い場合)の他、MCC Generated Filesフォルダの下に、interrupt_manager.c、mcc.c pin_manager.c、timer0.cが生成されます。

 

以下緑色の部分はすべてCode Configuratorが自動的に生成したコード。

ヘッダファイル(xxxx.h)も自動生成されますが、省略。

一部コメント等は取り除いています。

 

main.cの中にSYSTEM_Initialize();が挿入されています。

INTERRUPT_GlobalInterruptEnable();とINTERRUPT_PeripheralInterruptEnable();は、今回割り込みを使うためコメントを外しました。

 

#include "mcc_generated_files/mcc.h"

 

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();

 

    while (1)
    {
        // Add your application code
    }
}

 

 

interrupt_manager.cの中は、以下のようになっています。

Timer0の割り込みハンドラです。TMR0_ISR()にユーザ処理を書きます。

TMR0_ISR()はtimer0.cの中にあります。

 

#include "interrupt_manager.h"
#include "mcc.h"

void interrupt INTERRUPT_InterruptManager (void)
{
   // interrupt handler
    if(INTCONbits.TMR0IE == 1 && INTCONbits.TMR0IF == 1)
    {
        TMR0_ISR();
    }
    else
    {
        //Unhandled Interrupt
    }
}

 

mcc.cの中は以下のようになっています。

CONFIG1, CONFIG2の設定と関数OSCILLATOR_Initialize()、SYSTEM_Initialize()の定義を行っています。


//CONFIG1

#pragma config IESO = ON

#pragma config BOREN = ON

#pragma config PWRTE = OFF

#pragma config FOSC = INTOSC 

#pragma config FCMEN = ON 

#pragma config MCLRE = ON 

#pragma config CP = OFF

#pragma config CPD = OFF

#pragma config WDTE = OFF

#pragma config CLKOUTEN = OFF

 

// CONFIG2
#pragma config WRT = OFF

#pragma config LVP = OFF

#pragma config STVREN = ON

#pragma config PLLEN = ON

#pragma config BORV = LO

 

#include "mcc.h"

void SYSTEM_Initialize(void)
{
    OSCILLATOR_Initialize();
    PIN_MANAGER_Initialize();
    TMR0_Initialize();
}


void OSCILLATOR_Initialize(void)
{
    // SPLLEN disabled; SCS FOSC; IRCF 125KHz_MF; 
    OSCCON = 0x28;
    // OSTS intosc; HFIOFR disabled; HFIOFS not0.5percent_acc; PLLR disabled;

    //T1OSCR disabled; MFIOFR disabled; HFIOFL not2percent_acc; LFIOFR disabled; 
    OSCSTAT = 0x00;
    // TUN 0x0; 
    OSCTUNE = 0x00;
    // Set the secondary oscillator
}

 

pin_manager.cの中は以下のようになっています。

RA0のみを出力にし、初期値0(LOW)にしています。

 

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

void PIN_MANAGER_Initialize(void)
{
    LATA = 0x00;
    TRISA = 0x3E;
    ANSELA = 0x16;
    WPUA = 0x00;

    OPTION_REGbits.nWPUEN = 0x01;

    APFCON = 0x00;
}

 

timer0.cの中は以下のようになっています。

TMR0_ISR()がtimer0の割り込みサービスルーチンです。

// add your TMR0 interrupt custom codeの下にユーザ処理を書きます。

今回はRA0をトグルするだけですので、LATAbits.LATA0 = !LATAbits.LATA0;の1行を追加しています。手操作でのソースコードの追加/変更はこれだけです。


void TMR0_Initialize(void)
{
    // Set TMR0 to the options selected in the User Interface

    // PSA assigned; PS 1:128; TMRSE Increment_hi_lo; mask the nWPUEN and INTEDG bits
    OPTION_REG = (OPTION_REG & 0xC0) | 0xD6 & 0x3F;

    // TMR0 134; 
    TMR0 = 0x86;

    // Load the TMR value to reload variable
    timer0ReloadVal= 134;

    // Clear Interrupt flag before enabling the interrupt
    INTCONbits.TMR0IF = 0;

    // Enabling TMR0 interrupt
    INTCONbits.TMR0IE = 1;
}


uint8_t TMR0_ReadTimer(void)
{
    uint8_t readVal;

    readVal = TMR0;

    return readVal;
}

void TMR0_WriteTimer(uint8_t timerVal)
{
    // Write to the Timer0 register
    TMR0 = timerVal;
}

void TMR0_Reload(void)
{
    // Write to the Timer0 register
    TMR0 = timer0ReloadVal;
}

void TMR0_ISR(void)
{

    // clear the TMR0 interrupt flag
    INTCONbits.TMR0IF = 0;

    TMR0 += timer0ReloadVal;


    // add your TMR0 interrupt custom code
    LATAbits.LATA0 = !LATAbits.LATA0;

}

 

コンパイルと実行

 XC8でコンパイルします。

 

今回書き込みはpickit3で行いました。

 

書き込み後、すぐに実行しLEDが点滅します。

PIC_Code_Configurator2.jpg

写真2: Lチカを実行

 

以上のようにCode Configuratorを使うと、データシートとにらめっこすることなく、簡単にコードが生成できます。ただし、当然ながらPICのシステム・クロックの構成、周辺デバイスの動作原理などの知識は必要ですので、データシートとおさらばすることはできませんね。

 

 まだ詳しくは見ていませんが、12F1822では以下のDevice Resourceがあるので、今後プログラムを書くときは利用したいと思います。

 

System 今回使用

GPIO 今回使用

ADC

Clock Reference

Comparator

DAC

DSM

Enhanced PWM

Input Capture

Output Capture

EUSART Asynchronuous(NRZ)

ESUART Synchronous(SYNC)

FVR

MSSP I2C Master Interrupt

MSSP I2C Slave Interrupt

MSSP SPI Master

MSSP SPI Slave

Memory

SRLatch

Timer0 今回使用

Timer1

Timer2

Interrupt Manager 今回使用

 

 

 

 

 

(JF1VRR)