🎄teratailクリスマスプレゼントキャンペーン2024🎄』開催中!

\teratail特別グッズやAmazonギフトカード最大2,000円分が当たる!/

詳細はこちら
Arduino

Arduinoは、AVRマイコン、単純なI/O(入出力)ポートを備えた基板、C言語を元としたArduinoのプログラム言語と、それを実装した統合開発環境から構成されたシステムです。

Q&A

解決済

1回答

2320閲覧

Arduinoで割り込み処理が余分に呼び出される

honda300en

総合スコア14

Arduino

Arduinoは、AVRマイコン、単純なI/O(入出力)ポートを備えた基板、C言語を元としたArduinoのプログラム言語と、それを実装した統合開発環境から構成されたシステムです。

0グッド

0クリップ

投稿2019/10/12 08:52

Arduinoのハードウエア割り込みでデバイスAからの信号を読み込んでいます。
単体テストは正常に動作しますが、メインループに他のピンを HIGH/LOW する処理を追加すると、タイミングにより(余分な)割り込みハンドラ呼び出しが発生します。オシロで見ても割り込みピンへの入力波形に変化はなく、余分な割り込みが生じる理由がわかりません。

具体的には割り込みハンドラ関数が余分に多く呼び出されます(ハンドラ関数は attachInterrupt() で登録した以外に、自コード内で呼び出したりはしておりません)。

追加した処理(デバイスBのピンを HIGH/LOW する)の digitalWrite() をコメントアウトすると問題は生じなくなります。この処理が余分なハンドラ呼び出しを発生させる要因となっているのですが、どうしてそうなるのか? 直接の原因が分からず困っております。

デバイスA: クロック(2番 INPUT_PULLUP) データ(4番 INPUT_PULLUP)
デバイスB: コントロール(7番 OUTPUT)

ハンドラ関数は以下のように設定、
attachInterrupt(digitalPinToInterrupt(2), handler(), FALLING);

タイマー割り込み、シリアル通信は使用していません。入力ピンの信号変化が無い(オシロで確認済み)のに割り込みハンドラが呼び出される理由としてはどのようなものが考えられるでしょうか?

また、ボードを UNO から MEGA に換えて、割り込みピンを 18,19,20,21 などに変えると問題の発生タイミングや頻度が変わります。21番ではほとんど問題なく動きます。何が影響しているのか分かりません。

C言語プログラミングの経験は長いですが、Arduinoやハードには詳しくありません。
一般的に確認するべき点でも構いませんので、アドバイス頂ければ幸いです。
よろしくお願い致します。

気になる質問をクリップする

クリップした質問は、後からいつでもMYページで確認できます。

またクリップした質問に回答があった際、通知やメールを受け取ることができます。

バッドをするには、ログインかつ

こちらの条件を満たす必要があります。

guest

回答1

0

ベストアンサー

オシロで見ても割り込みピンへの入力波形に変化はなく、余分な割り込みが生じる理由がわかりません。

ノイズ、あるいは他ピンからの誘導などによりごく細いグリッチが発生してるんじゃないでしょうか。
こういう信号はよほど注意深く見ないと、オシロでは見えません。

内蔵プルアップだけ、ではなく、数キロオームの抵抗などで割り込みのピンをプルアップしてみてください。
それで割り込みが出なくなるなら、そういうことです。

投稿2019/10/12 09:01

y_waiwai

総合スコア88038

バッドをするには、ログインかつ

こちらの条件を満たす必要があります。

honda300en

2019/10/12 09:10

回答ありがとうございます。 教え頂いた「数キロオームの抵抗などで割り込みピンをプルアップ」を試してみたいのですが、抵抗をどの部分に入れればいいでしょうか? 現在、入力している回路は次のリンクの(digital 6)にあたるものです。大変初歩的な質問で申し訳ありません。 http://radiopench.blog96.fc2.com/blog-entry-324.html
y_waiwai

2019/10/12 09:24

そのピンと、5V電源の間に1Kとか4.7Kとか、そこらへんの抵抗をつないでみてください
honda300en

2019/10/12 11:04

見事に止まりました! 正直、感動しています、自分はどうしてもソフト的(デジタル)で考えてしまうのでノイズなどアナログ要因にはお手上げでした・・・でも、ハードも知りたいとArduinoを触っているので、これはとても非常に良い経験になりました。本当にありがとうございます。 ところで、この抵抗値は高いほどエラーが増えるようで、1KΩでも僅かにエラーが出るため 330Ωにしてみたのですが、これはどこまで下げて良いものでしょうか? 弊害などありましたら教えて下さい。
y_waiwai

2019/10/12 11:42

その抵抗はあまり小さくしすぎると、トランジスタがONできなくなります。また、それにより消費電流も増えます。なので、通常は1K程度を最小と考えてください その回路図で、トランジスタとCPUの間の配線を長く伸ばしてないでしょうか また、お互いの配線も接近させると双方アンテナとなってしまうので誘導しやすくなります
honda300en

2019/10/12 12:24

ありがとうございます。1Kでエラーが出ないように配線に気をつけて調整してみます。 本当にありがとうございます。初めて質問投稿しましたが台風の日にこんなに早く解決するなんて素晴らしい。感謝です。
guest

あなたの回答

tips

太字

斜体

打ち消し線

見出し

引用テキストの挿入

コードの挿入

リンクの挿入

リストの挿入

番号リストの挿入

表の挿入

水平線の挿入

プレビュー

15分調べてもわからないことは
teratailで質問しよう!

ただいまの回答率
85.36%

質問をまとめることで
思考を整理して素早く解決

テンプレート機能で
簡単に質問をまとめる

質問する

関連した質問