HN 日本語サマリー

← 一覧へ戻る
プログラミング

マイクロコントローラー回路のデバッグにおける冒険

Adventures in Microcontroller Circuit Debugging (bigmessowires.com)

31 pointsby lateatdesk6 コメント

要約

この記事は、著者が製造したFloppy Emuディスクエミュレーターの新しいバッチで発生した、これまで経験したことのない奇妙な不具合のトラブルシューティングについて詳述しています。多くのユニットが起動せず、一部は「幽霊」のような動作を示し、また一部はスローモーションのように動作しました。著者は、ハードウェアデバッガやLED点滅などの様々なデバッグ手法を駆使しましたが、最終的に、問題の根本原因が外部20MHzクリスタル発振器ではなく、内部8MHzオシレーターの使用に切り替えることで解決することを発見しました。これは、クリスタル発振器回路の設計または部品に問題がある可能性を示唆しています。

全文翻訳

マイクロコントローラー回路デバッグの冒険

[画像: クリスタルとコンデンサを備えた回路基板]

調子の悪いマイクロコントローラー回路のトラブルシューティングは、どのように行いますか? 数ヶ月前、私は新しいバッチのFloppy Emuディスクエミュレーターを製造しました。そのうちのいくつかは工場でQAに合格せず、私がこのデバイスを開発してきた長年の経験では見たことのない一連の症状を示しました。

  • 電源は良好で、MCUは正しくプログラムされていることを確認したにもかかわらず、ほとんどのものがまったく起動しませんでした。
  • 一部は「幽霊」のような動作を示し、MCUプログラムコードのランダムなセクションにジャンプしているように見え、文脈とは無関係なメッセージを表示に出力しました。
  • 一つはスローモーションのように動作し、LEDの点滅やディスプレイの更新が通常よりも明らかに遅かったです。

少なくとも、これは奇妙なことでした。私はATMEGA1284マイクロコントローラーと、その周辺のFloppy Emuの回路について多くの経験があり、不調なボードの症状に基づいて何が問題かを推測する専門家になりました。これらはすべて、私にとって新しく奇妙な症状でした。これらは異なる問題に起因するのか、それともすべて一つの共通する根本的な問題を示しているのか?

私の直感では、何らかの体系的な組み立ての問題が示唆されました。このバッチのFloppy Emuボードでは、私の契約製造業者が新しい下請け業者を使用していたため、プロセスの静かな変更が予期せぬ問題を引き起こしたのかもしれませんか? 部品交換? 悪い部品? 偽造チップ? これらのQAの不具合は、回答を待って数ヶ月間、私の机の上の山に積まれたままでした。

調査、実験、そして理論化

昨日、私はついに「起動しない」デバイスに集中することにしました。なぜなら、それが最も扱いやすい問題のように思えたからです。私はいくつかのボードをテストハーネスに入れ、電源とハードウェアデバッガを接続しました。電源電圧は良好に見えました。明らかなはんだ付けの問題は見られませんでしたが、念のためいくつかのボードのはんだをリフローしましたが、改善は見られませんでした。

多くのボードでは、ハードウェアデバッガはマイクロコントローラーと通信でき、チップが正しく設定されプログラムされていることを確認できましたが、プログラムは実際には実行されていないようでした。電源投入時、ボードは…何も起こりませんでした。そして、より少ない数のボードでは、デバッガはチップと通信することも、検出することさえできませんでした。何がこれらの症状を引き起こす可能性があるのでしょうか? 私はブレインストーミングしました。

  • 悪い電源。私の測定によって除外されたようです。
  • プログラムミスのあるチップ。設定を確認し、いくつか再プログラムしましたが、改善はありませんでした。
  • 悪いチップ。
  • リセットされたままのチップ。
  • クロックの問題。
  • その他の回路部品(SDカード、CPLDなど)の問題による電気的またはプログラム的な障害。

一括りの悪いマイクロコントローラーチップが最も可能性の高い説明のように思えたので、ボードからATMEGA1284をはんだ付けで取り外し、手持ちの新しいものと交換しました。しかし、チップを設定してプログラムした後も、ボードは以前と同じように動作せず、起動を拒否しました。これはチップ自体の問題を除外したようです。

Floppy Emuのプログラムコードでは、デバイスが最初に電源投入されると、デバイスディスプレイに何も描画される前に、SDカードとCPLDとの通信が行われます。私は、これらのステップのどこかで問題が発生し、プログラムがフリーズまたはクラッシュして、ディスプレイが空白になるのではないかと疑いました。これをテストするために、プログラムを変更して、main()の開始時に他の何もする前に、生命の証としてステータスLEDを20回点滅させるようにしました。はい、私の手元にあるすべてのハードウェアツールを使って、私は点滅するLEDを使った原始的なデバッグに戻っていました。

しかし、喜びはなく、LEDの点滅もなく、電源投入時にプログラム活動が見られませんでした。一体どうしたのでしょう? ここには、良好なマイクロコントローラー、良好な電源、正しくプログラムされていることが確認され、長年正常に使用されている回路とボードデザインがありました。LEDさえ点滅しませんでした。点滅はプログラムの最初のステップであるはずだったので、その不在は、SDカードのような他の回路部品とのやり取りの失敗に関連する説明をほとんど除外するように見えました。そのため、私は残された唯一の可能性であるリセット信号とクロックに焦点を当てました。

クロッククリスタルの謎

Floppy Emuのマイクロコントローラーは、速度と精度のために外部20MHzクリスタルを使用していますが、内部に8MHzの発振器も内蔵しています。この特定のボードはまだハードウェアデバッガと通信できていたので、面白半分でチップのヒューズ設定を変更して、内部8MHz発振器をクロックソースとして選択してみました。驚いたことに、それは機能しました! デバイスは起動し、明らかに通常の40パーセントの速度で、正常に動作しているように見えました。私は他のいくつかのボードでも同じ結果を確認しました。デバッガ通信を取得してクロックソースを内部発振器に変更できた場合、ボードは起動しました。これは修正ではありません。Floppy Emuは8MHz発振器では正常に動作しないためですが、外部クロッククリスタルに重大な問題があることの証明でした。

外部クリスタルが確実に動作しない場合、マイクロコントローラーは信頼できるクロックソースを持てません。おそらくまったく実行されないか、非常に不安定に動作するでしょう。デバッガ通信にも問題が発生します。これらすべては、私が観察した症状とよく似ています。

[画像: Atmelクリスタル発振器の図]

では、このクリスタル発振回路について話しましょう。ほとんどのマイクロコントローラーと同様に、ATMEGAシリーズには外部圧電クリスタルを駆動し、私がPierce Oscillatorと呼ばれる回路を使用して発振させるためのアンプハードウェアが組み込まれています。動作理論についてもっと知っているべきですが、私はほとんど無知です。私が知っているのは、クリスタルの2つの端子を、実用的に可能な限り短いPCBトレースを使用して2つのATMEGAピンに接続し、ピコファラッド範囲の値の2つの外部コンデンサを追加し、その値は式で決定され、その後すべてが機能するということです。

さらに調査したところ、問題のあるボードはすべて、以前使用していたものとは異なるクリスタルメーカーを使用していることに気づきました。それは問題ないはずですが、状況を考えると重要だと思われました。以前のバージョンのボードは、このNDKクリスタルを使用していましたが、これらの問題のあるボードは、類似のECSクリスタルに置き換えられていました。どちらも同じ物理的なフットプリントを使用し、8pFの負荷容量を広告していました。

推測と次のステップ

今日現在、直接的なデバッグはここまでですが、決定的な説明を探し続けています。おそらく、クリスタルのバッチが悪かったのでしょうか? 可能性はありますが、ボードを改造してクリスタルを交換してみることはできます。しかし、その説明は私にはあまり可能性が高いとは思えません。

発振回路の一部を形成する2つのコンデンサはどうでしょうか? それらの値は発振器の動作にとって重要であり、値が最適な値から大きく外れていると、クリスタルが正しく発振しないか、まったく発振しない可能性があります。これらの小さなSMDコンデンサにはマーキングがないため、視覚的に正しいコンデンサであることを確認する方法はありません。下請け業者は一部のボードで間違った値のコンデンサを使用したのでしょうか? それについて言えば、正しい値は何でしょうか?

[画像: クリスタル回路の回路図]

ここで、私はあまりよく理解していないPierce Oscillatorのアナログ的な神秘の世界に入ります。2つの外部コンデンサの正しい値は、Cext = 2 * (Cload - Cstray) という式で与えられます。Cloadはクリスタルの負荷容量で、この場合は8pFです。CstrayはマイクロコントローラーピンとPCBボードトレースの浮遊容量の測定値です。これを直接測定する簡単な方法はありませんが、2層PCBの短いトレースでは、約3pFから5pFの見積もりを見たことがあります。これを4pFと呼びましょう。したがって、Cext = 2 * (8pF - 4pF) = 2 * (4pF) = 8pFとなります。理論的には、クロッククリスタルとペアで2つの外部8pFコンデンサを使用すべきです。実際には、コンデンサは18pFです。

18pFの外部コンデンサ。元の設計値をどのように指定したか覚えていません。Floppy Emuの初期開発段階の霧の中に失われています。しかし、今改めて見ると、「理想的ではない」ことは確かです。発振回路はかなり寛容であり、ATMEGAドライバーアンプは広い範囲の静電容量値で動作できるため、おそらく以前は問題に気づかなかったのでしょう。しかし、18pFは数学的に正しくありません。私の推測では、発振回路はマージンに近いところで動作しており、今ではこのECSクリスタル、そのESRまたは浮遊容量が何か違うため、回路が快適ゾーンから十分に外れて完全に動作しなくなっているということです。

では、どうすればよいでしょうか? この理論を確認し、問題を解決するにはどうすればよいでしょうか? 一つの可能性は、ヒューズ設定を変更してATMEGAのクリスタルドライバーの動作を変更することです。私は通常、低電力クリスタル発振器モードを使用します。これはミリボルト範囲の駆動電圧を印加しますが、外部コンデンサが最適な値の範囲外にあるこのようなケースでより良く機能するはずのフルスイングクリスタル発振器のオプションもあります。これをテストするために、私は一つのボードのヒューズを変更してフルスイング発振器の動作を有効にしましたが…それは機能しませんでした。ボードは起動しなくなり、デバッガとの通信も停止したため、実質的にブリック(文鎮)になりました。

そうなると、ボードを改造して外部コンデンサを8pFの交換品に交換する可能性が残ります。あるいは、元の設計値に近い値として10pFや12pFかもしれませんが、値が高すぎる場合と同様に、値が低すぎる場合にも問題が発生する可能性があるためです。残念ながら、私のワークショップにはその範囲の適切なコンデンサが在庫されていません。テスト用にさまざまな値のものを注文したので、この謎の結論はそれらが届くまで待つ必要があります。続報をお待ちください…