• ベストアンサー

外部割込みについて

今3052というマイコンを使ってIRQによる外部割込みの勉強をしています。3つの押しボタンスイッチ(赤、青、黄色)にそれぞれ赤ボタンを押されたらDCモータを動かす、青ボタンを押されたらサーボモータを動かす、黄色ボタンを押されたらLEDを点滅させるというプログラムを作りました。動作が終わった後に次の動作ボタンを押すと問題なく3つ動くのですが、作業中にボタンを押すと一瞬動作が止まったりしてしまいます。そこで動作中割り込み禁止にし、動作は止まらなくならました。 ですが、エレベータのボタンのように作業中に押されたら作業を止めないで作業が終了したらその時押されたボタンに対応する作業をするようにできません。どうゆう風にすればいいのか教えてください。お願いします。ちなみに言語はC言語を使っています。

質問者が選んだベストアンサー

  • ベストアンサー
  • R32C
  • ベストアンサー率39% (115/290)
回答No.2

作業中 という言葉が出てくることから、 DCモータの起動ではなく、ある一定時間DCモータの作動 サーボモータの起動ではなく、ある一定時間サーボモータの作動 点滅動作はある一定時間点滅動作。 という動作を仮定します。 基本的には、 メインプログラム と 割り込みハンドラ(3つ) に 分け 割り込みハンドラは発生した事象(スイッチ) を内部フラグにセットするのみとします。 メインプログラムは、 無限ループ その中にスイッチ文で、割込みハンドラで設定された 内部フラグで DCモータか サーボモータか LEDかを判定し それぞれの処理用関数を呼び出します。 呼び出しから戻ると該当内部フラグをクリアし 無限ループを続けます。 それから、スイッチ文の判定順位により、 2度押しによる2度動作などが考えられるので 必要があれば、なんらかのインターロックを とる必要があります。 操作する順番をキッチリ守る必要があるなら、内部フラグではなく、 FIFOのデータ構造(キュー)を使って割り込みハンドラで FIFOに書き込み、メインプログラムでFIFOから取り出し とすればベストかと思います。 基本的にNo.1さんと同じです。

noname#191033
質問者

お礼

回答ありがとうございます。とてもわかりやすく、うまくプログラムできたと思います。ありがとうございます。

その他の回答 (1)

  • ymmasayan
  • ベストアンサー率30% (2593/8599)
回答No.1

最近の機械を知りませんので考え方だけ。 通常は外部割込とその下のレベルの実行プログラムに分けます。 1.外部割込みは割込の受付と実行プログラムの起動(登録)のみ担当させます。   実行キューを作る必要が有る場合も。 2.実行プログラムはそれぞれの動作の実行のみを担当します。   キューの削除が必要になる場合も。 3.IRQ同士は割り込み禁止にする必要が有るでしょう。

noname#191033
質問者

お礼

回答ありがとうございます。とても参考になり、無事動きました。ありがとうございます。

関連するQ&A