Timer ile zaman ölçme

Başlatan muste, 21 Ocak 2015, 12:23:23

muste

Arkadaşlar merhaba ben timer ile zaman ölçmeye çalışıyorum fakat birtürlü başaramadım. RB0 pinine bağladığım butona bastığım zaman timer saymaya başlıyacak birdaha ki bastığımda duracak. Bu aradaki zamanı ölçmek istiyorum yazdığım kodlar aşağıda fakat anlamsız şeyler görüyorum. Nerede yanlış yapıyorum acaba ?
Linkte proje dosyası bulunmaktadır. Şimdiden teşekkürler.

http://www.4shared.com/rar/ZmlonCWZba/Desktop.html

Gökhan BEKEN

Bu kodda mantık hatası var:
    if(INT0IF)
    {
        LED2=~LED2;
        durum++;
        if(durum==1)
        {
            kontrol1=1;
        }
        if(durum==2);
        {
            kontrol1=1;
            kontrol=1;
            durum=0;
        }

        INT0IF=0;
    }


if(durum==2); demişsiniz böyle yaparsanız aşağıdaki koda şart gerçekleşse de gerçekleşmese de girer:
        {
            kontrol1=1;
            kontrol=1;
            durum=0;
        }



şöyle yaparsanız daha mantıklı:
    if(INT0IF)
    {
        LED2=~LED2;
        durum^=1; // 1 ise 0 yap, 0 ise 1 yap (TOGGLE islemi)
        if(!durum)
        {
            kontrol1=1;
        }
        else
        {
            kontrol1=1;
            kontrol=1;
        }

        INT0IF=0;
    }



Bu kısmı neden böyle yaptınız?
            zaman=(i*250)+TMR0;


bu kısımda da sıkıntı var,  %d yerine %lu kullanın, çünkü sizin değişkeniniz işaretli değil, unsigned bir değişken.
            sprintf(data,"Z:%d uS",zaman);

unsigned long i = 0,zaman=0; değişkenini unsigned long yapın ve aşağıdaki kısmı yukarıdakinin yerine yazın:
sprintf(data,"Z:%lu uS",zaman);


şimdilik bu kadar, siz bu sorunları düzeltin, diğer sorunları halledemezseniz bakarız sonra diğer sorunlara.
Özel mesaj okumuyorum, lütfen göndermeyin.

Emin Aydın EROĞLU

meftun hocam cevabın için teşekkürler. Dediklerin üzerine bazı değişiklikler yaptım. Fakat ölçülen zamanda bir yanlışlık var.
İnt kesmesi için durum bu şekilde;

if(INT0IF)
    {
        durum^=1;
        if(!durum)
        {
            TMR0=5;
            T0CONbits.TMR0ON = 1;
            kontrol=1;
        }
        else
        {
            T0CONbits.TMR0ON = 0;
            kontrol1=1;
        }
        INT0IF=0;
    }

Timer0 Kesnesi şu şekilde;

   if(TMR0IF)
    {
        TMR0 = 5;
        i++;
        if(i==100)
        {
            j++;
            i=0;
        }
        TMR0IF=0;
    }

zaman hesabım ise;

zaman=(((j*250*2*100)+(i*250*2)+(TMR0L-5))*2);

Burada ki mantığımda şu: timer prescaler bölmesi 1:2 ve Tmr0 a her seferinde 5 yükleyerek 250 de bir kesme oluşsun ve her 100 kesmede birde j değerini artırıyorum. Buna göre bu hesabı yapıyorum. Smilasyonda 50Hz lik kare dalga uyguluyorum ver 36484 çıkıyor. Hesapta mı hata yapıyorum acaba ?

sprintf(data,"Z:%lu uS",zaman); Burayıda düzelttim bu arada

Gökhan BEKEN

Ölçme hassasiyeti ne kadar olacak? 1us mi?
100us mi? Bu önemli.
Maksat butona basma süresi ise, 100ms yeterli.
Burda önemli olan, ölçme hassasiyetine göre timer kurmalıyız. 100ms yeterli ise 100ms'de bir kesmeye giren Timer yeterli olur.
Timer'e her girdiğinde bir sayacı 1 ekleyip,
LCD'de gösterilirken ise, (sayac*100) milisaniye olarak gösterilir.
Akşam müsait olursam bakarım evde.
Özel mesaj okumuyorum, lütfen göndermeyin.

Emin Aydın EROĞLU

Hocam benim hassasiyetim 50uS haklısınız ben ona göre kurayım tekrar deniyeyim akşama haberleşiriz. Kolay gelsin.