2016-03-28 28 views
1

私はArduinoプログラミングには新しく、高解像度タイマーとしてarduino unoを使用しようとしています。私は、2つの立ち上がりエッジ割り込みの間で、フル16MHzレートでクロックサイクルをカウントできるようにしたいと考えています。私は4マイクロ秒の解像度を持つmicros()関数を使用して機能するいくつかのコードを持って、私はそれより良い必要があります。ここで私はタイミングのために)(ミクロスを使用しようとしていますサンプルコードは次のとおりです。割り込み間のクロックサイクル数をカウントするArduino TCNT1?

volatile int k = 0; 
volatile float t1 = 0; 
volatile float t2 = 0; 

void setup() { 
    // put your setup code here, to run once: 
    Serial.begin(9600); 
    attachInterrupt(digitalPinToInterrupt(2), ISR1, RISING); 
    attachInterrupt(digitalPinToInterrupt(3), ISR2, RISING); 
} 

void ISR2() 
{ 
    k = 1; 
    t1 = micros(); 
    Serial.println(1); 
} 

void ISR1() 
{ 
    k = 2; 
    t2 = micros(); 
    Serial.println(2); 
} 

void loop() 
{ 
    if (t1 != 0 && t2 != 0) { 
    if (t2 - t1 < 0) { 
     t1 = 0; 
     t2 = 0; 
    } 
    else { 
     Serial.print("tdelta "); 
     Serial.print(t2 - t1); 
     t1 = 0; 
     t2 = 0; 
     Serial.println(0); 
    } 

    } 
} 

私は私のミクロスタイミングはおそらく問題になることがあり、割り込みによってビットオフセットを、取得していることを実現します。

誰でも正しい方向に向けることができますか?

私はtimer1を使用したいと思います。なぜなら、それは16ビットであり、イベントはオーバーフローが発生する前に完了するのに十分速くなければならないからです。最初の割り込みでtcnt1を0に設定し、2回目の割り込みまでtcnt1クロックサイクルをカウントする簡単な方法を見つけることを望んでいます。私は本当にtcnt1からの値を読む方法を知らないので、行く方法があります。

私は例を検索しましたが、実際に適切と思われるものは見つかりませんでした。すべて私はかなり後になっているとは思わないタイマーの割り込みに合わせているようです。

私はおそらくこのtcnt1カウンタを使用するために必要な理解が不足していますが、正しい方向に私を指す助けがあれば幸いです!

ありがとうございました

答えて

2

タイマーレジスタを直接操作することができます。特定のボードで使用されているCPUのマニュアルを見てください。メガにはATmega2560-16AUです。タイマレジスタの名前はTCNT1です。他にあなたが時間データは失われます、セットアッププリスケーラ値TCCR1B.CSnに必ず、タイマオーバフロー割り込みを処理

int t1;// declare global variable somewhere 
t1 = TCNT1; //save timer value in ISRx interrupts 

:あなたがここに< 1米の here精度を読み取ることができたよう ISR(TIMER1_OVF_vect)

をすることができますが、その値を格納することができます到達する。 More info CPUタイマーレジスタを使用して直接操作する方法。

+0

情報をお寄せいただきありがとうございます!まさに私が欠けていたもの!それは働いた。 – jtp

関連する問題