2016-11-06 6 views
0

私はプロジェクトに取り掛かりました.Arduinoライブラリを使用することを防ぐために、余分な "Junk"が付属しており、コアAVRライブラリほど高速ではないため、使用しないようにしています。AVR Micros and Millis

私の質問は、Arduinoのmillis()およびmicros()関数に相当するAVRライブラリがある場合、または自分のライブラリを作成する必要がある場合です。

私はタイマーとISRを使って値を増やしてダニを追跡することができますが、必要がなければホイールを再作成する理由を理解しています。

答えて

2

私の質問は、Arduinoのmillis()およびmicros()関数に相当するAVRライブラリがある場合、または自分のライブラリを作成する必要がある場合ですか?

(ご指摘のように)起動からの時間をカウントするタイマーISRにカスタムコードを持つタイマの構成と使用が必要になります、あなたはAVRライブラリにこのような機能を見つけることができませんので。
これらのライブラリは、特定の目的のためのタイマーとして一般的なリソースを狙ったものではありません。これは、Arduinoライブラリが簡単なスタートを提供する良い例ですが、libsが内部的に使用するリソース(カスタム用にtimer0を使用するなど)をより詳細に制御する必要があるとすぐに解消します。

+0

そうではありません.... ;-)すべてのタイマーは何かのために使用できるので意味がありますあなたが指摘したようなカスタム。私が持っている他の1つの質問は、ISRが基本的に常に発砲し、それを防止する方法があるので、残りのコードをブロックするために、タイマーのための非常に小さな解決策を得ようとしないでしょうか? –

+0

"非常に小さい解像度";を定義します)しかし、一般的には、実際に必要な解像度に解像度を制限するのが最善です。 ISRは、主な実行パスと潜在的に他の割り込み(割り込みの優先順位に応じて)をブロックします。これは、ISRができるだけ少ない命令を含むべき理由です。 10MHzでは、1マイクロ秒の実行速度で約10命令が得られます。だから1usの解像度のようなものを目指すことは非現実的だろう。 ISRが短く保たれている場合、10usタイマーインターバルは妥当に聞こえる。おそらく20〜30がISRに失われるかもしれない、タイマーティックごとに100の命令があります。 –

+0

注意が必要な他の割り込み(USART、TWIまたは他のタイマ)がある場合、私は100usを上回らず、やはり1msはいくらか安全です。 –

-1

millisおよびmicrosと同じ機能を提供するavr gccインストールに付属するutil/delays.hを使用できます 覚えておいていただきたいのは、パラメータF_CPUを正しいCPU周波数に設定することだけです。

+1

'avr/delay.h 'は' _delay_ms'と '_delay_us'を提供しますが、開始からmillisecondsまたはmicroseconds(' millis() 'や' micros() 'のように何もありません)。 – KIIV

+0

delay()(blocking)は、millis()(nonblocking)とは逆の機能です; – datafiddler

1

私のalibvrライブラリを見てください。

システムクロック部分は多かれ少なかれ終了しました。

コンパイル時に値を計算するためにC++の機能(主にテンプレート)を使用します。したがって、avr-g ++を使用する必要があります。

詳細については、clock Readmeを参照してください。

ライブラリを使用しない場合でも、clock.hファイルは独自のシステムクロックの作成に役立ちます。