プロが教えるわが家の防犯対策術!

C言語による正確な時間を定めたウェイト(例えば100msのウェイト)の挿入方法を探しています。

C言語でのウェイトの挿入方法を調べたところ、for文等で挿入できるのはわかったのですが、時間の求め方までわかりませんでした。
時間の求め方で調べたところ、アセンブラなら命令のステート数とクロック周波数より求める方法を知りました。
ですがアセンブラでの方法ではなく、C言語での時間の計算方法を覚えたいと思います。

些細な事でもかまいませんので、ご回答頂ければと思います。
どうぞ宜しくお願いします。

A 回答 (12件中1~10件)

>そうはいっても、やはりタイマ割り込みがサンプルに入っていればそれを利用するのが手っ取り早いのですが・・・


確かにその通りなんですけど質問者さん次第ですね。
質問者さんが、今タイマ機能に挑戦する気があればですが、初めての人に割り込み機能は難易度高く見えますからね。
    • good
    • 0

そうはいっても、やはりタイマ割り込みがサンプルに入っていれ


ばそれを利用するのが手っ取り早いのですが・・・
ベタ待ちで計時するなら、十分な長い時間を費やすループを作っ
てストップウォッチで測るのがいいです。
LEDの明滅でループの開始と終了を確認できるようにしておけ
ば、目視計測できますよね。
計測誤差は0.5秒以下として、1分くらいの時間を計測すれば
誤差1%以下で測ることができますから、結果を見てループ回数
を調整すればいいだけです。
みみっちい時間を計時する時はオシロスコープでLEDの信号線
を読むことが多いですが、それほど厳密でないならこういうアバ
ウトな方法もよく使いますよ。
    • good
    • 0

>マイコン環境なら、CPUのタイマモジュールを使って10ms程度の定周期割り込みを作ってありませんか?


AKI-H8-USBですので、そのまま使っているとカーネルと言うかOSは走っていないと思います。ですのでタスクとかsleepとか使えません。>matyrcryさん。>lringollさん。
質問者さんが自分でOS入れていれば別ですが、質問者のhemuruさんの状況ではCPUループで回しても害が無いかと。
    • good
    • 0

マイコン環境なら、CPUのタイマモジュールを使って10ms程度


の定周期割り込みを作ってありませんか?
一定時間の待ち処理には、ベタ処理ループを回して時間を稼ぐ方法と、
スリープ、セマフォなどのカーネル制御によるタスク休眠があります。
カーネル制御の関数はタイムアウト時間を設定できるものが用意され
ているはずなので、休眠時に時間設定して、他所から起床コールを行
わなければ指定時間経過で起床します。
ベタ処理で経過時間を計測したいのであれば、タイマ割り込みで経過
時間をグローバル変数を使ってカウントし、下層のタスクでカウント
が整うまでの待ちループを作れば時間待ちになりますが、ベタの待ち
処理はそれ以下のタスクの時間資源を食いつぶすので注意が必要です。
    • good
    • 0

邪道な回答になるので,あくまで参考程度に.



私も0.1msec単位のループ制御をしたいと思っていたのですが,
sleepではどうやら(分解能は1msecですが)10msec程度の精度しかなく困っていました.
アッセンブラを用いた方法を見つけはしたのですが,アッセンブラの理解もなく,手詰まりになりかけました.

で,私が取った道は,
『ファンクションジェネレータ(信号発生器)とカウンタボードを組み合わせて時間の管理をする』
といった方法です.
プログラミングを専門とされている方からすると色々あるのでしょうが,機械系の学生なのでそんな方法を取らせていただきました.
現状,0.1msecならまったく問題なく処理できています.

この方法の利点は,アッセンブラなどを使わなくても簡単に高精度な時間管理が出来ることです.
しかし,FGとカウンタボードが無いとできないことと,あまり美しいものではないと思います.


少し的外れだったかもしれませんが,参考になれば.
    • good
    • 0
この回答へのお礼

今回の状況からしますと、ご回答頂いた内容のことまではできないのですが、
一つの方法として頭に留めておきたいと思います。

ご回答ありがとうございました。

お礼日時:2009/02/12 15:16

>数nsのウェイト


H8マイコンでは気にしなくて良いです。高速なマイコンやFPGAやCPLDで制御するなら気にしてほしいですが。SC1602では、それよりも長いウェイトが必要な制御がありますよ。

ともかく実際に使っている方のサイトが参考になると思います。
http://tokyo-ct.net/usr/kosaka/for_students/H8/A …
簡単に検索できるサイトですが、こういうのは参考にならないんでしょうか?
    • good
    • 0
この回答へのお礼

数nsのウェイトについては
ご回答読ませていただいた後解決する事ができました。

LCDの駆動については
最初の返信後自らも調べ、現在実際に動かしながら学習しているところです。
添付していただいたサイトも参考にさせて頂きたいと思います。

最初質問させて頂いた際、手元にあった本とLCD説明書ばかり読んでいた事と、本にあったプログラムで上手くいかなかった事からこのような内容になってしまいました。
今回学ばせていただいた事今後役立てていきたいと思います。

再度ご回答ありがとうございました。

お礼日時:2009/02/09 17:24

> 各信号間で数nsのウェイトが必要とあったので



AKI-H8/3048Fでは、最大でもクロック周波数が16MHzしかありません。
したがって、nop命令1つでも数十ns以上かかるので、数ns精度のウェイトを入れるのは無理です。

> 各信号間で

そもそもそれらの信号はソフトウェアで制御すべきものなのですか?
    • good
    • 0
この回答へのお礼

参考としてURLを添付させていただいたうちのLCD説明書に
各信号の制御がこの条件を満たすようにプログラミングしてください。
とあり、ソフトウェアでの制御が必要と思っていました。
数nsのウェイトについてですが
1サイクル62.5nsとあり不可能であることに
読んでいたにも関わらず質問していた事、申し訳有りませんでした。

再度ご回答ありがとうございました。

お礼日時:2009/02/09 16:59

処理系を特定しないのであれば、time関数を用いてウェイトをかけるしかありません。


なお、clock関数はCPU使用時間なので、実時間を計測するには不向きです。
    • good
    • 0
この回答へのお礼

たくさんのご回答ありがとうございます。
大変申し訳有りませんが、こちらのご回答にまとめさせて頂きます。

補足について
現在、AKI-H8-USBという開発キットを用いLCDの制御プログラムを製作しようとしていました。使用している環境としまして、
CPU:H8/3048
コンパイラ:GCC(関係あるかわかりませんが、PCのOSはXP使用)
LCD:SC1602BS*S
となっています。

ご回答の中に無駄に資源を使わないとありましたが、
LCDの説明書の書き込みタイミングのところにおいて、各信号間で数nsのウェイトが必要とあったので、C言語で正確なウェイトを持たせる方法を質問させて頂いたところでした。

H8/3048を使用しているので内蔵タイマについて調べてみようと思いますが、内蔵タイマについてもご回答いただけるようであれば幸いです。
補足においても足りない事がありましたら追記していきたいと思いますので宜しくお願いします。

AKI-H8-USB開発ボードキット
http://www.aki-den.jp/kit_manual/%83%7D%83C%83R% …
H8/3048ハードウェアマニュアル
http://www.mech.ibaraki.ac.jp/~masuzawa/j602093_ …
LCD説明書
http://www.oaks-ele.com/oaks_board/oaks16/data/l …

お礼日時:2009/02/09 14:47

>C言語でのウェイトの挿入方法を調べたところ、for文等で挿入できるのはわかったのですが、


今時のCPUではこの方法は推奨されませんと言うか出来ません。Z80マイコンレベルなら可ですが。

環境がgccならsleep()やusleep()でウェイトさせます。ただし、マルチプロセスで動いているので正確には時間を刻めません。
組み込み系マイコンなら内蔵タイマを利用して正確に時間をコントロールするのが一般的です。ともかく開発の環境が正確に分らないと答えようが無いですね。
    • good
    • 0

「CPU の処理時間」という貴重な資源を「なにもしない」ということに無駄に使ってはいけません. 使っている「C言語」によりますが, #2 に言われるように sleep系かタイマイベント系の API を使うのがきっと正しい. もちろん「厳密に正確なウェイト」は入らないけど, 今どきのプロセッサならそれはどんな方法を使っても同じこと. だいたい, キャッシュとかはいったらその時点でもう「正確なステート数」は無意味に近い.



参考URL:http://ja.wikipedia.org/wiki/%E3%83%93%E3%82%B8% …
    • good
    • 0

お探しのQ&Aが見つからない時は、教えて!gooで質問しましょう!