鳥なき里のマイコン屋(171) MCC MelodyとMCC Classicどっち?

Joseph Halfmoon

PIC素人がMPLABのMCC使用にあたり「新しい方が良い」と短絡。以前の回では「新しい方」MCC Melogyを使用。しかし「古い方」MCC Classicが残っているのには立派な訳があることに気づきました。今回は、TIMERを使ってみるついでにMCC Classicを使ってみます。どっちもどっち?よくわからんが。

※「鳥なき里のマイコン屋」投稿順Indexはこちら

MCC (MPLAB Code Configurator)

MCCはMPLAB X IDEのプラグインです。メンドイ?初期化や設定、ライブラリやらドライバやらをGUIで設定し「よきにはからって」ソースを生成してくれるもの。これがあるおかげで久しぶりに8ビットPICに手を出す気になったツールであります。

手元の MPLAB X IDE v6.10 ではデフォルトでMCCが同梱されてました。特に追加のダウンロードすることなくプロジェクトを作るなり、開くなりすれば直ぐにMCCが使える状態です。MCCを起動すると「フレーバー」が3つあり、どれを開くか尋ねられます。

    • Melody
    • Classic
    • Harmony

最後のHarmonyは、MicroChip社の32ビットマイコン向けみたいなので、8ビットのPICマイコンの場合は、MelodyかClassicの2択ということになります。Melody_OR_Classic

 

MicroChip社のホームページなどつらつら眺めていると、今後はMelody推しみたいな感じが見受けられたので、前回まではわけも分からずMelodyを使ってみました。Melodyの売りとしては「依存関係を視覚化」「バージョン管理」みたいなことがうたわれていて「旧式」のClassicより今後はこっちゃ、という雰囲気かもしてます。ドキュメントが以下に。

MPLAB® Code Configurator (MCC) Melody

しかしね、今回「Melodyまだまだ」な点を見つけてしまいました。御覧じろ。MCC_LIB_summary

コンテンツ・マネージャで追加インストールできるライブラリです。上をみると、充実のClassicに対して、Melodyはまだ Not Supported なやつが多いデス。いまのところ上に列挙されておりますライブラリを使うところまで行きついてないのですが、これみるとClassicを選択する意義も大ありかと。

「そゆこと」で、今回はMCC Classic を選択してみました。別に上記のライブラリは使ってないのでどっちでもいいんだけれども。

MCC Classicでの設定

大きくMelodyとClassicで違うのは、Melodyで中央に表示される各ライブラリやドライバなどの依存関係を表す「カッコイイ」GUIが無いというところでしょうか。キホンやることはあまり変わらないので使い方が分からんということがないです。MCCの設定画面が以下に。MCC_Classic

左の方にリソース画面がまとまっているのでそこを使って設定するものを追加していきます。初期状態では、上のProject Resourceには、Interrupt、Pin、Systemと3モジュールしか含まれてません。こんな感じ。Resources

下のDevice Resourcesに、取り込める各種リソースがいろいろあるので、その中から、今回は以下の2つを追加します。追加は簡単、マウスでクリクリするだけ。

    • EUSART(以前もHello World回で使ったやつ。UARTとして使用)
    • TIMER0

するとProject Resource側にEUSARTとTMR0が現れます。何やら赤の×が強烈ですが、これは「不要になったとき」に押すボタンらしいです。ProjectResourceAdded

なお、Melody使ったときはEUSARTでなくUARTというリソースでしたが、Classicでは、ハードそのままEUSARTでした。どっちも同じハードを制御するのだけれども。

EUSARTの設定が以下に。EUSARTsetting

 

TMR0の設定が以下に。Timer0Setting

そして、Pin配を決定。こんな感じ。以前にやりましたが、手元のターゲットボードでは、PA1の先にLEDが、PC0の先にUSBシリアル側のRXが存在してます。PinSetting

Generateとしてソース書き込み

今回はTimer0をアクティブにしたので、LチカはTimerつかって割り込み駆動といたします。自動生成したTMR0_CallBackの中に以下を書き込みました。

void TMR0_CallBack(void)
{
    static int flag;
    if (flag == 0) {
        RA1 = 0;
        flag = 1;
    } else {
        RA1 = 1;
        flag = 0;       
    }
    if(TMR0_InterruptHandler)
    {
        TMR0_InterruptHandler();
    }
}

一方main側では、USBシリアル経由でprintfしてます。

void main(void)
{
    int counter = 0;
    SYSTEM_Initialize();
    INTERRUPT_GlobalInterruptEnable();
    INTERRUPT_PeripheralInterruptEnable();
    TMR0_StartTimer();
    while (1)
    {
        __delay_ms(1000);
        printf("Count: %d \n", counter++);
    }
}
Buildして実行

Buildしたらまさかのエラーが。こんな感じ。ErrorGetch

上記が意味するのは、MCC Classicが自動生成してくれた stdio用の char getch(void)と、XC8がもともと持っている int getch(void)が矛盾しているということみたい。心情的にはLinux的な int getch(void) の方を支持するものでありますが。とりあえず STDINは使ってないので、char getch(void)をコメントアウトしてやったらビルド通りました。なんでだろ~。MCC melogyのときはすんなりビルドできてたのに。

BuildOK

 

 

ともあれ、BUILD SUCCESSFULとなったので、実機に書き込みその動作を観察。LPDEMOBOARD

ちゃんとTIMER0割り込み駆動でLチカしてるみたいです。USBシリアル経由でSTDOUTへもprintf()できてるし。

鳥なき里のマイコン屋(170) デモボード搭載マイコン、PIC16F1829に交換 へ戻る

鳥なき里のマイコン屋(172) ルネサスMCU、Arduino UNO R4で吉例Lチカ へ進む