両エッジ割り込みの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の所だけ書き直せば(だいたい)良くなる。