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択ということになります。
MicroChip社のホームページなどつらつら眺めていると、今後はMelody推しみたいな感じが見受けられたので、前回まではわけも分からずMelodyを使ってみました。Melodyの売りとしては「依存関係を視覚化」「バージョン管理」みたいなことがうたわれていて「旧式」のClassicより今後はこっちゃ、という雰囲気かもしてます。ドキュメントが以下に。
MPLAB® Code Configurator (MCC) Melody
しかしね、今回「Melodyまだまだ」な点を見つけてしまいました。御覧じろ。
コンテンツ・マネージャで追加インストールできるライブラリです。上をみると、充実のClassicに対して、Melodyはまだ Not Supported なやつが多いデス。いまのところ上に列挙されておりますライブラリを使うところまで行きついてないのですが、これみるとClassicを選択する意義も大ありかと。
「そゆこと」で、今回はMCC Classic を選択してみました。別に上記のライブラリは使ってないのでどっちでもいいんだけれども。
MCC Classicでの設定
大きくMelodyとClassicで違うのは、Melodyで中央に表示される各ライブラリやドライバなどの依存関係を表す「カッコイイ」GUIが無いというところでしょうか。キホンやることはあまり変わらないので使い方が分からんということがないです。MCCの設定画面が以下に。
左の方にリソース画面がまとまっているのでそこを使って設定するものを追加していきます。初期状態では、上のProject Resourceには、Interrupt、Pin、Systemと3モジュールしか含まれてません。こんな感じ。
下のDevice Resourcesに、取り込める各種リソースがいろいろあるので、その中から、今回は以下の2つを追加します。追加は簡単、マウスでクリクリするだけ。
-
- EUSART(以前もHello World回で使ったやつ。UARTとして使用)
- TIMER0
するとProject Resource側にEUSARTとTMR0が現れます。何やら赤の×が強烈ですが、これは「不要になったとき」に押すボタンらしいです。
なお、Melody使ったときはEUSARTでなくUARTというリソースでしたが、Classicでは、ハードそのままEUSARTでした。どっちも同じハードを制御するのだけれども。
そして、Pin配を決定。こんな感じ。以前にやりましたが、手元のターゲットボードでは、PA1の先にLEDが、PC0の先にUSBシリアル側のRXが存在してます。
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して実行
上記が意味するのは、MCC Classicが自動生成してくれた stdio用の char getch(void)と、XC8がもともと持っている int getch(void)が矛盾しているということみたい。心情的にはLinux的な int getch(void) の方を支持するものでありますが。とりあえず STDINは使ってないので、char getch(void)をコメントアウトしてやったらビルド通りました。なんでだろ~。MCC melogyのときはすんなりビルドできてたのに。
ともあれ、BUILD SUCCESSFULとなったので、実機に書き込みその動作を観察。
ちゃんとTIMER0割り込み駆動でLチカしてるみたいです。USBシリアル経由でSTDOUTへもprintf()できてるし。