1. Bu site çerez kullanmaktadır. Siteyi kullanmaya devam etmeniz halinde çerez kullanımı ile ilgili site koşullarını kabul etmiş sayılırsınız. Daha Fazlasını Öğren.
  2. Forum İllegal Uyarısı Forum kuralları gereği forumda video ve illagal paylaşım yapmak yasaktır.Program Arşivimizde ise kısıtlanmış sürüm yada dağıtımı serbest olan (trial - freeware) yazılımlar yayınlayınız..Aksi takdirde mesajlarınız silinecektir..

CCS-C ile PIC Programlama, PIC Timer Modülleri ve Kullanımı

Konusu 'Genel Elektronik' forumundadır ve guclusat tarafından 12 Kasım 2009 başlatılmıştır.

  1. guclusat
    Offline

    guclusat Tanınmış Üye Süper Moderatör

    Katılım:
    14 Haziran 2009
    Mesajlar:
    9.754
    Ödül Puanları:
    48
    Timer nedir? Ne işe yarar?
    Timer’lar kısaca, mikro denetleyiciler içerisinde bulunan donanımsal sayıcılardır denebilir. Bu sayıcılar belirli bir değere kadar sayarlar ve daha sonra başa dönerek saymaya devam ederler. Sayma işleminin her adımı belirli bir sürede yapılır. PIC’ler içerisinde modeline göre değişik sayıda timer donanımı bulunur. Kullandığınız denetleyicinin sahip olduğu timer donanımlarını öğrenmek için teknik dökümanını inceleyebilirsiniz.

    PIC Mikro Denetleyicilerinde bulunan Timer’lar
    Timer0: 0-255 arası sayar (8 Bit)
    Timer1: 0-65535 arası sayar (16 Bit)
    Timer2: 0-255 arası sayar (8 Bit), post scaler vardır. (ilerde açıklayacağım)
    Timer3: 0-65565 arası sayar (16 Bit)

    Watch Dog Timer: Program güvenliği için kullanılan bu timer ile ilgili ayrı bir yazı olacak.

    Timer4 ve Timer5 zamanlayıcılarına şimdilik girmiyoruz. Başlangıç seviyesi için yukarıdakileri öğrenmeniz yeterli olacaktır.

    Timer’lar kullanılmadan önce konfigüre edilmelidir. Örneğin 10ms lik bir süreye ihtiyacınız varsa ve bunu elde etmek için Timer0 kullanacaksanız, timer0 prescalar değerini ve clock sinyali kaynağını belirtmeniz gerekiyor. Bu noktada CCS-C Derleyicisinin PIC Wizard Bölümü yardımınıza koşuyor. PIC Wizard ile proje oluştururken yazdığınız saat frekansına göre timer’ların hangi süreleri hangi prescalar değeriyle elde edebileciğini görebilirsiniz. Aşağıdaki ekran görüntüsünü 20 Mhz kristal kullanımına ayarlayarak aldım. Dolayısıyla timer’lar da görülen süreler 20Mhz dahili clock sinyaline göre şekillendi.

    [​IMG]



    Timer modüllerinin (öreneğin Timer1) zamanlayıcı veya sayıcı modu olarak tanımlanan iki modda çalışabilme özellikleri vardır. Aradaki farkı anlamanız için bir örnek vereyim. Projemizde 250us hassas bir süreye ihtiyacımız olsun bu süreyi elde etmek için timer1 modülünü dahili clock kullanacak şekilde ayarlarız ve prescalar değerini de ayarlayarak gerekli süreyi timer1 ile elde ederiz. Bu şekildeki kullanıma zamanlayıcı modu deniyor. Bu modda her insturction süresinde timer değeri 1 artar.

    Yeri gelmişken Pic denetleyicilerinde 1 instructiun süresinin (1 komutu işleme süresi) Fosc/4 olduğunu da hatırlatalım. Örneğin 4.000.000 Hz (4Mhz) saat frekansında bir komut işlenme süresi 1 us’dir.

    Mademki timer her komut işletme süresinde bir artıyor ozaman ben timer ile farklı süreleri nasıl elde edeceğim diyenleriniz olmuştur mutlaka. İşte bu noktada prescaler dediğimiz çözünürlük ayarı devreye giriyor. Presecalar ile Fosc/4 süresini de belirli değerlere bölebildiğiniz için değişik süreler elde edebiliyorsunuz.

    Timer modülünün çalışması için gerekli clock sinyalinin harici PIN’den sağlandığı çalışma moduna ise sayıcı modu denir. Bu modda timer dışarıdan verilen sinyalin düşen veya yükselen kenarında sayma işlemini gerçekleştirecek şekilde ayarlanabilir.

    Timer’ların genel özellikleri

    Timer0
    Timer0 8 bit’lik zamanlayıcı/sayıcı’dır 0-255 arasında sayar
    Değeri kod içerisinden okunabilir ve yine kod içerisinden değer ataması yapılabilir.
    Yazılımla ayarlanabilen 3 Bit’lik prescalar değeri ile fosc/4 sinyali 2,4,8,16,32,64,128,256 olmak üzere 8 değere bölünebildiği için farklı süreler elde edilebilir. Timer0 ile WDT (Watch Dog Timer) aynı prescaları kullanır, yazılım ile prescalar wdt’ye veya timer0′a atanabilir. Prescalar WDT’ye atandığında fosc/4 sinyali bölünmeden kullanılır.
    Clock sinyali external veya internal olarak ayarlanabilir.
    Harici clock seçildiğinde sinyalin hangi kenarında (yükselen yada düşen) sayma işleminin yapılacağı ayarlanabilir.
    Timer0 sayma esnasında 0xff ( 255) değerinden 0×00 (Sıfır) değerine geçerken interrupt (kesme) oluşturabilir.
    PIC18XXX Serisinde Timer0 Farklılıkları
    Timer0 yazılımla açılıp kapatılabilir.
    8 Bit veya 16 Bit olarak çalışacak şekilde ayarlanabilir.
    Dedicated, yani kendine ait prescaları vardır dolayısıyla watchdog ile prescalar paylaşmaz.

    [​IMG]

    Kullandığınız kristal/dahili osilatör frekansına göre timer0 taşma (overflow) süresini şu şekilde hesaplayabilirsiniz (8 bit modu için)

    Taşma süresi = 256 x (1/(instruction time/prescalar) )

    Örneğin 20 Mhz kristal frekansı ve 1:16 presecalar değeri için timer0 değerinin 1 artması için gereken süre

    1/((20000000/4)/16) = 3,2us bulunur. Bu değerleri yukarıda verdiğim resimde görebilirsiniz. Dolayısıyla timer 0 dan 255 değerine ulaşıncaya kadar 256*3,2 = 819.2 us zaman geçer

    Timer1
    Timer1 16 Bitlik bir sayıcı / zamanlayıcıdır
    Değeri kod içerisinden atanabilir ve okunabilir
    Yazılım ile devre dışı bırakılabilir veya devreye alınabilir.
    0-65535arası (0×0000-0xFFFF) sayar ve 0xffff den 0′a geçerken interrupt (Kesme) oluşturabilir.
    Timer1 clock kaynağı olarak kristal seçilebilir. Kristal PIC’in T1OSO ve T1OSI pinleri arasına bağlanır. Örneğin gerçek zaman saati olan bir uygulama yapmak için 32.768 Khz lik kristal bu pinlere bağlanabilir.
    2 bitlik prescaler değeri ile fosc/4 sinyali 1,2,4,8 degerlerinden istenilene bölünebilir. Böylece farklı süreler oluşturulur.

    [​IMG]

    20Mhz kristal frekansına ve 1:4 prescaler değerine göre timer1′in 0 dan 65535 (0×0000-0xFFFF) değerine gelmesi için gereken süre şu şekilde hesaplanabilir.

    Taşma Süresi = 65536 * (1/((20.000.000/4)/4) = 0.0524288 Saniye = 52.4288 mili saniye. (İlk başta verdiğim resimde görülmektedir)

    Timer2
    8 Bit zamanlayıcıdır. Harici clock seçimi yoktur
    Timer2 8 bitlik periyod registerine sahiptir. Bu register sayesinde timer 2 nin sayma aralığı ayarlanabilir. Örneğin bu registere 100 değeri verilirse timer2 0-100 arası taşar.
    2 bitlik prescaler ile fosc/4 sinyali 1,4,16 değerlerine bölünebilir.
    Timer2 4 bit postscaler değerine sahiptir. Bu post scalar ile kesme oluşturma periyodu 1-16 arasında bir değere ayarlanabilir.
    Timer2 yazılım ile devre dışı bırakılabilir veya devreye alınabilir.
    Daha iyi anlaşılması için ilk başta verdiğimiz resimdeki timer2 ayarlamasına bir göz atalım. Resimde de görülebileceği gibi prescaler değeri 1:4 olarak ayarlanmış dolayısıyla timer2 her arttığında 0.8us süre geçer. Periyod registeri ise 99 değerine ayarlanmış yani timer 0-99 arası (100 adım) sayacak. Dolayısıyla toplam süre 100*0.8us = 80us yani her 80us de timer taşmış olacak. Postscaler ayarı ise resimde görüldüğü gibi 3 olarak ayarlanmış (Interrupt Period). Buraya kadar anlattıklarımızı birleştirirsek ortaya şu çıkar; Timer2 0-100 arasında sayacak ve her 3 taşmada bir kesme (interrupt) oluşturulacak buda her 240us de bir kesme oluşturulacağı manasına gelir.

    [​IMG]

    Timer2 modülü yaygın olarak PWM (Puls Width Modulation - Darbe Genişlik Modülasyonu) uygulamalarında kullanılır.

    Timer3
    Timer3 8/16 Bit zamanlayıcı/sayıcı’dır.
    Maksimum değerden 0 değerine taştığında kesme oluşturur.
    Harici veya dahili clock seçilebilir.
    2 bit prescaler ile fosc/4 sinyali 1,2,4,8 değerlerine bölünebilir.

    [​IMG]

    Timer3 taşma süresi de aynı timer1 de olduğu gibi hesaplanır.
     

Sayfayı Paylaş