入力ピンの状態変化割込みなど
●状態変化割込み
mbedの入力ピンはp5からp30で状態変化割込みのトリガとして使用できます(コンパイルエラーが発生しない範囲。実際はほかのペリフェラルが使用しているときは使用できないと思う)。状態変化割込み(ピンチェンジ割込み)は、設定したピンの状態が、HレベルからLレベル、またはLレベルからHレベルに変化したときに発生する割込みです。
p19とp20はコンパイルエラーにはならないものの、実行時にエラーになります。オンボードLEDが外側2つ、内側2つの交互に点滅し、シリアルをつないでいるときは、使えない旨のメッセージが送信されます。p21、p22は大丈夫でした。
●割込みハンドラ
割込みが発生したときに呼び出される関数を割込みハンドラといいます。初期化時などにこのハンドラを登録しておくことで、割込み発生時に特定の関数(割込みサービスルーチン)を実行させることができます。
●使用方法
(1) 割込みオブジェクトのインスタンス生成
InterruptIn mySigChng(pin);
“mySigChng”がインスタンス名です。名前は任意です。”pin”は状態変化を監視したいmbedの入力ピンの番号で、p5, p20などと指定します。
(2) 割込みハンドラの定義
void intRise(void) { // 立ち上がり時にコールされる処理 // 処理 } void intFall(void) { // 立ち下がり時にコールされる処理 // 処理 }
(3) 割込みハンドラ登録
mySigChng.rise(&intRise); // 立ち上がりハンドラ登録 mySigChng.fall(&intFall); // 立ち下がりハンドラ登録
(4) 割込み許可、禁止
__disable_irq(); // 禁止 __enable_irq(); // 許可
●使用例
p5ピンの立ち上がりエッジでLEDが点灯し、立ち下がりエッジでLEDがOFFする処理の例。
#include "mbed.h" DigitalOut myled(LED1); // LEDインスタンス InterruptIn mySigChng(p5); // ピンチェンジ割込みインスタンス void intRise(void) { // 立ち上がり時にコールされる処理 myled = 1; // LED ON } void intFall(void) { // 立ち下がり時にコールされる処理 myled = 0; // LED OFF } int main() { // 初期化 mySigChng.rise(&intRise); // 立ち上がりハンドラ登録 mySigChng.fall(&intFall); // 立ち下がりハンドラ登録 while(1) {} }
このプロセッサに限らず、状態変化割込みでは、チャタリングが発生すると、状態変化を捕捉できないことがありますのでチャタリングが発生しないように注意が必要です。