組込み系システム開発室by藤原技研M

製作中の組込み機器や気になる開発ツールなどを中心に記事を書いています。

キッチンタイマーの製作(2)MCCで入出力ポートの追加

マイコンのクロック設定をMCCを用いて設定します。

f:id:fujiharagiken:20171221175336p:plain

 

MCCを用いて入出力ポートの割当を行います。

今回割り当てるポートは

・入力:RA2、RA3、RA4

・出力:RB0、RB1    ※RB0はRP0と同じピン、RB1はRP1と同じピン

Pin Manager.GridウィンドウのPin Module項目のGPIO:input行とRA2,3,4と交差するところをクリックすると鍵がかかる仕組みになっています。。

RB0,RB1は出力ポートで使えるようになっているので今回は触らなくてもOKです。

f:id:fujiharagiken:20171113140749g:plain

Generateボタンをクリックします。

次のような警告がでますが、Yesをクリックします。

f:id:fujiharagiken:20171113140844p:plain

これで入力ポートが3本追加できました。ポートの値を取得する関数

 IO_RA2_GetValue()

 IO_RA3_GetValue()

 IO_RA4_GetValue()

を用いて、ポートの入力がHighかLowを調べることができます。

 

<追加するプログラム>

グローバル変数

//------[ global(広域)変数定義 ]------
unsigned char SW1 = 0x01; // スイッチデータのビット位置
unsigned char SW2 = 0x02; // スイッチデータのビット位置
unsigned char SW3 = 0x04; // スイッチデータのビット位置
unsigned char bSwData; // スイッチデータの格納変数
unsigned char bSwDataOld; // スイッチデータの格納変数(過去)
unsigned char bSwDataSave; // スイッチデータの変化検出用変数

 

【スイッチの取り込みとチャタリング除去処理】

void SwScan(void) {
    unsigned char bWk = 0;

    if (IO_RA2_GetValue() == HIGH) { // HIGHでオンのケース
        bWk |= SW1;
    }

    if (IO_RA3_GetValue() == HIGH) { // HIGHでオンのケース
        bWk |= SW2;
    }

    if (IO_RA4_GetValue() == HIGH) { // HIGHでオンのケース
        bWk |= SW3;
    }


    // スイッチの二度読み
    if (bSwDataOld == bWk) {
        bSwData = bWk; //前回と一致したのでスイッチデータを確定する
    }
    bSwDataOld = bWk; // 今回の値を保存

}

 

【スイッチの変化検出処理関数】

void swOperation (void) {
    // SWに変化があったか判別
    if (bSwData != bSwDataSave) {

        // SW1操作判別
        if ((bSwData & SW1) == LOW) {
            IO_RB0_SetHigh(); // LEDを点灯
        } else {
            IO_RB0_SetLow(); // LEDを消灯
        }
   
        // SW2操作判別
        if ((bSwData & SW2) == LOW) {
            IO_RB1_SetHigh(); // LEDを点灯
        } else {
            IO_RB1_SetLow(); // LEDを消灯
        }

        // SW3操作判別
        if ((bSwData & SW3) == LOW) {

            } else {

        }

    }

    bSwDataSave = bSwData; // 変化検出用旧データを更新
}

【メイン関数】

int main(void){
    // initialize the device
    SYSTEM_Initialize();

    int loopCnt = 1;

    //永久ループ
    while (1) {
        SwScan(); // スイッチの取り込みとチャタリング除去処理
        switch (loopCnt) {
            case 1:
                // SWが押された時のLED点灯処理
                swOperation();
                break;
            case 2:
                // ○○○処理
                break;
            case 3:
                // ○○○処理
                break;
            case 4:
            default:
                loopCnt = 0;
                break;
        }
        loopCnt++; // ループカウンタの更新
        __delay_ms(10); // 10msウェイト

    }

}

 

※__delay_ms(10); // 10msウェイトはエラーが出るので以下の記述をソースプログラムの先頭部に追加しておきます。

    //【定義】を追加

    #define FCY (_XTAL_FREQ*2) 

 

    //【インクルードファイルの指定】を追加

    #include <libpic30.h>  // __delay_ms()使用のため

 

続きは(3)へ http://fujiharagiken.hatenablog.com/entry/2017/10/21/124650