Ynt: Timer daki bölme oranları

Başlatan merve damar, 11 Mart 2019, 09:37:22

merve damar

Öncelikle yazım kurallarına dikkat ediniz.
@mehmet

Merhaba.
Çalışmamda 120usde bir olayların 40 defa tekrarlanmasını istiyorum.
30.usde kontrol yapmak istiyorum.
Bu durumu timer ile nasıl yapabilirim? 
Bilgisi olan var mı acaba?
İyi çalışmalar.

ziyaretci

#1
Çalıştığınız frekans ya da ilgili timer için kullanacağınız clock kaynağınızın frekansı hakkında bilgi vermeniz gerekiyor.

ankyra

@erkantr67 hocam. Siz bi örnekle açıklayabişir misiniz? Hepimiz faydalansak? Mesela 20 Mhz işlemci için?

mehmet

Olan olmuştur,
olacak olan da olmuştur.
Olacak bir şey yoktur.
---------------------------------------------
http://www.mehmetbilgi.net.tr

ziyaretci

#4
@ankyra tabiki.

Öncelikle 20 MHz'de çalıştığımızı biliyoruz artık.

Örneğin daha bilinmesi gerekenler için timer0 kullanılacak bilgisini biliyoruz diyelim. Çünkü timer0 8 bit , timer1 16 bit. Tabi aslında PIC modelinide bilmemiz lazım. Çünkü timer0'ın üst modellerde 16bit seçeneğide var. ;)

Timer modülü işlemci frekansınızın 1/4'ünü kullanır.

Yani 1/4'ü için timer artı 1 değeri için 1/(5*10^6) saniye süre geçer. Tabi bölme oranını 1 olarak kabul ediyorum.

Bölme oranımız 1 dedik.

Öncelikle 10us'lik kesme ayarlarsak, her kesmede de bir sayaç değişkenini +1 yaparsam, sayaç değişkeni 3 olduğunda kontrol izin bitini set ederim. 4 tane sayaç değişkeni 3 oladuğunda ise tekrarlanacak şeyler bloğunu aktif etmek için bir izin biti daha ayarlarım.

10us için set değerimiz, (10^-5)/(2*10^-7)=50 olur. Timer0 sayacı yukarı saydığından 255-50=205 değeri bizim set değerimiz olur.


Algoritmamız bu şekilde olur. Şimdi kod yazalım.

#int_timer0
Void timer0_kesme()
{
  Set_timer0(205);
  sayac++;
  if(sayac<3)
     Sayac++;
  Else
  {
     Sayac=0;
     Kontrol_biti=1;
     if(sayac2<4)
        Sayac2++;
     Else
     {
        Sayac2=0;
        Tekrar_islemler_biti=1;
     }
     
  }
}

Void main()
{
   Setup_timer0(RTCC_internal | /*BÖLME ORANI(tanımı ezberimde yok)*/);
   Set_timer0(205);
   Enable_interrupts(int_timer0);
   Enable_interrupts(global);

   For(;;)
   {
      if(kontrol_biti)
      {
         Kontrol_biti=0;
         //İşlemleriniz
      }
      if(tekrar_islemler_biti)
      {
          Tekrar_islemler_biti=0;
          //işlemleriniz
      }
   }
}


Ara ara bu tür uygulamalar hakkında basit kodlar ve açıklamalarını web sitemde paylaşıyorum. Bağlantıya imzamdan ya da profilimden ulaşabilirsiniz.

Umarım faydalı olmuştur. Kafanızda soru işareti varsa iletişim kanallarımdan iletebilirsiniz. Bilgim kadarıyla yardımcı olamaya çalışırım.

Yalnız yaptıracağınız işlerin kontrol periyodunu aşmamaya dikkat edin. İstenmeyen sonuçlarla karşılaşabilirsiniz.

##Telefondan yazdığımdan ötürü ufak tefek karakter hataları olabilir. Artı karakterleri bende boş gözüküyor, umarım sizde doğru gözükür.