なぜだ!?ディレーできない謎

NO IMAGE

これはBoostCでのお話。BoostCを使って、PICマイコンでタイマーを作ったときのこと。
delay_msというミリ秒のディレーをする関数があって、それを使っていたのだけれど、設定時間によっては全くと言っていいほどディレーをしないという現象があり、首をかしげていた。

で、改めてネットで調べてみたら、しっかり解説しているWiki(だったかな?)があり、そこにはdelay_msの値を設定する箇所はunsinged char型となっているから、255までの数しか使えないと記載されていました。8ビットマイコンなので、255しか扱えないのは仕方がないことなのですね。
それに気付かなかったので、かなーりはまってしまいました。てっきり、1~999まで設定が可能なのだと思い込んでいたのです。確かに期待通りの動作をしないわけだ。(^o^;)

実際にどのようにすればいいか500ミリ秒ディレーするタイマーを作って考えてみましょう。
set_timeというint型の変数に既に500という数値が入っているとすると…

(誤)delay_ms(set_time);

(正)for(i=0;i<(set_time/100);i++){ delay_ms(100); } //100ミリ秒のディレーを5回繰り返す 例の場合は、500ミリ秒と分かっているので、i<(set_time/100)としないで、i<6としてもOK。 ということで、BoostCのディレー関数で設定できる時間は下記の通りになります。 ・delay_us(unsigned char t)→1~255マイクロ秒 ・delay_100us(unsigned char t)→100~25500マイクロ秒(0.1ミリ秒~25.5ミリ秒) ・delay_ms(unsigned char t)→1~255ミリ秒 ・delay_s(unsigned char t)→1~255秒 うーん。16ビットマイコンなら、もしかするとこれらの時間関数は使いやすいのかも…。まぁ、ちょっとしたことなら8ビットのPICマイコンで十分できてしまうので、16ビットマイコンなんぞ安い物でも出ない限りは使う機会はないかもね。