2016-03-28 11 views
1

Arduino programlamada ve arduino uno'yu yüksek çözünürlüklü bir zamanlayıcı olarak kullanmaya çalışıyorum. İki yükselen kenar kesmesi arasındaki saat döngüsünü 16MHz hızında sayabilmek istiyorum. 4 mikrosaniye çözünürlüğü olan micros() işlevini kullanarak işlevsel olan bazı kodlarım var ve bundan daha fazlasına ihtiyacım var. Benim mikroları muhtemelen bir sorun olabilir kesmeler, telafi biraz oluyor zamanlama olduğunu farkArduino TCNT1, kesmeler arasındaki saat döngülerini sayar mı?

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); 
    } 

    } 
} 

: İşte zamanlama için() Mikrolara kullanmaya çalışıyorum örnek kodudur.

Beni doğru yöne yönlendiren var mı?

Sanırım saat1'i kullanmak istiyorum çünkü 16 bit ve olaylarım herhangi bir taşma meydana gelmeden önce tamamlanacak kadar hızlı olmalı. İlk interrupt ile tcnt1'in 0 olması için basit bir yol bulmayı umuyorum ve daha sonra ikinci interrupt'a kadar tcnt1 saat döngüsünü sayıyorum. Gerçekten de tcnt1'deki değerleri nasıl okuyacağımı bile bilmiyorum, bu yüzden gitmem gereken bir yol var.

Örnek aradım ama uygun görmedim. Her şey, benim beklediğim şey olduğunu düşünmediğim zamanlayıcı kesintilerine doğru görünüyor.

Muhtemelen bu tcnt1 sayacını kullanmak için çok fazla ihtiyaç duyduğumu anlayamıyorum, fakat doğru yönde bana işaret edecek her türlü yardım büyük bir memnuniyetle karşılanacaktır! Sen zamanlayıcı ile çalışmak için deneyebilirsiniz

Teşekkür

cevap

2

doğrudan kaydeder. Belli bir tahtada kullanılan CPU'ya ait kılavuza bakın. Mega için ATmega2560-16AU. Zamanlayıcı kaydının adı TCNT1'dir. Başka zaman verileri kaybedersiniz,

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

kurulum kalibrasyon değeri TCCR1B.CSn emin olun ve zamanlayıcı taşma kesmeyi işlemek: Bunu değerini saklayabilir burada here hassas < 1 ABD okumak gibi ISR(TIMER1_OVF_vect)

can ulaşmak. CPU zamanlayıcıları ile doğrudan çalışmak için More info.

+0

Bilgi için bir demet teşekkürler! Tam olarak eksik olduğum şey! Çalıştı. – jtp