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
留言
張貼留言