上記の広告は1ヶ月以上更新のないブログに表示されています。
新しい記事を書く事で広告が消せます。
3日坊主からの復帰です!
ゆってぃです。

先日、ついにNHK集金の魔の手がうちのオンボロアパートにも届いてしまいました。。。

ゆ「NHK見てないんですよ(ニュースと英語とスポーツと大河ドラマ以外は…(汗))」
N「いや、そういう問題ではなく、テレビ所有者の方は全員払わなくちゃならないんですよ」
ゆ「でも、これって強制じゃないですよね?」
N「いえ、放送法第○○条で(忘れた…)決められておりましてうんたらかんたら」
ゆ「わかりました…(しゅん…)」
N「ありがとうございます。でもお客様はラッキーですよ。この地域にお住まいの方は、通常の半額でいいんですから」
ゆ「え!そうなんですか??(ぱぁ!)」
N「はい。○○基地(ある有名な軍事施設。調べれば一瞬でヒットしますが、一応伏字に(笑))の近隣住民の方は、防衛省が半額負担する仕組みになっているんです。というのもうんたらかんたら」
ゆ「あ、じゃあ払います!!」

なんでも、ある軍事施設の近くに住んでいる場合は半額免除になるらしいです。
一応もういい大人ですし、半額に惹かれて(?)きちんと払うことにしました(笑)


さて、今日は信号の反射のお話です。

以前にもチャタノイズに関して書かせていただきましたが、書いた矢先、自らが反射ノイズの罠にはまってしまいました…。

具体的には、ある外部割込み端子に以下のような記述をしていました。
IntIrq()関数は、その割り込みハンドラです。(IrqはInterrupt ReQuestの略です)

void IntIrq(){

 static unsigned char sucCount = 0;

 (前略)

 if(sucCount >= 10){
  func1();
  sucCount = 0;
 }
 else sucCount++;

 (後略)

}

要するに、その割り込みが10回入ってきたら、func1()を呼ぶというものです。
しかし、試作ボードでいろいろ動かしてみると、どうも様子がおかしい。変な場所でfunc1()が呼ばれているのです。

どうやらIntIrq()が意図していないところで呼ばれてsucCountがインクリメントされてしまい、func1()の呼び出しタイミングがズレてしまうようでした。
ですので
「ああ、きっと割り込み信号にノイズが乗ってるんだな」
と考え、オシロで確認したところ(パッと見は)とてもキレイな波形でしたorz

仕方がないので、割り込みハンドラ内で空いている出力ポートから信号を出す、いわゆる出力ポートデバッグを行いました。ここでは、以下のように出力ポートAの1ビット目をパタパタさせて確認しました。

void IntIrq(){

 static unsigned char sucCount = 0;

 (前略)

 PORT_A |= 0x01;
 PORT_A &= 0xFE;

 if(sucCount >= 10){
  func1();
  sucCount = 0;
 }
 else sucCount++;

 (後略)

}

そして、得られた波形はこれ…
(言い忘れていましたが、割り込み信号の立下りエッジでIntIrq()を呼んでいます)

割込信号
んん!?
なんかへんなのがいねぇか??

そう、なぜかたま~に立ち上がりエッジでもIntIrq()が呼ばれていたのです。
結論から言えば、やはりノイズが原因だったのですが、その発生場所が最悪でした。
上の図で問題のあった位置を拡大してみると…

割込信号拡大

このマイコンの割り込み端子はシュミット入力になっていたので余裕かましてましたが
それでも吸収しきれないくらいのノイズが乗っていました。。。
このノイズのせいで、マイコンは「立下りエッジがきた!」と勘違いしていたのですね。
(マイコン自身は正しく動いているので、勘違いというのは語弊がありますが)

実は、この割り込み信号の発生元からマイコンまでが、きちんとフィルタ回路を入れていなかった上に、中継ボードを介しているためコネクタ二段構えという、反射おこりまくりんぐな経路になっていたため、こんなことが生じていたのです。

組み込み経験が浅い新入社員の方などは、先輩方から信号品質に関していろいろ口うるさく言われてしまい、
「反射やらなまりなら、信号品質ってそんなに重要なの?」
とふてくされている方もいるかと思います。
自分も数年前はそうでした。

この際、はっきり言いましょう。

超重要です!

この手のノイズのタチが悪いのは、周波数成分が高いため、通常のパッシブプローブじゃ拾いきれないケースが多いのです。上に書いた信号の拡大図は、パッシブプローブでは拾えませんでした(FETプローブでようやく見つけることが出来ました)

組み込み・制御エンジニアにとって、回路設計は他人事ではありません。
電源などの難しい部分は回路屋さんに譲るとして、デジタル信号部分は自分たちで開発・設計・評価が出来るくらいのスキルを身に付けたいものです。(もちろん、僕自身にも言えることです)

という訳で、今回の記事はここまでです。
今日も最後まで読んでくださって、ありがとうございました(感謝)

重要:筆者はあくまでも「ど素人」エンジニアなので、話半分でお読みくださいね(笑)
関連記事
スポンサーサイト
コメント
コメントの投稿
トラックバック URL
トラックバック
ご訪問者様
プロフィール

ゆってぃ

Author:ゆってぃ
経歴7年の組み込み系・制御系エンジニアです。
("ど素人"という文言は取りました…笑)
ソフトウェア開発経験ゼロの状態から、なんとか実務がこなせるようになってきた現在に至るまでの経験を、備忘録代わりに綴っていきたいと思います。
入門者の方、大歓迎!
(上級者の方、ごめんなさい…)

あと、ブログには全然関係ないですが、Bumpy Headというバンドのギターをやっています。
ライブ情報なんかも書いたりすることがあるので、その時に「行ってもいいよ~」といった感じのコメントを戴けると、泣いて喜びます(泣)
ブログ読んでくださってる方なら、チケット代サービスしちゃいます!

最後に…滅多に流用することは無いでしょうが、このブログに書かれているソースは、特に指定の無い限りMITライセンスとします。ただし、一部それ以外のものもございますのでご注意下さい。
※ブログのリンク先にあるコードに関しては、リンク先のポリシーに従ってください。

最新記事
最新コメント
カテゴリ
RSSリンクの表示
メールフォーム

名前:
メール:
件名:
本文:

twitter
リンク
ブロとも申請フォーム
スポンサードリンク


上記広告は1ヶ月以上更新のないブログに表示されています。新しい記事を書くことで広告を消せます。