Timer 1 ile Zaman Farkı Bulma

Başlatan oguzmania, 08 Nisan 2008, 11:12:28

oguzmania

Selamlar aslında problemimi başka bir başlıkta dillendirmiştim ama CCS kullandığım için bu başlıkta tekrar belirmekte fayda görüyorum.

Problemimi anlatacak olursam; 16F877 kullanıyorum ve varsayalım A portunun 2 pin'ini giriş olarak kullanıyorum.Bu pin'ler A0 ve A1 olsun...
Benim yapmak istediğim; eğer A0'ın değeri Lojik 1 olursa PIC'in Timer 1'i başlatılsın ve A1'in Lojik 1 olduğu anda da saymakta olan sayıcının değerini bir değişkene atayayım.

Kendi ayarlamalarım için Timer 1'i şöye kalibre ettim;
Projem gereği 30 usn ile 30msn arasındaki zaman farklarını ölçmem gerekiyor.Yani Timer 1'in her 1 adımının (interrupt değil) 30 usn sürmesini istiyorum.Yani 1'den 1000'e kadar sayma yapmak istiyorum.Bu da 64536-65536 arasında sayma yapılması demek.

30 usn'yi sağlaması amacıyla T1OS1 ile T1OS0 arasına da 32,768 kHz'lik kristal bağlamayı düşünüyorum ve Timer 1 bölme oranını da 1 yapıyorum. (30 usn=1/32,768*1 (yaklaşık olarak eşit) )

Projem gereği 30 msn üzerinde zaman farkı yakalamam gibi bir durum söz konusu değil yani Timer1'in kesmeye gitmesi gibi bir durum söz konusu değil.

Yapmaya çalıştığım programa gelirsem;
#int_timer1 
void timer1_kesme() 
{ 
set_timer1(64536); 
} 
.
.
.
.
setup_timer_1(T1_EXTERNAL | T1_DIV_BY_1); 
set_timer1(64536);
.
enable_interrupts(int_timer1);
 enable_interrupts(GLOBAL);
.
.
.
if(input(pin_a0)) // 1.giriş lojik-1 olunca 
 { 
 enable_interrupts(int_timer1) (olabilir mi ya da ?); // Buraya ne yazmalıyım ki bu anda TMR1'i başlatmış olayım;
    
if (input(pin_a1)) // 2.giriş de lojik-1 olunca 
{ 
degisken1=65536-get_timer1(); // 2.giriş lojik-1 olunca kaydet 
.
.
.


Şu şekildeki durum için eksiklerim neler , nerelerde hata yapmış olabilirim yardımlarınızı bekliyorum...Programlamada yeni olduğumdan hiç bir şeyden de emin olamıyorum  :?

aliveli

timer 65 ms kadar sayabildiğinden işin kolay aslında
long degisken1;
setup_timer_1(T1_EXTERNAL | T1_DIV_BY_1); 
set_timer1(35536); 
. 
. 
. 
if(input(pin_a0)) // 1.giriş lojik-1 olunca 
 { set_timer1(35536); }
 
    
if (input(pin_a1)) // 2.giriş de lojik-1 olunca 
{ 
degisken1=(get_timer1()-35536)/30;} // 2.giriş lojik-1 olunca kaydet 
.

iyonosfer

ayrıntılı olarak süre hesaplarına bakmadım, ama şöyle birşeyler yapabilirsin

while(1) {
if(input(pin_a0)) // 1.giriş lojik-1 olunca
 {
set_timer1(64536);
sayac = 0;  // kesme rutinine bak
while(input(pin_a0));   // burada A0 sıfır olmasını beklemelisin
 }
   
if (input(pin_a1)) // 2.giriş de lojik-1 olunca
{
degisken1=(sayac * ful periyot) + (65536 - get_timer1()); // eğer sayac 0 dan farklı ise hesaba katman gerekiyor
while(input(pin_a1)); //PIN low olana kadar bekle 
}
...
...
....
}

eğer A0 1 olduğunda kurulan timer a1 bir olmadan dolarsa kesme oluşur, eğer kesme rutinini yazmazsan okadar süre boşa saymış olacağı gibi, tekrar kurmadığından 0 dan başlar doğru dürüst hesaplayamazsın. Benim önerim şöyle
#int_timer1
void timer1_kesme()
{
set_timer1(64536);  // kesme olduğunda tekrar aynı değere kur
sayac++;
}


Aceleyle yazdım yanlışlıklar olabilir, anlamadığın yer varsa sor
Blog Sayfam: www.teknobakis.com

oguzmania

Cevaplar için teşekkürler...

Proteus'ta ne kadar uğraştıysam da harici Timer 1 Clock kristaliyle uygulama yapamadım.
Bir de PIC kristaliyle uygulamaya çalışayım bakalım becerebilecek miyim?