Ameba Arduino: [RTL8195] [RTL8710] GPIO – 使用GPIO Interrupt控制LED

材料準備

  • Ameba x 1
  • LED x 1
  • Button x 1

範例說明

這個範例裡,我們使用按鈕與LED。一開始LED是亮的,當我們按下按鈕並放開之後,LED變暗。再按下按鈕之後,LED變亮。
相比較於Arduino的入門的範例 “按鈕與LED”,不一樣的地方是,Arduino的範例是按著按鈕,LED才亮著,放開按鈕,LED才熄滅。
我們打開範例程式, “Files” -> “Examples” -> “AmebaGPIO” -> “InterruptCtrlLed”
並且接線如下圖
1

編譯程式並上傳到Ameba完成之後,按下Reset按鈕。
一開始LED是亮的,當我們按下Pin 12的按鈕並放開,LED變暗,再按一次,LED變亮

程式碼說明

setup()裡面我們將Pin 12的按鈕設定成 INPUT_IRQ_RISE,代表當這根pin的電壓遇到GND變成3V3的情況會觸發Interrupt。所以我們將按鈕一端接在3V3,按下按鈕時3V3會連通而觸發interrupt。
pinMode(button, INPUT_IRQ_RISE);
我們也可以設定成INPUT_IRQ_FALL,代表遇到pin的電壓遇到3V3變成GND會觸發Interrupt。這種情況裡,按鈕另一端通常會接在GND

設定完pin mode之後,再設定要處理interrupt的function: digitalSetIrqHandler(button, button_handler);
其中第二個參數是function pointer,它的prototype是:void button_handler(uint32_t id, uint32_t event)
所以我們在這個handler裡面處理interrupt,每按一次按鈕(並放開)會觸發一次中斷,我們就改變LED狀態。
NOTE:如果發現按下按紐LED的狀態沒變,或是LED閃了一下又恢復成原本的狀態,通常是因為人的手指相較於IC不夠靈敏,所以雖然我們覺得只按了一次,實際上輕微的抖動IC都認的出來,並且實際上是觸發了兩次interrupt