
投稿日 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ボタンをクリックしてソースコードを生成します。

写真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が点滅します。

写真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)