GPIO接続のLCDへ表示する(MCP23017の入力割り込み その1)


前回はIOエクスパンダ(MCP23017)を使ってLCDを表示する方法を紹介 しま した。
そこで、今回は少し脱線してIOエクスパンダ(MCP23017)での割り込み処理を確認します。
回路図はボタン2つだけの簡単なものです。


コードは以下のとおりです。
#include <stdio.h>
#include <stdlib.h>
#include <wiringPi.h>

#define BUTTON1 0       // GPIO17
#define BUTTON2 1       // GPIO18
#define PINBASE 0

void signal1(void){
    printf("Push Button1\n");
}

void signal2(void){
    printf("Push Button2\n");
}

int main(void){
    if (wiringPiSetup() == -1){
        printf("Setup Fail\n");
        exit(1);
    }

    pinMode(PINBASE+BUTTON1, INPUT);
    pinMode(PINBASE+BUTTON2, INPUT);

    while(1){
         wiringPiISR( PINBASE+BUTTON1, INT_EDGE_FALLING, signal1 );
         wiringPiISR( PINBASE+BUTTON2, INT_EDGE_FALLING, signal2 );
         sleep(10000);
    }
    return 0;
}

ボタン1、2が押されたら、それぞれ割り込み処理で画面に文字を表示します。



同じことをMCP23017で行うために、以下の回路で試してみました。

コードは以下のコードです。
#include <stdio.h>
#include <stdlib.h>
#include <wiringPi.h>
#include <mcp23017.h>

#define BUTTON1 0       // GPIO17
#define BUTTON2 1       // GPIO18
#define PINBASE 100

void signal1(void){
    printf("Push Button1\n");
}

void signal2(void){
    printf("Push Button2\n");
}

int main(void){
    if(mcp23017Setup(100,0x20) == -1) {
        printf("Setup Fail\n");
        exit(1);
    }

    pinMode(PINBASE+BUTTON1, INPUT);
    pinMode(PINBASE+BUTTON2, INPUT);

    while(1){
         wiringPiISR( PINBASE+BUTTON1, INT_EDGE_FALLING, signal1 );
         wiringPiISR( PINBASE+BUTTON2, INT_EDGE_FALLING, signal2 );
         sleep(10000);
    }
    return 0;
}

変更したのは下線部分の3箇所だけです。


MCP23017のデータシートを見ると、チップそのものは入力割り込みに対応しているようですが、
wiringPiISR()はIOエクスパン ダには対応していないようです。
残念!!

次回は改めてIOエクスパンダ(MCP23017)での割り込み処理を紹介しま す。