2017-07-14 11 views
0

現在、私はcurie nano v2.0 arduinoボードをプログラミング中です。そして、私は250hzのレートで関数を呼び出す必要があります。それを行う1つの方法は、250hzの近似を得るために3または4ミリ秒の遅延を単純に入れます。Arduinoクロックイベント

4msごとにイベントを送信し、必要な機能やその他のスマートメソッドを実行するためにdelay()関数を使用せずにトリガーできるクロックイベントがありますか?

これを行う1つの方法は、常に時計をプローブして時間を尋ねるeventEmitterを作成することです。希望の時間枠が経過した場合は、イベントを送信します。しかし、私はこの方法が計算上重く、いつも時計を探ると思う。助けてもらえますか?

+0

下記の私の答えは、追加のライブラリが不要で、おそらくよりコンパクトなコードサイズです。 – TomServo

答えて

0

CurieTimerOneライブラリとその方法CurieTimerOne.start(int timerPeriodUsec, userCallBack)を使用できます。ここで

は、サンプルコードは次のとおりです。

#include "CurieTimerOne.h" 

bool ledState = false; 
#define LED_PIN 13 

// callback which toggles the LED 
void blinkProc() 
{ 
    digitalWrite(LED_PIN, ledState); 
    ledState = !ledState; // change state. 
} 

void setup() 
{ 
    pinMode(LED_PIN, OUTPUT); 
    // 4000us is 4ms or 250Hz. 
    CurieTimerOne.start(4000, blinkProc); 
} 

void loop() 
{ 
    // do other stuff. 
} 

タイマ(割り込み)を使用して良いものdelay()では不可能である、あなたが欲しいあなたの関数は、正確な周波数で呼び出されるということです。

Reference to CurieTimeOne libary at official Arduino website

0

あなたは非常に低いオーバーヘッドが発生し、すでにmillis()のために実行中のタイマー、割り込みを追加することができます。ここでは、4msのタイマが経過したときを除いて、あなたのコードが他のことをするための割り込みベースの例を示します。これには、追加のライブラリが必要なく、コードサイズが小さくなるという利点があります。これまでハードウェアレベルでのインタラクションを少しも紹介していないのであれば、それはハードウェアレベルでの割り込みの小さな紹介です。

volatile uint8_t reduce4 = 0;  // used to get 4 ms 
volatile uint8_t timerAlert = LOW; // flag that tells you 4ms is up 

void setup() { 
    pinMode(12, OUTPUT); // an output pin just for testing on my oscilloscope 
    OCR0A = 0xAF;   // set up interrupt 
    TIMSK0 |= _BV(OCIE0A); 
} 

SIGNAL(TIMER0_COMPA_vect) // interrupt handler 
{ 
    reduce4++; 
    if (reduce4 == 4) 
    { 
    timerAlert = HIGH; // only fire every 4th time 
    reduce4 = 0; 
    } 
} 

void loop() 
{ 
    if (timerAlert == HIGH) 
    { 
    digitalWrite(12, !digitalRead(12)); 
    // DO OTHER STUFF 
    timerAlert = LOW; 
    } 
} 
+0

このエラーが発生しました。 sketch_jul14b:4:エラー: '(' トークン SIGNAL(TIMER0_COMPA_vect)の前に期待されるコンストラクタ、デストラクタ、または型変換//割り込みハンドラ ^ 終了ステータス1 期待コンストラクタ、デストラクタ、または型変換の前には、 '(' トークン – user3630461

+0

@ user3630461私はちょうど編集し、実行スケッチから直接ペーストしました。 – TomServo