こんにちはI-Rです。
今回は、組み込み系で使用するマイコンで発生したバグについて紹介します。
マイコンでは各機能を使用するために、該当するレジスタを設定します。
レジスタの設定を行う際には、設定する順番や待機時間を考慮して設計します。
設定する順番や待機時間を考慮しないと、正しくレジスタが設定できなかったり、値の入出力時に、
正しく機能しないことがあります。
今回は、必要な待機処理を入れなかった事によるバグと、その対処方法を紹介します。
使用したマイコンは、RL78/F14です。
使用した機能は、AD変換機能です。
実現したかった機能は、AD変換結果の取得です。
発生したバグの概要は、
AD変換値を取得する際に、取得したいチャンネルと異なるチャンネルのAD値が取得されてしまう。
というもので、イメージとしては下記のイメージ図の様になります。
まず、今回実現したかったAD変換結果の取得について説明します。
AD変換結果取得処理の大まかな流れは、以下の通りです。
- 1.AD変換を行う入力端子を選択する。
- 2.選択した入力端子の電圧を取得する。
- 3.取得した電圧に対してAD変換を行い、格納レジスタに格納する。
- 4.AD変換結果が格納された格納レジスタの値を読みだす。
先程説明したバグは以下の経緯で発見しました。
- 1.AD変換値を取得するテストを行った際に、取得したAD変換結果の値が想定とは異なる値であった。
- 2.各チャンネルでのAD変換実行直後のAD変換結果の格納レジスタ(ADCRHレジスタ)の値を確認した。
- 3.各チャンネルでの実行結果の値について照合した結果、取得したいチャンネルと
異なるチャンネルのAD変換値が格納されている事を発見した。
バグ発生時のAD変換処理を再確認した所、以下の通りでした。
- 1.AD変換の分解能と入力チャネルの設定。
- 2.AD変換動作の制御ビット(ADCSビット)にAD変換開始を設定。
- 3.AD変換動作の制御ビットがAD変換終了状態まで待機。
- 4.AD変換結果格納レジスタ(ADCRHレジスタ)から値を取得。
1~4の処理で設定した設定値や、処理の順番に特に問題はありませんでした。
マイコンマニュアルを確認した結果、2と3の処理の間に必要な処理が抜けている事が判明しました。
AD変換動作の制御ビットは、AD変換開始を設定しても、変換起動時間が経過するまでは
AD変換終了状態となっています。
そのため、2でAD変換開始設定後、すぐに3でAD変換動作の制御ビット確認しても
AD変換終了状態のままとなっており、 3での待機処理がAD変換未完了時でも、
完了と判断されてしまいます。
これにより、AD変換完了前にAD変換結果格納レジスタを読み出してしまい、
目的のAD値を取得できていない事が原因でした。
上記の原因を踏まえてAD変換開始設定直後に、変換起動時間分の待機処理を追加する事としました。
AD変換起動時間は、今回のケースではfCLK/8でした。
fCLK(CPU/周辺ハードウェア・クロック周波数)を元に計算すると、
7クロック分待機する必要があります。
具体的には下図の通りです。
上記の対処により、AD変換が完了した後にAD変換結果格納レジスタの値を取得できるようになり、 取得したいチャンネルの値を正しく取得できるようになりました。
今回作成したAD変換のレジスタの設定値自体は、正しかったのですが、
必要な待機処理を入れなかった事により、処理が正しく行われず、バグが発生しました。
作成時には各レジスタの設定値や仕様についてまとめたページをよく確認していました。
一方で、別の章のページに記載されていた機能全体に関わる仕様や、 細かい注意事項については
確認が不十分であったと思います。
今回の件を踏まえて、マイコンマニュアルの各機能の章の構成を把握し、
全体の仕様を見落とさない様に注意するようにしております。
今回はテスト工程の段階で発見できたため、大事には至りませんでした。
このバグが納品後に判明した場合は、会社の信用に関わる重大な問題となる所でした。
バグは一度発生させてしまうと、該当部分のソースコードの修正だけでなく、 各種設計書の修正や、
類似箇所の調査、お客様との会議といった様々な 追加作業が発生してしまいます。
それにより、大きな負荷が発生し、後戻りの工数が増えてしまいます。
今回紹介した内容を参考に、今この記事をご覧になっている方が バグの発生を
未然に防ぐ事の一助になりましたら、幸いです。
関連記事
-
第1回 ラズパイを使用したBLE通信 ~ ディスプレイ、キーボード、マウスを接続しないで設定 前編 ~
こんにちは、GTです。よろしくお願いします。 最近業務でラズパイのBluetooth機能を使...
公開日:2021.12.24 更新日:2021.12.24
tag : Bluetooth Raspberry Pi
-
-
第1回 Visual C++で作成したDLL内のクラスをC#で利用する方法
こんにちは、ILCです。 Visual C++ (以下 VC++)で作成されたDynamic...
公開日:2024.01.19 更新日:2024.01.19
tag : Windows
-
-
こんにちは、TMIHです。 今回から組み込み系のソフトウェア設計標準規格である、MISRA-...
公開日:2022.02.25 更新日:2022.02.25
-
第3回 ラズパイを使用したBLE通信 ~ A/D変換・D/A変換を用いた入出力編 ~
こんにちは、GTです。よろしくお願いします。 第3回の今回は、ラズパイの入出力についてご紹介...
公開日:2023.02.24 更新日:2023.02.24
tag : Bluetooth BLE Raspberry Pi