現在使用しているフリーのコンパイラで、__delay_μs()
という単なる待ち時間の関数が使える。以前から使えたのか、
あるヴァージョンかから使えるようになったのかは、分から
ないが、前述の教科書のように自分で関数をつくらなくて
いいので便利だし、結構使う関数だと思う。
ただ、実際のところ、どのぐらい時間なのか、あれこれやって
いるプログラムで簡易的に測定してみた。
PICで
for(;;){
RA1=1;
__delay_us(1);
RA1=0;
__delay_us(1);
}
のプログラムを実行すると、矩形波が生成できるので、
__delay_us(1)と__delay_us(2)と赤の部分を変更して、両者
の差を見てみると、たぶん、実際の待ち時間が分かる。
Cの場合は、1命令の実行時間がわからないので、命令
の実行時間を相殺しないと、実待ち時間が分からないよう
に思う。
__delay_us(1)のオシロの画面で、Hの時間は、約40μs。
__delay_us(2)のオシロの画面で、Hの時間は、約56μs。
56-40で、__delay_us(1)の実時間は、16μsということになる。
約16倍の待ち時間である。ちなみに、__delay_us(3)にしてみると、
Hの時間が約72μsなので、16μsずつ増えている。
やはり、細かい制御をするには、命令のクロック数の分かって
いるアセンブラー。でも、アセンブラーは、私には、超難解。
Cが似合ってる。