両エッジ割り込みのPIN判定

あるPORTの複数のピンで両エッジ割り込みするとき、全てのピンの立ち上がり/立ち下がり全てに反応してしまうので、
前のPORT状態を保存しておいて現在と比較してやらなければならない。

例えばPORT2の5と7につないだ2つのスイッチそれぞれの両エッジを判定したいなら、両方on、片方on(2通り)、両方offの4通りになりますね

とりあえずプリプロセッサで定義など。

#define _BV(BIT) (1<<BIT)
#define SW_S _BV(5) // ShutterSW PORT_2_5
#define SW_T _BV(7) // ToggleSW PORT_2_7
volatile char sw_state;
sw_state = PRT2DR; // store current switch state


どのピンが変化したのかをXOR (^) で抜いてきて、switch文で判定した後
さらに実際今どういう状態なのか(on/off)を判定して処理。

#pragma interrupt_handler INT_GPIO
void INT_GPIO(void){
  switch(PRT2DR^sw_state){
  case SW_S:
    if(SW_S&PRT2DR){ // ShutterSW on
      UART_1_CPutString("shutter oshitazo\r\n");
    }
    else{ // ShutterSW off
      UART_1_CPutString("shutter hazushita\r\n");
    }
    break;
  case SW_T:
    if(SW_T&PRT2DR){ // ToggleSW on
      UART_1_CPutString("toggle ue\r\n");
    }
    else{ // ToggleSW off
      UART_1_CPutString("toggle shita\r\n");
    }
    break;
  }
  sw_state = PRT2DR; // store current switch state
}


psocgpioint.asmへのljmpの追加も忘れずに

ljmp _INT_GPIO

マイコンのプログラムは適当に書くと、実体のピン配置とコードが密結合してしまって、後で困る。GPIOがGeneral Purpose I/Oでなくなっちゃう
こういう書き方にしておけば#defineの所だけ書き直せば(だいたい)良くなる。