デバッグ
簡単に言えば、誤りを取り除くこと。
完璧な人がいない限り、どんなプログラム、回路も問題、ミスはつき物。
そこで、デバッグという作業が必要になる。
でも、デバッグって実はとても難しい作業。
回路が動かない、そんな人のためのページです。
デバッグの基本
デバッグは問題を探すことから始まる。
例えば、LEDが点灯しないという問題が見つかったとしても、原因はいくらでも考えられる。
1、マイコンの発振器が動いていない
2、マイコンに電源が供給されていない
3、LEDの向きが間違っている
4、点灯させる場所を間違えている
5、そもそも対応していない
6、電源の容量が足りない
7、リセットがかかり続けている
8、マイコンが壊れている
9、回路が壊れている
10、書き込むプログラムが間違っている
11、プログラムによる設定を間違えている
12、マイコンが違う
13、ノイズの影響を受けている
14、LEDの保護抵抗が大きすぎて光っていないように見えるだけ
15、LEDが死んだ
いくらでもある。
んで、製作者が予想できるときぐらいしか、すぐにわかるわけなんてない。
デバッグはプログラムのみに関する作業だけど、実際は回路の問題なのかプログラムの問題なのか判断ができない。
だからここではデバッグを回路全体の修正として考えることにする。
では、デバッグはどうやってするのか。
しらみつぶししかないです。
大事なことなので、何度でも読み直してください。
でも、少しでもデバッグが楽になる方法、あります。
それをここで紹介していきたいと思う。
デバッグしてみる
実際にやれば写真とかあげるんだけど、その環境がないので全部記述していくしかない。
基本的には、簡単にできることから。
その中でも簡単なのはプログラムの変更。書き換えて書き込むだけ。
先ほどの例である、LEDが点灯しない場合のデバッグを考えてみる。
まずは起動時にLEDの点灯パターンをやってみる。
main(){
init();//ポート設定をここでやる
int i;
for(i=0;i<=10;i++){
LED1!=LED1;
Delay();
}
.....//実行内容
}
ここでいきなりinit()とかDelay()とか出てきちゃってるけど、要するにmain関数内で実行するよりも綺麗に書きたいため。
関数は便利なんで使えるようにしておきましょう。
LED1も同様。#defineを効率的に使うべき。
これでプログラムを実行してLEDが点滅した場合は、プログラムが正しく動作しているためいろいろな可能性が削れるわけだ。
問題はLEDが点滅しなかった場合。
まずは端子の電圧を測ってみることが重要。
マイコンの電源、出力端子の電圧を見てみよう。
原因がわかったとき
実はこれが一番重要.
起きた問題とその理由は必ずメモしておく.
メモしておくことにより,次に問題が起きた場合に解決方法が分かる可能性がある.
メモの例(実際に起きた事例)
ANSELの初期値は1
TXとRXの接続
Spi_Init()内部にピン設定
AC100Vに針金がショート
ダーリントントランジスタの誤動作
トランジスタの向き
電源入ってない
プリントみすった
シュミットトリガ入力は3Vでは反応しない
普通の入力はよくわからない
ポートAは初期がアナログだと何度・・・
プロポ受信機は2.5V出力?
=!と!=
&と&=
レジスタの1ビット変換の連続はミスの原因
AN4=RA5(PIC16F877A)
A/D変換のch変更後は充電時間が必要
AN5=RB8,AN6=RB7(PIC16F88)
PWM機能の、CCPR1LのCCPR1Hへのコピーはコンペアマッチクリア時
51=0x33!=0x51
A<<2ではなく、A=A<<2
8bitで正負を有効にすると、128以上は0より小さい
リレーにダイオードを忘れるとPICはリセットするかも
回路のデバッグ
デバッグとは言わないけど。
マイコンなどを使う回路にとって、半導体素子はつき物。
動作確認するときには2chのオシロスコープがないと大変。
でも、ちゃんと動作をわかっていれば、だいたいテスタがあればチェックできる。
次の回路について考えてみよう。
確かに単純な計算ではこの回路の電流は計算できない。
そこで、次のことを頭に入れておく。
1、抵抗と電流の積は電源電圧より小さい(昇圧回路を除く)
2、どの半導体素子があっても、電流の和は等しくなる。
3、ダイオードは電圧のみに影響する。
ダイオードが入っているかもしれないが、電圧Eと電流Iの関係は絶対に、
E>RI
を満たしていることになる。
次にダイオードの特性。
こいつは抵抗ではなく負電源として考える。
ただし、グランド電位に対して負が発生することは無い。
つまり計算式は、
E-Vf=IR
Iの式に直すと、
I=(E-Vf)/R
ただしE>Vf
I=0
ただしE<Vf
となるわけだ。
すこし面倒かもしれないが、このような計算が出来ると、簡単にテスタで動作確認ができるようになる。
最終更新:2011年05月13日 16:26