この記事は、MCCの mTouch module を使い、Curiosityボード上の mTouchボタンをどのような手順で有効にするのか示します。
1 MPLAB X プロジェクトの作成
この例では、[New Project...] から、" Curiosity_mTouch " という名称のプロジェクトを作成します。プロジェクトを作成するだけで、main.c ファイルは作成しないでください。main.c ファイルは後ほどMCCが自動作成します。
新規プロジェクトの作成方法は「CuriosityのMPLABプロジェクトを作成する」に詳しい手順説明があります。
- Device: PIC16F1619
- MPLAB X; v5.40
- MPLAB XC8; v2.2o
- MCC; v3.95.0
2 MPLAB X IDE で MCC を起動
もし、下図のような MCC アイコンが表示されていない場合には、MCC プラグインがインストールされていいるか確認してください。MCC のインストールは、「MPLAB Code Configurator インストール」 に説明があります。
3 システムクロックの設定
8MHz_HF Internal Clock を選択し、PLL を有効にします。この結果 32MHz system clock になります。、Low-Programming Enable がチェックされていることも確認してください。
mTouch の動作を確実に行うには、8 MHz system clock が必要です。8MHz より遅いシステムクロックを選ぶと notification window に警告が表示されます。
4 mTouch Module のロード
Device Resources ウインド内の Libraries list にある mTouch icon をダブルクリックします。
モジュールがロードされると mTouch icon が、Project Resources に現れます。
5 mTouch sensor の指定
mTouch module がロードされると、Pin Manager に、利用できる mTouch sensor pin が表示されます。
pin RC1 を mTouch sensor に指定します。このピンは Curiosity ボードの mTouch Button に接続されています。
6 mTouch button の追加
Buttons タブを選び、Create New Button をクリックします。
[Add] ボタンが現れるのでクリックします。
[Button0 : Sencor_AN5] が Button タブの下に現れます。念のため [Button0 : Sencor_AN5]をクリックして Sensor欄に、[ Sensor_AN5 : RC1 / AN5 ] が選ばれているのを確認します。
7 Timer Interrupt の有効化
PIC16F1619 の mTouch では、software CVD を使用するため、Automatic Frequency Adaptation (AFA) を起動し CVD 定期スキャンを有効にするため、Timer からの割り込み処理が必要です。mTouch library v2.00 以降は、AFA を有効にすると自動で割り込みも有効に設定されるため、このステップは行う必要はありません。
これより古い version では、Interrupt Module を開き、関連タイマーの割り込みを手動で有効にします。この例では TMR2 が AFA タイマーに設定されています。
もし、関連タイマーの割り込みが有効にされていない場合には、Notification ウインドーに警告が表示されます。この記事は、mTouch library v2.70 で作成したので自動で割り込みが設定され、警告もありません。
8 LED接続する I/O pin の設定
LED D7 を mTouch ボタンの表示に指定します。
Pin Manager で、LED D7 が接続されている RC5 pin を出力にします。
Pin Module でピンの名称を LED_D7 に書き換えます。
9 Code 生成
Generate button をクリックします。
10 mTouch 処理ルーチンを main.c から呼ぶ
自動生成された main.c ファイルを開き、global および peripheral 割り込みを有効にするために2つのマクロのコメントを外します。
INTERRUPT_GlobalInterruptEnable()
INTERRUPT_PeripheralInterruptEnable()
さらに
MTOUCH_Service_Mainloop()
を while ループ内に配置します。下記リストでは赤でハイライトされています。
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 MTOUCH_Service_Mainloop(); } }
11 mTouch ボタンで LED D7 を制御
API では:
bool MTOUCH_Button_isPressed(enum mtouch_button_names button)
が、ボタンのON/OFFを示します。
この例では、ボタンが一つしかないので "Button0" を引数に使用します。ボタンを押した時に LED D7 (active high) を点灯し、ボタンから指が離れた時に LED を消灯します。必要なアプリコードを描きリストに示します。追記・変更する命令は赤でハイライトされた行です。
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
if(MTOUCH_Service_Mainloop())
{
if(MTOUCH_Button_isPressed(Button0))
LED_D7_SetHigh();
else
LED_D7_SetLow();
}
}
}
12 プログラムの書き込みと実行
Program アイコンをクリックし、PICにプログラムを書き込みます。
書き込み終了後に、mTouch ボタンに触ると LED D7 が点灯します。