電子書籍の厳選無料作品が豊富!

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

A 回答 (2件)

作業中 という言葉が出てくることから、


DCモータの起動ではなく、ある一定時間DCモータの作動
サーボモータの起動ではなく、ある一定時間サーボモータの作動
点滅動作はある一定時間点滅動作。

という動作を仮定します。
基本的には、
メインプログラム

割り込みハンドラ(3つ)

分け
割り込みハンドラは発生した事象(スイッチ)
を内部フラグにセットするのみとします。

メインプログラムは、
無限ループ
その中にスイッチ文で、割込みハンドラで設定された
内部フラグで
DCモータか
サーボモータか
LEDかを判定し
それぞれの処理用関数を呼び出します。
呼び出しから戻ると該当内部フラグをクリアし
無限ループを続けます。

それから、スイッチ文の判定順位により、
2度押しによる2度動作などが考えられるので
必要があれば、なんらかのインターロックを
とる必要があります。

操作する順番をキッチリ守る必要があるなら、内部フラグではなく、
FIFOのデータ構造(キュー)を使って割り込みハンドラで
FIFOに書き込み、メインプログラムでFIFOから取り出し
とすればベストかと思います。

基本的にNo.1さんと同じです。
    • good
    • 0
この回答へのお礼

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

お礼日時:2009/06/02 09:47

最近の機械を知りませんので考え方だけ。


通常は外部割込とその下のレベルの実行プログラムに分けます。
1.外部割込みは割込の受付と実行プログラムの起動(登録)のみ担当させます。
  実行キューを作る必要が有る場合も。
2.実行プログラムはそれぞれの動作の実行のみを担当します。
  キューの削除が必要になる場合も。
3.IRQ同士は割り込み禁止にする必要が有るでしょう。
    • good
    • 0
この回答へのお礼

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

お礼日時:2009/06/02 09:46

お探しのQ&Aが見つからない時は、教えて!gooで質問しましょう!