見よう見まねのラズベリーパイ (11) ~割り込み処理~

ポーリングでCPUがぐるぐると全力回転でスイッチ入力を監視しているプログラムを割り込みを使ったプログラムに変更してみます。
割り込みに関してはWiring Pi ウェッブサイトHome→Reference→Priority,Interrupts and Threads に説明があります。
使用する関数は wiringPiISR です。

wiringPiISR(int pin, int edge Type, void(*function)(void));
“int pin” にはpin 番号を入れます。プログラムではスイッチを接続するGPIO15ピンを#define で”SW_PORT” としますので、int pin は”SW_PORT”になります。
“int edge Type” は入力信号が下がる時(INT_EDGE_FALLING)、立ち上がる時(INT_EDGE_RISING)、その両方(INT_EDGE_BOTH)、またはピンの初期化をしていない場合に指定する INT_EDGE_SETUP のいずれかを指定します。
INT_EDGE_SETUP については説明を読んでもよく分かりません。
void(*function)(void) の所には int pin で指定したピンに割り込みが生じた場合に実行する関数名を指定します。

配線は前回のままで、プログラムだけを変更します。
プログラムの音を出す部分を tone_out という関数でスイッチ入力による割り込みが生じたときに実行させます。
buz_sw_brake
コンパイルして実行してみます。

pi@raspberrypi:~/clang $ cc -o 1-buz_sw_brake 1-buz_sw_brake.c -lwiringPi
pi@raspberrypi:~/clang $ sudo ./1-buz_sw_brake

スイッチを押すと圧電スピーカーからトーンが出ます。
高音と低音を0.5秒ずつ発信して1セットで、スイッチを押し続ける間、継続します。
プルアップしているGPIO15 がスイッチでグランドに落ちる時に割り込みが発生するプログラムですが、なぜかスイッチを離してもプラス1セット、余分にトーンが出ます。
宿題ができてしまいました。

カテゴリー: Raspberry Pi タグ: , , , , , , , , , , , パーマリンク

コメントを残す

メールアドレスが公開されることはありません。 * が付いている欄は必須項目です