GPIO interrupt


PS: 個人實驗版用 1.0.9 - Release History

Arduino 有提供 attachInterrupt() / detachInterrupt() 來做 GPIO interrupt.

當 GPIO 收到訊號, 會發插斷, 這時會跳到所註冊的插斷函式.

void attachInterrupt(uint32_t pin, void (*callback)(void), uint32_t mode)

mode 有幾種 :

   LOW : 當 GPIO 在 低電位 (0V) 時, 會持續發中斷
   HIGH : 當 GPIO 在 高電位 (3.3V) 時, 會持續發中斷
   RISING : 當 GPIO 從低電位 變成 高電位  時,  會發中斷
   FALLING : 當 GPIO 從 高電位 變成 低電位 時, 會發中斷

目前可以拿來當 GPIO interrupt 的腳位有
  - D3 / D4 / D8 / D12 / D13 / D14 / D16 / D17

*INT 代表可以當 GPIO interrupt,



環境設置 

    Ameba 開發板 x1
    杜邦線 2.54 , 頭公對公



範例程式 : D2 - D13 接起來


int event_pin = 2;
int int_pin = 13;
int count=0;
void test_isr(void)
{
count++;
Serial.print("Interrupt! count=");
Serial.println(count);
}
void setup() {
Serial.print("int_pin=");
Serial.println(int_pin);
pinMode(event_pin, OUTPUT);
pinMode(int_pin, INPUT);
digitalWrite(event_pin, HIGH);
attachInterrupt(int_pin, test_isr, RISING);
}
void loop() {
if ( count >= 10 ) {
detachInterrupt(int_pin);
}
digitalWrite(event_pin, HIGH);
delay(500);
digitalWrite(event_pin, LOW);
delay(500);
}
程式說明 : 

    我們在 loop() 每秒拉 event_pin (D2), 500ms high , 500ms low 
    ( D2 接 LED 的話可以看到亮暗變化 )

    D13 設置為 GPIO interrupt 接收 pin,  
    設置方式在 setup()
pinMode(int_pin, INPUT);
attachInterrupt(int_pin, test_isr, RISING);

   這樣訊號 從 RISING 時 (從 LOW 到 HIGH), 就會 trigger interrupt, 跳到 test_isr() 函式執行. 
   ( 所以 loop() 迴圈第一圈 (從 HIGH 到 LOW), 到第二圈設成 HIGH 時觸發 )

   另外計數到十時, 呼叫 
             detachInterrupt(int_pin);

   停止 GPIO interrupt 

程式結果:

int_pin=13
Interrupt! count=1
Interrupt! count=2
Interrupt! count=3
Interrupt! count=4
Interrupt! count=5
Interrupt! count=6
Interrupt! count=7
Interrupt! count=8
Interrupt! count=9
Interrupt! count=10





留言

熱門文章