InterruptInの扱いについて

06 Feb 2015

御世話様でございます。

基本的なことかも知れませんが、御知恵を拝借したく投稿させて頂きます。
現在ある用途向けにLPC1768を用いた計測システムを試作しております。その過程で上位側機器とのロジックを模擬する為にスイッチにてON/OFF(PullUp)の状態を入力しておりますが、InterruptInにおいて「入力していないCHのInterruptInが反応してしまう」という事象が見られ困惑しております。再現性を見る為に周辺機器をそぎ落として再現された最小構成は以下の通りです(USBで電源供給&TeraTermでデバッグ)。
/media/uploads/GON/20150205_cir.png

この構成において、以下のソースコードを実行致しました(Source:InterruptInの異常?)が、スイッチに入力しているCHでないCHの割り込みの発生が時折発生していることが確認され、原因の特定が出来ずに困っております。
オシロで確認致しましたが、発生するはずのないCHにトリガを設定してサンプリングを試みましたが、H(2.3V付近)の電圧が1.5V程度まで低下する症状が見られましたが(これも異常な感は多少ありますが)、Lの閾値である0.8Vまで下がるなどの事象は観測されませんでした。
/media/uploads/GON/20150205_drop.png

チャタリングは当然のごとく発生しておりますがその点は問題ではなく(対策等ももちろん存じております)、「チャタリングが発生した際に、他の割り込みが発生する原因が不明」な所が非常に気に掛かっております。
Farmwareは最新版に更新しましたが変化なし、mbedは最新リリースを用いております。

何か見落とし、不手際等思い当たる節が見受けれましたが御指摘頂けると幸いです。

宜しくお願い致します。

yamyam

InterruptInの異常?

#include "mbed.h"
char    *bin8(int bin);
//mbed NXP LPC1768 development board
InterruptIn startsignal(p29);
InterruptIn s0signal(p30);
InterruptIn s1signal(p28);
//---
int bit_status;
//---
void start_trigger_rise()
{
    bit_status = bit_status | 1;
}
//---
void start_trigger_fall()
{
    bit_status = bit_status | 2;
}
//---
void s0_trigger_rise()
{
    bit_status = bit_status | 4;
}
//---
void s1_trigger_rise()
{
    bit_status = bit_status | 8;
}
//--- main ---
int main()
{
    int flag;
    //---
    startsignal.mode(PullUp);
    s0signal.mode(PullUp);
    s1signal.mode(PullUp);
    //---
    startsignal.rise(&start_trigger_rise);
    startsignal.fall(&start_trigger_fall);
    s0signal.rise(&s0_trigger_rise);
    s1signal.rise(&s1_trigger_rise);
    //---
    while(1)
    {
        wait_us(1.0);
        if(bit_status!=0)
        {
            printf("bit>> %s\n",bin8(bit_status));
            bit_status = 0;
        }
    }
}
//---
char    *bin8(int bin)
{
        static char
                result[10];
        int    i1;

        result[8] = '\0';
        for(i1 = 0; i1 < 8; i1++){
                if(bin % 2 == 0)
                        result[(8-1)-i1] = '0';
                else
                        result[(8-1)-i1] = '1';
                bin = bin / 2;
        }
        return(result);
}
06 Feb 2015

答えになっていないかもしれませんが、

まず、回路からmbedを外して、mbedだけで動かして、mbedが異常かどうか調べる。

回路に積分回路を入れてみる等の対策を検討する。

たまにスイッチが壊れていることもあるので、入れ替えてしてみる。

っていうのはどうでしょうか。

積分回路はスイッチとmbedの間に0.1μFのコンデンサを並列に4.7kΩぐらいの抵抗を直列に入れればよいと思います。

06 Feb 2015

気になる点をひとつ.
内蔵プルアップ機能を使っておられますが,このプルアップが「弱い(抵抗値が高い)」のが原因のひとつかもしれません.

  • 回路とソフトはそのままで,より低い抵抗値(たとえば2.2kΩや3.3kΩなど)のプルアップ抵抗を各入力部に追加すると,現象に違いが見られないでしょうか?

TAUCHIさんの確認ポイント・対策案と合わせて検討いただければと思います.

06 Feb 2015

Yasushi TAUCHI wrote:

答えになっていないかもしれませんが、

まず、回路からmbedを外して、mbedだけで動かして、mbedが異常かどうか調べる。

回路に積分回路を入れてみる等の対策を検討する。

たまにスイッチが壊れていることもあるので、入れ替えてしてみる。

っていうのはどうでしょうか。

積分回路はスイッチとmbedの間に0.1μFのコンデンサを並列に4.7kΩぐらいの抵抗を直列に入れればよいと思います。

TAUCHI様
お世話様でございます。御指摘感謝いたします。
mbedは2個で試しましたが同じ挙動でしたので、故障の可能性は低いと考えております。またスイッチも種ほど変更しましたが、同じ挙動でしたのでこちらも問題ないと判断しております。
まだ試しておりませんが、積分回路(~チャタリング防止)をすれば問題なくなると考えておりますが、そこは今気にしている点ではなく、なぜ他のCHに割り込みが発生してしまうのかが非常に気なっております;

06 Feb 2015

Tedd OKANO wrote:

気になる点をひとつ.
内蔵プルアップ機能を使っておられますが,このプルアップが「弱い(抵抗値が高い)」のが原因のひとつかもしれません.

  • 回路とソフトはそのままで,より低い抵抗値(たとえば2.2kΩや3.3kΩなど)のプルアップ抵抗を各入力部に追加すると,現象に違いが見られないでしょうか?

TAUCHIさんの確認ポイント・対策案と合わせて検討いただければと思います.

OKANO様
お世話様でございます。御指摘ありがとうございます。
実は「pullup抵抗が高い」点は気になっておりましたが、何故そこまで高い抵抗が入っているのか?またこの配線(によるテスト回路)は通常他のマイコンなどでも用いられる方法であり、いままで同様な不具合が発生していなかったのか?など疑問に感じております。

確認の為に低いpullup抵抗を入れてテストしてみたいと思います・・・・・にしてもこの問題が皆様のところでも発生するのであればFAQになりそうな気もしますが、わたしの所だけの事象なのか気になります・・

07 Feb 2015

こんにちは ブレッドボードに同じ環境を作り試してみましたが、スイッチに入力しているCHではないCHの割り込みが発生するようなことは有りませんでした。チャタリングは発生していましたが...。

電源を交換して確認されましたか? 過去にいい加減な電源で電流不足で動作が不安定だったことがあります。

ご参考まで。

08 Feb 2015

Manabu Taniguchi wrote:

こんにちは ブレッドボードに同じ環境を作り試してみましたが、スイッチに入力しているCHではないCHの割り込みが発生するようなことは有りませんでした。チャタリングは発生していましたが...。

電源を交換して確認されましたか? 過去にいい加減な電源で電流不足で動作が不安定だったことがあります。

ご参考まで。

御世話様でございます。
確認頂きまして有難うございました。再現しなかったとの事、なにかわたしの環境の問題なのかもと疑い始めました。というのも実は実機にて不具合発生後、別建屋の作業場で上記図面のそぎ落とした構成を試したのですがその際には特に不具合は現れませんでした。
その時は同僚と”いい加減な配線は駄目だね”と笑っていたのですが・・・デスクに戻って試してみると、また同様な割り込みが再発していました。
電源は開発環境PCから給電していた為条件は同じです(ACなし、バッテリ駆動)。また不具合が発生しているデスク回りでもその点は気になったのでACアダプタを外して確認しましたが変化はありませんでした(デスク周りでは不具合が発生しやすい?)。

こうなってくると高内部pullup抵抗の弱さからノイズなどの影響が出やすくなっている事が疑わしいとうに思われてきました。ただし電源を入れているだけでは割り込み等は発生しませんので、スイッチの影響が出ているのは間違いないようなのですが・・・先に投稿した電圧のドロップが以外に大きいことも原因に関係していそうですが、PICのマニュアルにあるようなポート毎の回路図が見つけられずなぞのままです。

明日出社した後、もう一度環境を変えて確実に試してみようと思います。有難うございました。追って結果をご報告させて頂きます。。

09 Feb 2015

御世話様でございます。
確認致しました結果を以下に送信させて頂きます。
(1)電源電圧を異常CHのデータと同時にキャプチャしてみた所、目立った変動は確認されず
(2)3個のポート全てをmbed外の回路にて5.1kでpull-upした所、異常な他CHへの割り込みが発生しなくなった

上記症状より今回の問題点はmbed内部pull-up抵抗値が非常に高い為、他のCHのスイッチ切り替えの影響が出てしまったのではと考えております。
Taniguchi様にお試し頂いた環境で出ない症状がなぜ私の環境でのみ見られたのかという点は謎のままとなってしまいました。
低消費化の為にはやむを得ないとは思いますが、さすがにスイッチのON/OFFで異常が出るほどの高抵抗なのは正直?ではあります。
mbedでのpull-upについては、以後注意するように心得ました。

皆様、有難うございました。